web-dev-qa-db-ja.com

Android Mで放送受信機の許可の削除に対処する方法は?

マシュマロの許可を安全にするレガシーコードがいくつかあります。

次のようにPHONE_STATE権限を使用したブロードキャストがあります。

<receiver Android:name="redacted.TheBroadcastReceiver">
    <intent-filter>
        <action Android:name="Android.intent.action.PHONE_STATE"></action>
        <action Android:name="Android.net.conn.CONNECTIVITY_CHANGE" />
    </intent-filter>
</receiver>

PHONE_STATE権限が付与された後、ユーザーが拒否した場合、電話がかかってくると、権限に関連するクラッシュが発生します。ただし、クラッシュが発生しますbefore Broadcast ReceiverのonReceive()が呼び出されます(クラッシュはAndroid.app.ActivityThread.handleReceiverにあります)。つまり、放送受信機は、許可が与えられているかどうかを確認してその状況に対処する機会さえも得られないということです。

だから私の質問は、このような放送受信機がある場合、AFAIKには権限の変更が発生したときに監視するAPIがないため、ユーザーが権限を無効にした状況にコードがどのように対処できるかということです。したがって、コードは知ることができません許可が取り消されたため、ブロードキャストレシーバーの登録を解除することはできません。

29
Gruntcakes

Android Marshmallowの権限については、受信者が次のように呼び出される前に権限を確認することをお勧めします。

// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(thisActivity,
                Manifest.permission.PHONE_STATE)
        != PackageManager.PERMISSION_GRANTED) {

    // Should we show an explanation?
    if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
            Manifest.permission.PHONE_STATE)) {

        // Show an expanation to the user *asynchronously* -- don't block
        // this thread waiting for the user's response! After the user
        // sees the explanation, try again to request the permission.

    } else {

        // No explanation needed, we can request the permission.

        ActivityCompat.requestPermissions(thisActivity,
                new String[]{Manifest.permission.PHONE_STATE},
                MY_PERMISSIONS_REQUEST_PHONE_STATE);

        // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
        // app-defined int constant. The callback method gets the
        // result of the request.
    }
}

それは遅い答えですが、私はそれが誰かを助けることを願っています!!!

1
Kostas Drak

6.0.1で問題を再現しようとしましたが、成功しませんでした。 テストプロジェクト 使用したリンクを添付しています。
シナリオは単純です:

  1. 権限をオンにして実行します。すべてが期待どおりに機能します。 onReceiveが呼び出されます。
  2. 許可をオフにします。電話の状態が変更されたときにアプリがクラッシュするという期待される結果は発生しません。

誰かが別の結果を出さない限り、この問題はある意味で「解決」されていると思います。

1
Alex.F

Android Mの最終バージョンはまだリリースされていません(最終APIはリリースされていますが、プラットフォームコードはリリースされていません)。したがって、プラットフォームがレシーバーを呼び出す前に権限チェックを処理することを願っています。

1
Cheborra