1. ホーム
  2. android

Android 10をターゲットにした場合のWRITE_EXTERNAL_STORAGE

2023-08-15 12:50:14

質問

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 倍遅くなるため、パフォーマンス上のペナルティを考慮する必要があります。