java在Android中获得最后一个已知位置
在几次(失败的)尝试使我的应用程序符合对该位置的后台访问之后,我决定重新构造代码,以便从manifest
中删除ACCESS_BACKGROUND_LOCATION
权限
我的application
需要在特定时间获得设备的位置(特别是我需要坐标),我感兴趣的是知道:
如果不使用上述许可,我如何在前台获得设备的位置
是否可以在不使用服务等的情况下通过一次性通话来实现
我考虑过使用这个代码,你觉得它足够吗
LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
Location lastKnownLocation = locationManager.getLastKnownLocation(locationProvider);
mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
mFusedLocationClient.getLastLocation()
.addOnSuccessListener(this, new OnSuccessListener<Location>() {
@Override
public void onSuccess(Location location) {
if (location != null) {
// Logic to handle location object
}
}
});
或者像这样:
LocationManager mLocationManager = (LocationManager) context.getSystemService(LOCATION_SERVICE);
List<String> providers = mLocationManager.getProviders(true);
Location bestLocation = null;
for (String provider : providers) {
Location location = mLocationManager.getLastKnownLocation(provider);
if (location == null) {
continue;
}
if (bestLocation == null || location.getAccuracy() < bestLocation.getAccuracy()) {
bestLocation = location;
}
}
有更好的方法吗
# 1 楼答案
这是一个很好的Get the last known location文档
以及如何Access location in the background
三星商用设备有一个名为KNOX的功能,它的行为似乎与您看到的权限问题类似。一旦你知道它的确切来源,我就不在乎了。这种情况并没有广泛传播,在弹出消息的情况下,它的作用是有原因的:用户希望(或被其管理员强制)被告知某些操作,例如希望获取当前位置的应用程序
如果没有其他设备,可以在模拟器中检查应用程序的正常行为
所以大家的共识是,你不能在没有请求权限的情况下进行操作
# 2 楼答案
要获取最后知道的位置,您需要在清单文件中声明以下权限
然后,您可以像以前一样使用Fused Location Provider
现在,如果您想要定期更新,您可能需要使用以下回调来注册这些更新
与请求对象和回调一起传递以接收更新
带有精确代码的有用链接:Request Updates