刚刚收到运行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)< / p>
请注意,如果我将清单更改为使用ACCESS_FINE_LOCATION,则上述代码在每台设备上都能正常运行。不幸的是,管理层目前不允许我更改权限。
我在SO上看过几个答案,建议在执行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独有的问题。
答案 0 :(得分:2)
嗯,您正在呼叫isProviderEnabled()
,因此至少应该覆盖这一点,并且应该启用使用网络位置。但是documentation的确切措辞是:
&#34;如果用户在“设置”菜单中启用了此提供程序,则为true 返回,否则返回false&#34;
所以它只是提供者正在启用&#34;因为没有被用户关闭。
有问题的手机(S7)内有SIM卡吗?在该特定设备上,基于网络的定位需要SIM卡或互联网连接。
参考documentation,您可以查看这些内容:
locationManager.getProvider(LocationManager.NETWORK_PROVIDER).requiresCell();
locationManager.getProvider(LocationManager.NETWORK_PROVIDER).requiresNetwork();
如果位置未知,当然只是调用getLastKnownLocation()
会返回null
。如果没有应用程序(您的或其他应用程序)专门请求设备确定其位置,那么它是未知的。因此,调用requestLocationUpdates()
的建议是正确的建议。但是确定位置可能需要一段时间,因此在调用getLastKnownLocation()
之后可能仍会返回null
。
即使它返回了某些内容,也可能是非常旧的数据甚至不再有效。那么为什么不只是subscribe to receive location updates?这就是它的意图。您正在使用基于网络的定位,因此它不会(完全/显着)影响功耗,如果您指定适合您需要的时间间隔和距离限制,则更新不会太频繁。
答案 1 :(得分:2)
根据我对三星设备的体验。如果您重新启动手机并且不启用GPS,则无法获得位置。如果您启用GPS作为某些点 - 也许通过运行Google地图,那么您将获得一个位置。除非在设备开机周期内获得位置,否则三星不会返回GPS,网络或被动提供商的位置。
我在代码中所做的任何调用都没有让它启动并激活并获取位置。它们在其他设备上运行良好。三星似乎也没有长时间缓存这些信息。