Android Marshmallowのサービスから権限をリクエストする方法


101

Android Marshmallowでは、アプリがインストールされるときに一度にすべてではなく、必要なときに実行時に権限をリクエストする必要があります。ただし、私はアクティビティに権限をリクエストするようにしか見えないようです。これは、アプリにサービスしか含まれていないため問題です。(なぜそうなのでしょうか?アプリにはAndroid Wearウォッチフェイスがバンドルされており、携帯電話は時計の近くで写真を検索して送信するだけです。アクティビティは必要ありません。ただし、位置情報へのアクセス許可が必要です。)

それで、サービスから許可を要求する方法はありますか?または、過去のように、インストール時に権限を強制的に付与しますか?


この問題はApplicationクラスの内部でも
itzhar 2015年

これを試してみてください。それは作業である可能性があります。stackoverflow.com
a/41221852/5488468

私のライブラリは、任意のコンテキストからランタイムアクセス許可を簡単に処理し、「今後表示しない」も処理します。github.com/nabinbhandari/Android-Permissions
Bhandari

回答:


47

requestPermission()だけから呼び出すことができActivityないService(とは異なりcheckPermission()のみ必要であることPackageManager)。したがって、これを回避するには、追加の作業を行う必要があります。Activityアプリでを提供する必要があります。たとえば、Service必要な権限を確認できます。権限がまだ付与されていない場合は通知を作成でき、その理由を説明する短いメッセージでユーザーに通知できます通知、および通知をクリックしたときに何が必要かなど


これは、ベンジャミンポエズが提案したソリューションです。あなたは23:40からこのポッドキャストを聞くことができます
xiaomi 2015

フラグメント内でrequestPermission()を呼び出すこともできます。
Misagh Emamverdi 2015年

3
バックグラウンドサービスを実行して位置情報の更新を定期的にチェックする場合の解決策は何ですか?設定で位置情報のアクセス許可をオフにします。アクティビティがないため、アプリを
再度開い

1
@ stud91少なくとも、場所の更新を要求するたびに、セキュリティ例外またはクエリ権限をキャッチしてください。これにより、アプリのクラッシュを防ぐことができます(ただし、アクセス許可が取り消されている場合は場所を取得できません)。さらに良い:権限を確認し、それがない場合は、権限ダイアログの単なるプレースホルダーであるアクティビティにユーザーを案内する通知を表示します。
user149408

8
解決方法は次のとおりです:github.com/mvglasow/satstat/blob/master/src/com/vonglasow/…これは、Contextも実装している任意の場所から呼び出すことができますOnRequestPermissionsResultCallback。機能は標準に似ていますrequestPermission()
user149408

15

私は同意します。これはサービスにとって非常に面倒です。これについては、Androidデベロッパープレビューページで問題を報告する必要があると思います。

現時点では、サービスに対する権限を確認し、権限がない場合は通知を表示するのが最善の解決策だと思います。さらに良いのは、ユーザーが通知を押したときに許可を要求するDialogActivityを作成することです。


7

PermissionEverywhereライブラリをご覧ください。これにより、任意のコンテキストから許可を要求できます。

クリックすると通知が作成され、許可を求めるアクティビティが開きます。

ライブラリのgithubページからのサンプルコード:-

@Override
  protected Boolean doInBackground(Void... params) {
      PermissionResponse response = PermissionEverywhere.getPermission(getApplicationContext(), 
      new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
              REQ_CODE,
              "Notification title", 
              "This app needs  a write permission", 
              R.mipmap.ic_launcher)
              .call();
      //waits..
      boolean isGranted = response.isGranted();

      if(isGranted){ //changed from isGrante to isGranted
      // Do stuff
      }
  }

1
サービスで非同期バージョンを試しましたが、動作しませんでした。onCompleteが呼び出されたことはありません
Leo Droidcoder

良いアイデアですが、リポジトリでは利用できません
naXa

2
このパッケージは私のために働いた、提案をありがとう。ただし、非同期バージョンを試していないことに注意します。また、の使用PermissionEverywhereに問題がある場合は、マニフェストでヘルパーアクティビティを宣言し、宣言するときに正しいパッケージに関連付けられていることを確認してください(PermissionEverywhere別のパッケージとして使用している場合)。PermissionEverywhereマニフェストで実際にパッケージを指定していないことを認識するのに長い時間がかかりました。
user3570982 '28

PermissionEverywhereのデモアプリを実行しましたが、機能しませんでした。
Ixx

2

これを正確に実行できる非常にシンプルなライブラリがあります。アプリがフォアグラウンドまたはバックグラウンドのどちらにあるかに基づいて、どこからでも(サービスからでも)アクセス許可を確認できます。通常のダイアログを表示するか、アクセス許可を求める通知を生成します。コードは非常に理解しやすく、使用も非常に簡単です。

ぜひお試しください:Androidの権限


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.