2015-09-29 20 views
29

私はマシュマロのために安全な許可をしているいくつかのレガシーコードを持っています。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がないため、ユーザーが許可を無効にしている状況をどのように処理できるかです。コードはその許可が取り消されたことを即座に知ることができないため、放送受信機の登録を解除することはできません。

+2

この場合、クラッシュダイアログが表示されますか?または、これは「静かな」スタックトレースで、LogCatに表示されるだけですが、ユーザーエクスペリエンスを直接損なうものではありませんか?後者の場合は、おそらく答えはちょうどそれらのメッセージで暮らし、 'Application'の' onCreate() 'のようなものをチェックして、あなたが許可を保持していて、一致する受信機の有効な状態を切り替えるかどうかを調べることです。しかし、ユーザーに典型的なクラッシュダイアログが表示されたら...それは悪いことです。 – CommonsWare

+2

「残念ながらXXXが停止しました」というダイアログがあります。 – Gruntcakes

+3

Oooo ...私は彼らが考えなかったことを賭けている最期のケースです。最低限のストップギャップとして、あなたは 'AlarmManager'か何かを使ってパーミッションとレシーバのステータスが定期的に同期されていることを確認する必要があります。それは、取り消された許可と次の 'AlarmManager'チェックとの間の呼び出しには役立ちませんが、何もしないよりも優れています。 – CommonsWare

答えて

1

// 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

Android Mの最終バージョンはまだ完成していません(最終的なAPIはありますが、プラットフォームコードはありません)ので、受信機を呼び出す前にプラットフォームがアクセス許可のチェックを処理することを願っています。

1

6.0.1で問題を再現しようとしました。私が使用したtest projectのリンクを添付しています。
シナリオは単純です:許可ONと

  1. ラン。すべてが期待どおりに機能します。 onReceiveが呼び出されます。
  2. 権限を無効にします。電話の状態が変更されたときにアプリケーションがクラッシュすると予想される結果は発生しません。

誰かが別の結果を持っていない限り、私はこの問題が「解決されました」と思っています。あなたの受信機は、このように呼ばれる前に許可をチェックすることもできますAndroidのマシュマロで許可については

関連する問題