アプリに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>
エミュレータのバージョンはAndroid?そしてSDK 23でコンパイルしていますか?エミュレータがMarshmallowである場合、実行時に明示的に許可を確認する必要があります。 。
詳細については、権限に関するドキュメントを参照してください。 https://developer.Android.com/training/permissions/index.html
メソッドを呼び出す前に、許可を確認してください。
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;
}
}
アプリのターゲットバージョンが23の場合、このエラーが発生します。要件にAPIレベル23が含まれている場合、ターゲット23を作成し、権限を動的に確認する必要があります。開発者サイトチェックの例 https:/ /developer.Android.com/training/permissions/requesting.html
注:ターゲット22以下を指定しても、アプリはこの(権限の確認)エラーなしで23で動作します。