5

私は起動時に2つの権限を要求するプロジェクトを持っています。デバッグでは、2回目の呼び出しがrequestPermissionsになるまで意図どおりに機能します。すぐに最初のものがonRequestPermissionsResultを空にしてgrantResultsの配列で起動します。ユーザーの応答前にカスタムカーネル呼び出しonRequestPermissionsResultでrequestPermissionsを2回呼び出す

これは今日までうまくいきました。私が考えることができるのは、私が今日した更新です。 Android SDKプラットフォームツール23.1にアップデートし、MacをEl Capitanにアップデートしました。

誰でも問題があれば修正できますか?

コードは、次のとおりです。

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.blank_layout); 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
     int hasCameraPermissions = checkSelfPermission(android.Manifest.permission.CAMERA); 
     if (hasCameraPermissions != PackageManager.PERMISSION_GRANTED) { 
      requestPermissions(new String[]{android.Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION_CODE); 
     } 
     int hasStoragePermissions = checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE); 
     if (hasStoragePermissions != PackageManager.PERMISSION_GRANTED) { 
      requestPermissions(new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_STORAGE_PERMISSION_CODE); 
     } 
     if (hasCameraPermissions == PackageManager.PERMISSION_GRANTED && hasStoragePermissions == PackageManager.PERMISSION_GRANTED) { 
      startCameraIntent(); 
     } 
    } else { 
     startCameraIntent(); 
    } 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
    switch (requestCode) { 
     case REQUEST_CAMERA_PERMISSION_CODE: 
      if (grantResults[0] != PackageManager.PERMISSION_GRANTED) { 
       Toast.makeText(this, R.string.camera_denied, Toast.LENGTH_LONG).show(); 
       quitAfter5(); 
      } 
      break; 
     case REQUEST_STORAGE_PERMISSION_CODE: 
      if (grantResults[0] != PackageManager.PERMISSION_GRANTED) { 
       Toast.makeText(this, R.string.storage_denied, Toast.LENGTH_LONG).show(); 
       quitAfter5(); 
      } 
      break; 
    } 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
     int hasCameraPermissions = checkSelfPermission(android.Manifest.permission.CAMERA); 
     int hasStoragePermissions = checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE); 
     if (hasCameraPermissions == PackageManager.PERMISSION_GRANTED && hasStoragePermissions == PackageManager.PERMISSION_GRANTED) { 
      startCameraIntent(); 
     } 
    } 
} 

EDIT :: をクラッシュにこれを引き起こした変更は、私は数日前に私のNexus 5の上のカスタムカーネルElementalXをインストールしていたという事実でした。昨日の弟のNexus 6で、同じカーネルを使って問題を確認しました。私はカーネル開発者に電子メールを送り、彼がそれについて何を言っているのかを見てみるつもりです。

しかし、上記のコードは、とにかくrequestPermissionsメソッドを使用する不正な方法です。誰もが正しい方法ですべてのデバイスで動作します:)

+2

um、なぜ 'requestPermissions()'を一度呼び出すだけではないのですか?それは結局、許可名の配列をとります。 – CommonsWare

+0

@CommonsWareだからそれは...私はそれがうまくいくと思います。それはまだ私のコードが今日までうまくいった理由を説明しません。 – RayfenWindspear

+0

@CommonsWareあなたが答えとしてそれを投稿するなら、私はそれを受け入れます。私はあなたの許可のガイドを見つけ、それを今追いかけてきました。 また、私のコードが今失敗した理由を発見しました。これは、私が最近デバイスにインストールしたカスタムカーネルに関連している必要があります。私はバグレポートを作成しなければなりませんが、リストを渡すのは本当にパーミッションのチェック方法です。 – RayfenWindspear

答えて

5

requestPermissions()への2回の連続したコールから期待される最良のシナリオは、2つの連続していない別々のダイアログを表示することです。私はあなたが見ている行動を期待していないだろう。私は同様の複数の - requestPermissions()の呼び出しを、構成の変更を適切に処理しないという形で行っており、ダイアログの両方のエディションが表示されました。

他のすべてが同等であれば、すべてのアクセス許可をrequestPermissions()に要求する方がよいので、1つのダイアログがあります。それはユーザーの期待に一層合っていますし、コードを単純化すると思います。

+1

アプリ起動時に同時に2つの異なる呼び出しで2つの異なるアクセス権を要求すると、Android Marshmallowに奇妙な問題が発生しました(プログラムが数回クラッシュしました)。 1つのrequestPermissions()内で両方を要求すると、それを修正するように見えました。 – Matthias

関連する問題