2

マシュマロでストレージの許可を取得しようとしています。すべてがうまく機能しているようで、アクセス許可を付与または拒否できます。

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 の既知のバグはありますか? 実際、ストレージの許可を付与/拒否できるため、コードは問題ないようです。でもすぐに手に入れたい。

4

1 に答える 1

2

アクセス許可の要求と返される結果は非同期です。onRequestPermissionsResult()が実行されると、アプリは許可を付与または拒否されます。場合によっては、これによりアプリ全体が再起動されます (特定の権限)。参考までに、外部ストレージはその 1 つでなければなりませんが、現在 M には、この権限を付与するときにアプリが常に再起動されないという問題があります。

于 2016-01-16T14:01:35.567 に答える