web-dev-qa-db-ja.com

SecurityException:許可の拒否:読み取り(エミュレーターのみ)

アプリに2つのアクティビティがあります。MainActivityはImagePickerを呼び出します。これは、電話ギャラリーのすべての画像をレイアウトするGridViewを持ち、ContentResolverを使用してカーソルを取得します。

電話でテストしたときは問題なく動作しましたが、エミュレータで毎回即座にクラッシュしました。

エラーログは次のとおりです。

Java.lang.SecurityException:Permission Denial:reading com.Android.providers.media.MediaProvider uri content:// media/external/images/media from pid = 5934、uid = 10060にはAndroid.permission.READ_EXTERNAL_STORAGE、またはgrantUriPermission()が必要です

以下に示すように、マニフェストに書かれた許可があります。

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

<application
    Android:allowBackup="true"
    Android:icon="@mipmap/ic_launcher"
    Android:label="@string/app_name"
    Android:theme="@style/AppTheme">
    <activity
        Android:name=".MainActivity"
        Android:label="@string/app_name"
        Android:exported="true">
        <intent-filter>
            <action Android:name="Android.intent.action.MAIN" />

            <category Android:name="Android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <activity Android:name=".ImagePicker" />
</application>
19
TPWang

エミュレータのバージョンはAndroid?そしてSDK 23でコンパイルしていますか?エミュレータがMarshmallowである場合、実行時に明示的に許可を確認する必要があります。 。

詳細については、権限に関するドキュメントを参照してください。 https://developer.Android.com/training/permissions/index.html

23
riggaroo

メソッドを呼び出す前に、許可を確認してください。

private void checkPermission(){
    int permissionCheck = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE);

    if (permissionCheck != PackageManager.PERMISSION_GRANTED) {     
         ActivityCompat.requestPermissions(         
    getActivity(), new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, Constants.WRITE_EXTERNAL_STORAGE); 
    } else {    
         callMethod(); 
    }
}

許可結果を確認してください。

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {

            case Constants.WRITE_EXTERNAL_STORAGE:
                if ((grantResults.length > 0) && (grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
                    callMethod(); 
                }
                break;

            default:
                break;
        }
    }
16
Philip Herbert

アプリのターゲットバージョンが23の場合、このエラーが発生します。要件にAPIレベル23が含まれている場合、ターゲット23を作成し、権限を動的に確認する必要があります。開発者サイトチェックの例 https:/ /developer.Android.com/training/permissions/requesting.html

注:ターゲット22以下を指定しても、アプリはこの(権限の確認)エラーなしで23で動作します。

3
Swamy