web-dev-qa-db-ja.com

Android READ_EXTERNAL_STORAGE権限が機能しない

ギャラリーアプリから画像を取得してimageButtonに表示できるシンプルなアプリを作成しようとしています。 Android 5.0.1。を実行している電話でAPI 21を使用してテストしています。残念ながら、何をしようとしても、アクセス許可を指定してもセキュリティエラーが発生し続けます。

画像を取得するための私のコードは次のとおりです。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent){
    super.onActivityResult(requestCode, resultCode, imageReturnedIntent);

    switch(requestCode){
        case PICK_IMAGE_REQUEST:
            if(resultCode == RESULT_OK && imageReturnedIntent != null && imageReturnedIntent.getData() != null) {
                Uri uri = imageReturnedIntent.getData();
                try {
                    Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
                    // Log.d(TAG, String.valueOf(bitmap));
                    ImageButton ib = (ImageButton) findViewById(R.id.inputImg);
                    ib.setImageBitmap(bitmap);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            break;
    }
}

Dropboxから画像を選択しようとするとコードは機能しますが、ギャラリーから画像を選択すると、

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

READ_EXTERNAL_STORAGEの使用許可タグをマニフェストの子にしました。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
package="[REDACTED]">

    <uses-sdk
    Android:minSdkVersion="14"
    Android:targetSdkVersion="23" />

    <uses-permission tools:node="replace" Android:name="Android.permission.READ_EXTERNAL_STORAGE" Android:maxSdkVersion="18" />

    <application>
        [REDACTED]
    </application>

</manifest>

私は他の投稿で高低を検索しましたが、なぜこの厄介なエラーがまだ発生しているのかを理解できないようです。

12
Zheryu

[〜#〜]問題[〜#〜]
エラーが発生しました

Java.lang.SecurityException:許可の拒否:pid = 25240からのcom.Android.providers.media.MediaProvider uri content:// media/external/images/media/35634の読み取り、uid = 10070 rAndroid.permission.READ_EXTERNAL_STORAGE、またはgrantUriPermission()が必要です。

[〜#〜] cause [〜#〜]
ドキュメントによると、Android:maxSdkVersion="18"が原因で正しく許可を与えていません。

この許可がアプリに付与される最高のAPIレベル。この属性の設定は、特定のAPIレベルからアプリに必要な許可が不要になった場合に役立ちます。

API 21に許可を与えていない限り、アプリは正常に動作しています。

詳細については、 このトピック を確認してください。

[〜#〜] solution [〜#〜]
読み取り許可を与えたい場合underAPI 21、次のように宣言する必要があります。

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

重要:

これは、一部の古いapiには新しいバージョンでは必要ないアクセス許可が必要なため、追加のアクセス許可を与える必要がある場合にのみ意味があります。


(この場合)正しい方法は次のとおりです。

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

ADD ON
データを保存する場合は、WRITE_EXTERNAL_STORAGE権限を追加する必要があります。

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

以下のものと置き換えて試してください。

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

一部のデバイスでデバッグしている間に、設定->アプリ-> MY_APPLICATION->許可に移動して明示的に許可を付与し、必要な許可を付与する必要があります。

1
vimalp015

以下をAndroidManifest.xmlに追加することに加えて

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

アプリが外部ストレージに実際にアクセスできるようにするには、アクティビティで許可をリクエストする必要もあります。 https://developer.Android.com/training/permissions/requesting.html

0
Sridhar