私は起動時に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
メソッドを使用する不正な方法です。誰もが正しい方法ですべてのデバイスで動作します:)
um、なぜ 'requestPermissions()'を一度呼び出すだけではないのですか?それは結局、許可名の配列をとります。 – CommonsWare
@CommonsWareだからそれは...私はそれがうまくいくと思います。それはまだ私のコードが今日までうまくいった理由を説明しません。 – RayfenWindspear
@CommonsWareあなたが答えとしてそれを投稿するなら、私はそれを受け入れます。私はあなたの許可のガイドを見つけ、それを今追いかけてきました。 また、私のコードが今失敗した理由を発見しました。これは、私が最近デバイスにインストールしたカスタムカーネルに関連している必要があります。私はバグレポートを作成しなければなりませんが、リストを渡すのは本当にパーミッションのチェック方法です。 – RayfenWindspear