ユーザーが許可を与えると、ユーザーの場所の追跡を開始するバックグラウンドサービスが作成されます。ユーザーが設定からアプリケーション許可を削除するとアプリケーションがクラッシュする
バックグラウンドサービスは、ユーザーがアプリケーションを破棄した後でも、ユーザーの場所を追跡し続けます。
しかし、ユーザーは、エラーメッセージ、次のアプリケーションの設定に行き、その後、サービスがクラッシュした場所のアクセス許可を削除して与えた場合、
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()));
}
EDIT:
これは私がアプリケーションの起動
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();
}
「場所の権限を削除しました」がアプリが動作しない場合は明らかです。 –