Android 10をターゲットにした場合のWRITE_EXTERNAL_STORAGE
質問
ASのlint警告で
android.permission.WRITE_EXTERNAL_STORAGE
. この警告は、Android 10 以上をターゲットとする場合、このパーミッションは書き込みアクセスを提供しなくなることを意味します。当該パーミッションを削除しても、内部ストレージフォルダへの書き込みは可能です。
Pictures/MY_APP_NAME
に書き込むことはできますが、Android 10 (SDK 29) および/またはそれ以上でのみ動作します(Android Rではまだテストしていません)。Android M (SDK 23)などの下位バージョンで再度テストしたところ、画像の保存がうまくいかなくなったため、この権限を解除して
android.permission.WRITE_EXTERNAL_STORAGE
に戻したところ、再び警告が表示されるようになりました。lintが誤検出で、異なるケースで問題を間違って診断している可能性はありませんか?現在、私のサポートSDKは21から始まり、最新の30までありますが、lintはAndroid 10 (SDK 29)をターゲットにするときにそれが不要になることを指摘するだけで、プロジェクトの最小SDKサポートを振り返ることは考慮していませんでした。
どのように解決するのですか?
回避策としては、警告は単なる情報であり、無害であるため、実際に警告を無視することです。そのためには maxSdkVersion を 28 もう心配する必要はありません。
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="28"
tools:ignore="ScopedStorage" />
なお android:requestLegacyExternalStorage フラグを使用することは解決策ではなく、一時的なパッチに過ぎません。 Android 11 (API 30) および将来のバージョンではまったく機能しません。
コメントで一部の開発者が示した疑問や混乱を明らかにするためのUPDATEです。
-
を使用する場合 requestLegacyExternalStorage フラグを Android 10 (API 29) をリクエストしてください。 write_external_storage をリクエストしてください。
-
フラグについて requestLegacyExternalStorage では何もしません。 Android 11 (API 30) では、完全に無視され、回避策もありません。
-
write_external_storage では何の権限も与えません。 Android 11 (API 30) では、何もしないので API 11 を設定する必要があります。 maxSdkVersion を 29 .
-
もし Android 10 (API 29) を使用していない場合にも requestLegacyExternalStorage を使っている場合は maxSdkVersion に設定します。 28 の代わりに 29 .
-
で始まる Android 11 (API 30) となっており、古い ファイル API は再び使用できますが、公開されている "共有ストレージ" フォルダ (DCIM、ミュージックなど)、またはアプリの "プライベート" ディレクトリにアクセスするときのみ使用できます。その他の場所については DocumentFile APIが必要です。
-
でFile APIがかなり遅くなったことを考慮してください。 Android 11 (API 30) なぜなら、本質的にラッパーになるようにリファクタリングされたからです。これは、許可された場所にだけその使用を強制することです。つまり、もはや高速なシステムファイルAPIではなく、内部的にMediaStoreに作業を委ねるラッパーに過ぎないのです。Android 11 以上で File API を使用する場合、Android チームによると、MediaStore に直接アクセスする場合よりも 2 ~ 3 倍遅くなるため、パフォーマンス上のペナルティを考慮する必要があります。
関連
-
[解決済み] Androidのソフトキーボードをプログラムで閉じる/隠すにはどうすればよいですか?
-
[解決済み] Androidでアクティビティ起動時にEditTextにフォーカスが当たらないようにする方法
-
[解決済み] Androidの「コンテキスト」とは何ですか?
-
[解決済み] AndroidでPythonを実行する方法はありますか?
-
[解決済み] AndroidのListViewで画像を遅延ロードする方法
-
[解決済み] EclipseのAndroidプラグインで "Debug certificate expired "エラーが発生する。
-
[解決済み] Androidで画面の大きさをピクセル単位で取得する方法
-
[解決済み】Android UserManager.isUserAGoat()の正しい使用例?)
-
[解決済み] 複数のフィルタを持つBroadcastReceiverか、複数のBroadcastReceiverか?
-
[解決済み] サポートライブラリのアクションバーをPreferenceActivityに追加するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 深くネストされたスタックから離れるとき、Fragmentのバックスタックをクリーンアップする方法はこれで良いのでしょうか?
-
[解決済み] HttpPostによる画像送信
-
[解決済み] Androidでマイナスマージンを使用するのは悪いことですか?
-
[解決済み] AppCompat-v7 21でアクションバー/ツールバーにアイコンを表示する。
-
[解決済み] FloatingActionButtonのサンプルとサポートライブラリ
-
[解決済み] アンドロイドでシェイクを検出するには?
-
[解決済み] EditTextをReadOnlyにする
-
[解決済み] ProjectScopeServices に Factory タイプのサービスはありません。
-
[解決済み] サポートライブラリのアクションバーをPreferenceActivityに追加するには?
-
Android 11 Scoped storage permissions