web-dev-qa-db-ja.com

Android Mユーザー権限エラー-読み取りおよび書き込み

Android Mで始めたところ、外部ストレージにアクセスできません。次のエラーが表示されます

Caused by: Java.lang.SecurityException: Permission Denial: reading 
com.Android.providers.media.MediaProvider uri 
content://media/external/images/media from pid=15355, uid=10053 requires 
Android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission() 

私はマニフェストにユーザー権限を追加しています

<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />

そして、私のビルドファイルは次の設定です:

compileSdkVersion 23
buildToolsVersion "22.0.1"

minSdkVersion 16
targetSdkVersion 23

Android Mで外部ストレージから読み書きする方法は?

13
Kushal Sharma

ドキュメント からの読み取り。実行時にユーザーに許可を求める必要があります。コード例:

前に行ったように、Androidマニフェストに権限を追加します。

<uses-permission Android:name="Android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />

ユーザーがすでに権限を付与しているかどうかを確認します。はいの場合は、許可を求めるのをスキップしてワークフローを続行します。それ以外の場合は、ユーザーに許可を求めます。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    if (!Settings.System.canWrite(this)) {
        requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
            Manifest.permission.READ_EXTERNAL_STORAGE}, 2909);
    } else {
        // continue with your code
    }
} else {
    // continue with your code
}

ここで、ユーザーが許可を付与したか拒否したかを確認し、@OverrideOnRequestPermissionResultを呼び出してコールバックを取得します。

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    switch (requestCode) {
        case 2909: {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Log.e("Permission", "Granted");
            } else {
                Log.e("Permission", "Denied");
            }
            return;
        }
    }
}

書き込み権限を要求するだけでは外部ストレージを読み取ることができなかったため、Manifest.permission.READ_EXTERNAL_STORAGEもリクエストする必要がありました。


また、API 23より前のバージョンをターゲットにする場合は、IFステートメントを使用して実行時にビルドVERSIONを確認し、VERSIONがAndroid M以上の場合にのみ権限を要求します。

21
Kushal Sharma

Android=バージョンで処理する方法を探している場合(M用にコンパイルしていますが、一部のデバイスは他のバージョンを使用できます)互換性バージョンがあります。

if (ContextCompat.checkSelfPermission(CreatePlayerActivity.this,
            Manifest.permission.READ_EXTERNAL_STORAGE)
            != PackageManager.PERMISSION_GRANTED) {

        // Should we show an explanation?
        if (ActivityCompat.shouldShowRequestPermissionRationale(CreatePlayerActivity.this,
                Manifest.permission.READ_EXTERNAL_STORAGE)) {

            // 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(CreatePlayerActivity.this,
                    new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                    MY_PERMISSIONS_REQUEST_READ_CONTACTS);

            // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
            // app-defined int constant. The callback method gets the
            // result of the request.
        }
    }
6
Goofyahead

選択された回答に関して:

Settings.System.canWrite(this)およびWRITE_EXTERNAL_STORAGEは2つの非常に異なるものです。する必要があります:

    boolean needsRead = ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
            != PackageManager.PERMISSION_GRANTED;

    boolean needsWrite = ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
            != PackageManager.PERMISSION_GRANTED;

    if (needsRead || needsWrite)
        requestStoragePermission()
2
Anthony

私はWRITE_EXTERNAL_STORAGE権限で苦労していました:要求した後、ダイアログが表示されず、すぐにDENIEDが返されました。

問題は、含まれているライブラリの1つにありました。 AndroidManifest.xmlには同じ許可宣言が含まれていますが、maxSdkVersion="22"が含まれています。アプリケーションのマニフェストファイルでの宣言は、ライブラリによってオーバーライドされました。

ライブラリからの許可を上書きするために、私は以下を使用しました:

  <uses-permission
    Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"
    tools:node="remove"
    tools:selector="com.example.lib" />

これがお役に立てば幸いです。

1
ntoskrnl