如果用户授予权限,则会创建一个开始跟踪用户位置的后台服务。
即使在用户销毁应用程序之后,后台服务仍会跟踪用户位置。
但是,如果用户进入应用程序设置并删除位置权限,则服务崩溃并提供以下错误消息,
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();
}
答案 0 :(得分:2)
使用Google设置的API验证是否已启用位置权限。
您还可以使用以下代码检查应用是否具有必要的权限。
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();
}
}
您可以检查是否仍然启用了这些权限和位置设置。