如果用户从设置

时间:2017-02-06 05:53:38

标签: android android-layout android-fragments android-service android-permissions

如果用户授予权限,则会创建一个开始跟踪用户位置的后台服务。

即使在用户销毁应用程序之后,后台服务仍会跟踪用户位置。

但是,如果用户进入应用程序设置并删除位置权限,则服务崩溃并提供以下错误消息,

  

java.lang.SecurityException:客户端必须具有ACCESS_COARSE_LOCATION   或ACCESS_FINE_LOCATION权限以执行任何位置操作。

该服务每10秒运行一次,请指导我如何在运行服务中检查它是否具有权限,因为每10秒后它运行服务并调用onLocationChanged方法。

public class UpdateService extends Service implements
        LocationListener,
        GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener {


     @Override
    public void onCreate() {
        super.onCreate();

        if (isGooglePlayServicesAvailable()) {
            mGoogleApiClient = new GoogleApiClient.Builder(this)
                    .addApi(LocationServices.API)
                    .addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this)
                    .build();

            mGoogleApiClient.connect();
        }
    }



    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i(TAG, "onStartCommand: ");
        mLocationRequest = new LocationRequest();
        mLocationRequest.setInterval(10000);
        mLocationRequest.setFastestInterval(10000);
        mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);

        super.onStartCommand(intent, flags, startId);
        return START_STICKY ;
    }                        


 @Override
    public void onLocationChanged(Location location) {

    saveLocationand(String.valueOf(location.getLatitude()), String.valueOf(location.getLongitude()));

}         

编辑:

这是我在应用程序启动中检查权限的方式

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        int permissionCheck = ContextCompat.checkSelfPermission(MainActivity.this,
                android.Manifest.permission.ACCESS_FINE_LOCATION);
        if (permissionCheck == PackageManager.PERMISSION_GRANTED) {
            if (!mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
                showGPSDisabledAlertToUser();
            }
            startService(new Intent(MainActivity.this, UpdateService.class));
        } else
            checkLocationPermission();
    }       

2 个答案:

答案 0 :(得分:2)

使用Google设置的API验证是否已启用位置权限。

Settings API docmentation

您还可以使用以下代码检查应用是否具有必要的权限。

String permission = "**permission**";
int res = getContext().checkCallingOrSelfPermission(permission);
return (res == PackageManager.PERMISSION_GRANTED); 

答案 1 :(得分:1)

这是因为Location权限被标记为Dangerous权限,因此需要运行时权限。

您可以在此处查看我的答案,了解如何检查是否启用了位置权限,然后继续。

What is the difference between shouldShowRequestPermissionRationale and requestPermissions?

了解更多信息

https://developer.android.com/training/permissions/requesting.html

以下是我在项目中使用的代码:

private void startLocationUpdates() {

    if (!(mHasLocationPermission && mHasLocationSettings)) {
        return;
    }
    try {
        LocationServices.FusedLocationApi.requestLocationUpdates(
                mGoogleApiClient,
                mLocationRequest,
                this
        );
    } catch (SecurityException e) {
        e.printStackTrace();
    }
}

您可以检查是否仍然启用了这些权限和位置设置。