外部ストレージを使用して、画像、バイナリデータなどの一時ファイルを保存するアプリがあります。そのためのコードは、最近まで大きな変更なしに数年間機能していました。 Android Qでは機能しません:
File f = new File(Environment.getExternalStorageDirectory().toString() + File.separator + MainActivity.APP_DIR)
f.mkdirs();
// do sth with f
mkdirs
はfalse
のみを返すようになりました。
必要な権限はマニフェストで提供されています:
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
コードは以前のバージョンのAndroidで正常に動作します。このタイプのアクセスにシステムレベルの変更はありますか?もしそうなら、回避策は何ですか?
Android Q Scoped Storage を導入することでQに大きなプライバシーの変更がありました。
Qベータ4以降、次の方法でその機能を opt-out することができます。
requestLegacyExternalStorage
manifest属性を使用:<manifest ... >
<!-- This attribute is "false" by default on apps targeting Android Q. -->
<application Android:requestLegacyExternalStorage="true" ... >
...
</application>
</manifest>
*私はそれをテストしていないことに注意してください、ドキュメントを引用するだけです
APIレベル29では、共有/外部ストレージデバイスへの直接アクセスは廃止されました。アプリが_Build.VERSION_CODES.Q
_をターゲットとする場合、getExternalStorageDirectory()
メソッドから返されるパスは、アプリから直接アクセスできなくなります。アプリは、 Context#getExternalFilesDir(String) 、 MediaStore 、または Intent#ACTION_OPEN_DOCUMENT 。
アプリ固有のディレクトリに存在しないファイルにアプリがアクセスする必要がない限り、スコープストレージを使用することをお勧めします。
Android-Qでのファイル管理の問題に直面している人は、 this の記事を読んで詳細を確認できます。