起動時に起動し、場所の更新の確認を開始するサービスを使用しています。 Android Mのおかげで、許可ポップアップでロケーションアクセスを拒否すると、電話が起動するとサービスがクラッシュします。
この場合、アクティビティがないので、requestPermissions()
への呼び出しは、サービスClassCastException
をアクティビティにキャストできないため、Context
を返します。
私のメソッド呼び出し:
ActivityCompat.requestPermissions((Activity) mContext, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_COARSE_LOCATION);
これに対する解決策はこれまでにありますかORこのような状態で実行されないようにサービス権限を取り消す必要がありますか?.
サービスはUIに関連付けられていないため、サービスを介して許可をリクエストすることはできません。この種の意味があります。サービスコンテキストはアクティビティではないため、取得する例外は理にかなっています。
サービスで権限が利用可能かどうかを確認し、アクティビティで権限をリクエストできます(アクティビティが必要です)。
サービス内:
public static boolean checkPermission(final Context context) {
return ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED;
}
アクティビティ内:
private void showPermissionDialog() {
if (!LocationController.checkPermission(this)) {
ActivityCompat.requestPermissions(
this,
new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION},
PERMISSION_LOCATION_REQUEST_CODE);
}
}
アプリケーションコンテキストを使用すると、アクティビティなしで権限を確認できますが、許可をリクエストする場合はアクティビティが必要になります。アプリのコンテキストを取得するには、getApplicationContext()
を呼び出して、アクセス許可を確認する代わりにContextCompat.checkSelfPermission()
を使用します。
また、 正しい方法 で実行時パーミッションを使用する方法に関する良い情報があります:
許可があるかどうかを確認するには、
ContextCompat.checkSelfPermission()
メソッドを呼び出します。たとえば、次のスニペットは、アクティビティにカレンダーへの書き込み権限があるかどうかを確認する方法を示しています。// Assume thisActivity is the current activity int permissionCheck = ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.WRITE_CALENDAR);
アプリに権限がある場合、メソッドは
PackageManager.PERMISSION_GRANTED
、アプリは操作を続行できます。アプリに権限がない場合、メソッドはPERMISSION_DENIED
、およびアプリはユーザーに明示的に許可を求める必要があります。
編集:サービスの許可を確認した後、許可を要求するアクティビティが必要になります。
public static void requestPermissions (Activity activity, String[] permissions, int requestCode)