web-dev-qa-db-ja.com

サービスからロケーション許可をリクエストするAndroid M

起動時に起動し、場所の更新の確認を開始するサービスを使用しています。 Android Mのおかげで、許可ポップアップでロケーションアクセスを拒否すると、電話が起動するとサービスがクラッシュします。

この場合、アクティビティがないので、requestPermissions()への呼び出しは、サービスClassCastExceptionをアクティビティにキャストできないため、Contextを返します。

私のメソッド呼び出し:

ActivityCompat.requestPermissions((Activity) mContext, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_COARSE_LOCATION);

これに対する解決策はこれまでにありますかORこのような状態で実行されないようにサービス権限を取り消す必要がありますか?.

37
stud91

サービスは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);
    }
}
45
Joakim Engstrom

アプリケーションコンテキストを使用すると、アクティビティなしで権限を確認できますが、許可をリクエストする場合はアクティビティが必要になります。アプリのコンテキストを取得するには、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)
10
Vitaliy A