具有运行时权限的基于gps的应用程序架构

时间:2016-08-06 16:58:57

标签: android gps

从一见钟情到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);
}

但是如何处理异步事件:

  1. 如果locationManager.requestLocationUpdates用户暂停并恢复申请后

    ,该怎么办?

    1.1我应该致电locationManager.requestLocationUpdates再次接收GPS数据吗?

    1.2如果用户在我的应用程序暂停时禁用GPS,用户恢复我的应用程序后,我会收到onProviderDisabled事件吗?

  2. 如果在locationManager.requestLocationUpdates调用后发生ACCESS_FINE_LOCATION权限,如何处理运行时的撤销?撤销后发生了什么,android是通过onStatusChanged还是onProviderDisabled向我报告的?

  3. 我听说新的Android允许屏幕上有几个窗口, 如果一个窗口属于我的应用程序,另一个窗口属于“系统首选项”,并且用户撤销ACCESS_FINE_LOCATION而没有暂停/恢复我的应用程序会发生什么?

1 个答案:

答案 0 :(得分:1)

  1. 回答问题1
  2. 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)。

    1. 如果撤消权限,您的应用程序可能会崩溃。因为您无权访问位置功能。<​​/ li>

      java.lang.SecurityException:提供商网络需要ACCESS_FINE_LOCATION或ACCESS_COARSE_LOCATION权限

      1. 在多窗口设备中,一个聚焦的应用程序将处于恢复状态,其他应用程序将处于暂停状态。关于许可撤销,我已在第2点回答。
      2. 如果设置已关闭位置,则不会通知第三方应用。您需要使用isProviderEnabled(provider)方法来检查位置状态。