从一见钟情到GPS坐标看起来很简单(伪代码):
private void onStart() {
res = ActivityCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.ACCESS_FINE_LOCATION);
if (res != PackageManager.PERMISSION_GRANTED) {
requestPermissions();
} else {
startGps();
}
}
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
if (all_ok)
startGps();
}
private void startGps() {
LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
LocationListener locationListener = new LocationListener() {...};
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
}
但是如何处理异步事件:
如果locationManager.requestLocationUpdates
用户暂停并恢复申请后
1.1我应该致电locationManager.requestLocationUpdates
再次接收GPS数据吗?
1.2如果用户在我的应用程序暂停时禁用GPS,用户恢复我的应用程序后,我会收到onProviderDisabled
事件吗?
如果在locationManager.requestLocationUpdates
调用后发生ACCESS_FINE_LOCATION权限,如何处理运行时的撤销?撤销后发生了什么,android是通过onStatusChanged
还是onProviderDisabled
向我报告的?
我听说新的Android允许屏幕上有几个窗口, 如果一个窗口属于我的应用程序,另一个窗口属于“系统首选项”,并且用户撤销ACCESS_FINE_LOCATION而没有暂停/恢复我的应用程序会发生什么?
答案 0 :(得分:1)
1.1:暂停或停止应用时,最好停止收听GPS(onPause()和onStop())。这样可以节省电池寿命。所以在onResume()方法中再次启动监听器。
removeUpdates(LocationListener的)
如果您不想删除更新,则无需再次调用locationManager.requestLocationUpdates。
1.2:每当应用程序到达前台时,执行isProviderEnabled(provider)检查并向用户显示一个对话框。
回答你的问题:
https://developer.android.com/reference/android/location/LocationManager.html
如果用户禁用了提供程序,则更新将停止,并且将发送提供程序可用性更新。只要再次启用提供程序,就会立即恢复位置更新并发送提供程序可用性更新。提供商还可以随时向提供商发送特定的额外状态更新。如果提供了回调,那么状态和可用性更新是通过onProviderDisabled(String),onProviderEnabled(String)或onStatusChanged(String,int,Bundle)。
java.lang.SecurityException:提供商网络需要ACCESS_FINE_LOCATION或ACCESS_COARSE_LOCATION权限
如果设置已关闭位置,则不会通知第三方应用。您需要使用isProviderEnabled(provider)方法来检查位置状态。