【发布时间】:2016-03-15 17:59:41
【问题描述】:
刚收到运行 Marshmallow (6.0.1) 的 Galaxy S7 (Edge),发现我的应用程序存在问题,该应用程序使用 android.permission.ACCESS_COARSE_LOCATION 并针对 Sdk 版本 22 (Lollipop)。当我调用locationManager.getLastKnownLocation() 时,它总是返回NULL。这是我正在运行的内容:
public Location getLastKnownLocationObject(Context context) {
LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
try {
if (locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
Location location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
// Location is always null on S7 (only)
Log.i(TAG, ">>> getLastKnownLocationObject() getLastKnownLocation: " + location);
return location;
}
} catch (Exception e) {
Log.e(TAG, ">>> getLastKnownLocationObject() exception", e);
}
return null;
}
同样的代码在我尝试过的所有其他设备上都能正常工作:Galaxy S5 (5.0.1)、Nexus 7 (5.0.1)、Nexus 9 (6.0.1) 和 Samsung Tab3 (4.4.2)
请注意,如果我将清单更改为使用 ACCESS_FINE_LOCATION,上述代码在每个设备上都可以正常工作。很遗憾,管理层目前不允许我更改权限。
在我在这里看到的一些答案中,建议在执行 getLastKnownLocation() 之前调用以下命令,但这没有任何效果。
locationManager.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER, 0, 0, new LocationListener() {
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
@Override
public void onLocationChanged(final Location location) {
// NEVER CALLED on Samsung S7 for LocationManager.NETWORK_PROVIDER
}
});
所以目前,我觉得这是新三星 Galaxy S7 独有的问题。
【问题讨论】:
-
自从 Marshmallow 引入运行时权限模型以来,您是否尝试过以编程方式请求权限?
-
我的应用程序目标是 22(棒棒糖)。 minSdkVersion 19 目标SdkVersion 22
-
您必须专门请求 Android Marshmallow 及更高版本的权限。检查我的这篇文章 - stackoverflow.com/questions/35856432/…
-
感谢 Shadab...您的帖子显示 GPS_PROVIDER,如果我将清单权限更改为 ACCESS_FINE_LOCATION,它可以很好地与我的代码一起使用并且无需请求权限(我的目标是 Lollipop)。
-
请改用 Fused Location Provider api,可用于 Google Play 服务框架。这可能会有所帮助。