-2

ユーザーが許可を与えると、ユーザーの場所の追跡を開始するバックグラウンドサービスが作成されます。ユーザーが設定からアプリケーション許可を削除するとアプリケーションがクラッシュする

バックグラウンドサービスは、ユーザーがアプリケーションを破棄した後でも、ユーザーの場所を追跡し続けます。

しかし、ユーザーは、エラーメッセージ、次のアプリケーションの設定に行き、その後、サービスがクラッシュした場所のアクセス許可を削除して与えた場合、

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(); 
    }  
+0

「場所の権限を削除しました」がアプリが動作しない場合は明らかです。 –

答えて

1

Location許可がDangerous権限としてフラグ付けされているため、これがあるので、それは実行時の権限が必要にパーミッションをチェックする方法です。

場所の権限が有効かどうかを確認する方法について私の答えを確認し、続行することができます。ここで

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

でより

What is the difference between shouldShowRequestPermissionRationale and requestPermissions?

読む私は私のプロジェクトで使用していたコードです:あなたはまだこれらのアクセス許可を持っている場合

private void startLocationUpdates() { 

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

かを確認することができますし、場所の設定を有効または無効にします。

+0

答えをありがとう、私はあなたのポイントを理解しています。しかし、これを実行中のサービスでどのようにチェックすることができますか?サービスが実行されているときに、ユーザーが10秒後にユーザーの所在地を取得し、その間にユーザーが場所のアクセス権を削除し、そのことを知らず、再度locationUpdate()メソッドをヒットして、それがクラッシュすると – Kirmani88

+0

が修正を確認します –

1

Google設定のAPIを使用して、場所の権限が有効かどうかを確認します。

Settings API docmentation

また、アプリが必要な権限を持っているかどうかを確認するために、コードの下に使用することができます。

+0

実行中のサービスで確認できます – Kirmani88

+0

アプリが起動するたびにこれをチェックする必要があります。 SettingsApiのドキュメントを確認してください。 –

+0

ユーザーがアプリケーションを起動する前にサービスがクラッシュしました。たとえば、ユーザーが最初にアプリケーションをインストールし、Location権限を与え、バックグラウンドサービスが開始され、ユーザーがアプリケーションを閉じて設定に行き、このアプリケーションのLocation権限を削除したとします。バックグラウンドサービスは即座にクラッシュします。 – Kirmani88

関連する問題