18

私のアプリでは2つのアクティビティがあります.MainActivityはImagePickerを呼び出します。ImagePickerはPhoneResolverを使用してカーソルを取得するGridViewのすべての画像をレイアウトします。SecurityException:許可されていない拒否:読み取り(エミュレータのみ)

私はそれをテストしたが、エミュレータで即座にクラッシュしました。

はここでエラーログです:

java.lang.SecurityException: Permission Denial:reading com.android.providers.media.MediaProvider uri content://media/external/images/media from pid=5934, uid=10060 requires android.permission.READ_EXTERNAL_STORAGE, or 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> 
+0

エミュレータを作成しながら、SDカード収納スペースを指定してみてください。 – userDroid

+0

申し訳ありません、どうすればいいですか?私は1Gに設定しました。 – TPWang

答えて

23

どのバージョンのエミュレータですか?そして、あなたはSDK 23でコンパイルしていますか? エミュレータがMarshmallowの場合は、実行時に明示的にアクセス許可をチェックする必要があります。これは、新しいアクセス許可モデルが原因です。

詳細は権限のドキュメントをチェックアウト:https://developer.android.com/training/permissions/index.html

+0

ありがとう!それは私の問題を解決しました! – TPWang

+0

これは通常のデバイスで動作する理由を説明していません – Day

3

アプリのターゲットバージョンが23であれば、それはあなたの要件はAPIレベル23が含まれている場合、あなたは、ターゲット23と必要性を確認する必要があり、あなたにこのエラーを与えます動的にここに権限を確認することは開発者向けサイトのチェックから一例であるhttps://developer.android.com/training/permissions/requesting.html

注:あなたがターゲット22を与えるか、下にも、あなたのアプリがエラー(許可を確認してください)。このことなく、23で動作します場合でも

14

Before calling method, check for permission.

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(); 
    } 
} 

Check permission result.

@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; 
     } 
    } 
+0

'Constants.WRITE_EXTERNAL_STORAGE'は任意のintにすることができます:)私はアプリケーション定義の例で自分自身の定数に置き換えました:' static final int MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE = 99; ' – CGR

+0

エラー:シンボルManifestを解決できません。 – Solo

関連する問題