私はマシュマロのために安全な許可をしているいくつかのレガシーコードを持っています。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権限が付与されたが、その後、ユーザが電話があったときのパーミッション関連のクラッシュがあり、その後拒否された場合。 しかし、の場合は、の前にクラッシュが発生し、ブロードキャスト受信者のonReceive()が呼び出されます(クラッシュはandroid.app.ActivityThread.handleReceiverにあります)。つまり、放送受信機は、許可が与えられているかどうかをチェックし、その状況に対処する機会を得ることはできない。
私の質問は、このようなブロードキャスト受信者がいる場合、AFAIKはアクセス許可の変更を監視するためのAPIがないため、ユーザーが許可を無効にしている状況をどのように処理できるかです。コードはその許可が取り消されたことを即座に知ることができないため、放送受信機の登録を解除することはできません。
この場合、クラッシュダイアログが表示されますか?または、これは「静かな」スタックトレースで、LogCatに表示されるだけですが、ユーザーエクスペリエンスを直接損なうものではありませんか?後者の場合は、おそらく答えはちょうどそれらのメッセージで暮らし、 'Application'の' onCreate() 'のようなものをチェックして、あなたが許可を保持していて、一致する受信機の有効な状態を切り替えるかどうかを調べることです。しかし、ユーザーに典型的なクラッシュダイアログが表示されたら...それは悪いことです。 – CommonsWare
「残念ながらXXXが停止しました」というダイアログがあります。 – Gruntcakes
Oooo ...私は彼らが考えなかったことを賭けている最期のケースです。最低限のストップギャップとして、あなたは 'AlarmManager'か何かを使ってパーミッションとレシーバのステータスが定期的に同期されていることを確認する必要があります。それは、取り消された許可と次の 'AlarmManager'チェックとの間の呼び出しには役立ちませんが、何もしないよりも優れています。 – CommonsWare