Lollipop では、アプリのダウンロード機能は正常に動作しますが、Marshmallow にアップグレードすると、インターネットから SD カードにダウンロードしようとすると、アプリがクラッシュし、次のエラーが発生します。
Neither user nor current process has android.permission.WRITE_EXTERNAL_STORAGE
次のコード行についてエラーが出ます:
DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
manager.enqueue(request);
アプリケーション外部のマニフェストに権限があります:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
プロジェクトをクリーンアップして再構築しましたが、それでもクラッシュします。
ベストアンサー1
ユーザーが外部ストレージのアクセス許可を付与しているかどうかを確認するには、次の操作を実行します。
if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
Log.v(TAG,"Permission is granted");
//File write logic here
return true;
}
そうでない場合は、ユーザーにアプリに権限を付与するよう依頼する必要があります。
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE);
もちろん、これらは Marshmallow デバイス専用なので、アプリが Marshmallow で実行されているかどうかを確認する必要があります。
if (Build.VERSION.SDK_INT >= 23) {
//do your check here
}
また、あなたの活動がOnRequestPermissionResult
許可全体は次のようになります。
public boolean isStoragePermissionGranted() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
== PackageManager.PERMISSION_GRANTED) {
Log.v(TAG,"Permission is granted");
return true;
} else {
Log.v(TAG,"Permission is revoked");
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
return false;
}
}
else { //permission is automatically granted on sdk<23 upon installation
Log.v(TAG,"Permission is granted");
return true;
}
}
権限結果コールバック:
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
Log.v(TAG,"Permission: "+permissions[0]+ "was "+grantResults[0]);
//resume tasks needing this permission
}
}