1. ホーム
  2. android

[解決済み] マシュマロでストレージのパーミッションエラーが発生する

2022-04-20 19:39:56

質問

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" />

プロジェクトをクリーンアップして再構築しましたが、まだクラッシュします。

どうすればいいですか?

外部ストレージの使用許可をユーザーが与えているかどうかを確認する必要があります。

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

もちろん、これらはマシュマロデバイス専用なので、あなたのアプリがマシュマロで動作しているかどうかを確認する必要があります。

 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
    }
}