マシュマロでストレージの許可を取得しようとしています。すべてがうまく機能しているようで、アクセス許可を付与または拒否できます。
private static final int REQUEST_STORAGE = 1;
// request storage permission
private void requestStoragePermission() {
String[] permissions = new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE };
if (!hasStoragePermission()) {
Log.e(TAG, "No storage permission at the moment. Requesting...");
ActivityCompat.requestPermissions(this, permissions, REQUEST_STORAGE);
} else
Log.e(TAG, "We already have storage permission. Yay!");
}
// check is storage permission granted
private boolean hasStoragePermission() {
String storagePermission = Manifest.permission.WRITE_EXTERNAL_STORAGE;
int hasPermission = ContextCompat.checkSelfPermission(this, storagePermission);
return (hasPermission == PackageManager.PERMISSION_GRANTED);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode) {
case REQUEST_STORAGE:
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Log.e(TAG, "Storage permission granted");
} else {
Log.e(TAG, "Storage permission denied");
Toast.makeText(getApplicationContext(), getString(R.string.no_storage_permission), Toast.LENGTH_SHORT).show();
}
break;
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
しかし、問題はここにあります。この機能を初めて使用するときはhasStoragePermission()
、権限を付与した後でも、常に false です。権限が付与されなかった場合、コンテキスト メニューを 2 回使用して、必要なことを実行する必要があります。それは受け入れられません。
// some code...
// even more code...
@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
case ID_CONTEXT_MENU_SAVE_IMAGE:
// in order to save anything we need storage permission
requestStoragePermission();
Log.e("SomeActivity", "storagePermissionGranted: " + hasStoragePermission());
if (!hasStoragePermission())
return false;
saveImageToDisk(mPendingImageUrlToSave);
break;
}
return super.onContextItemSelected(item);
}
それを引き起こす可能性のある Android Marshmallow の既知のバグはありますか? 実際、ストレージの許可を付与/拒否できるため、コードは問題ないようです。でもすぐに手に入れたい。