Android Mで始めたところ、外部ストレージにアクセスできません。次のエラーが表示されます
Caused by: Java.lang.SecurityException: Permission Denial: reading
com.Android.providers.media.MediaProvider uri
content://media/external/images/media from pid=15355, uid=10053 requires
Android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()
私はマニフェストにユーザー権限を追加しています
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
そして、私のビルドファイルは次の設定です:
compileSdkVersion 23
buildToolsVersion "22.0.1"
minSdkVersion 16
targetSdkVersion 23
Android Mで外部ストレージから読み書きする方法は?
ドキュメント からの読み取り。実行時にユーザーに許可を求める必要があります。コード例:
前に行ったように、Androidマニフェストに権限を追加します。
<uses-permission Android:name="Android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
ユーザーがすでに権限を付与しているかどうかを確認します。はいの場合は、許可を求めるのをスキップしてワークフローを続行します。それ以外の場合は、ユーザーに許可を求めます。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (!Settings.System.canWrite(this)) {
requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE}, 2909);
} else {
// continue with your code
}
} else {
// continue with your code
}
ここで、ユーザーが許可を付与したか拒否したかを確認し、@Override
OnRequestPermissionResult
を呼び出してコールバックを取得します。
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
case 2909: {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Log.e("Permission", "Granted");
} else {
Log.e("Permission", "Denied");
}
return;
}
}
}
書き込み権限を要求するだけでは外部ストレージを読み取ることができなかったため、
Manifest.permission.READ_EXTERNAL_STORAGE
もリクエストする必要がありました。
また、API 23より前のバージョンをターゲットにする場合は、
IF
ステートメントを使用して実行時にビルドVERSIONを確認し、VERSIONがAndroid M
以上の場合にのみ権限を要求します。
Android=バージョンで処理する方法を探している場合(M用にコンパイルしていますが、一部のデバイスは他のバージョンを使用できます)互換性バージョンがあります。
if (ContextCompat.checkSelfPermission(CreatePlayerActivity.this,
Manifest.permission.READ_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(CreatePlayerActivity.this,
Manifest.permission.READ_EXTERNAL_STORAGE)) {
// Show an expanation to the user *asynchronously* -- don't block
// this thread waiting for the user's response! After the user
// sees the explanation, try again to request the permission.
} else {
// No explanation needed, we can request the permission.
ActivityCompat.requestPermissions(CreatePlayerActivity.this,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
MY_PERMISSIONS_REQUEST_READ_CONTACTS);
// MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
// app-defined int constant. The callback method gets the
// result of the request.
}
}
選択された回答に関して:
Settings.System.canWrite(this)
およびWRITE_EXTERNAL_STORAGE
は2つの非常に異なるものです。する必要があります:
boolean needsRead = ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED;
boolean needsWrite = ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED;
if (needsRead || needsWrite)
requestStoragePermission()
私はWRITE_EXTERNAL_STORAGE
権限で苦労していました:要求した後、ダイアログが表示されず、すぐにDENIED
が返されました。
問題は、含まれているライブラリの1つにありました。 AndroidManifest.xml
には同じ許可宣言が含まれていますが、maxSdkVersion="22"
が含まれています。アプリケーションのマニフェストファイルでの宣言は、ライブラリによってオーバーライドされました。
ライブラリからの許可を上書きするために、私は以下を使用しました:
<uses-permission
Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"
tools:node="remove"
tools:selector="com.example.lib" />
これがお役に立てば幸いです。