web-dev-qa-db-ja.com

Android Q:file.mkdirs()はfalseを返します

外部ストレージを使用して、画像、バイナリデータなどの一時ファイルを保存するアプリがあります。そのためのコードは、最近まで大きな変更なしに数年間機能していました。 Android Qでは機能しません:

File f = new File(Environment.getExternalStorageDirectory().toString() + File.separator + MainActivity.APP_DIR)
f.mkdirs();
// do sth with f

mkdirsfalseのみを返すようになりました。

必要な権限はマニフェストで提供されています:

    <uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />

コードは以前のバージョンのAndroidで正常に動作します。このタイプのアクセスにシステムレベルの変更はありますか?もしそうなら、回避策は何ですか?

10
khusrav

Android Q Scoped Storage を導入することでQに大きなプライバシーの変更がありました。

Qベータ4以降、次の方法でその機能を opt-out することができます。

  • api 28(またはそれ以下)をターゲットにする
  • requestLegacyExternalStorage manifest属性を使用:

<manifest ... >
  <!-- This attribute is "false" by default on apps targeting Android Q. -->
  <application Android:requestLegacyExternalStorage="true" ... >
    ...
  </application>
</manifest>

*私はそれをテストしていないことに注意してください、ドキュメントを引用するだけです

24
Pawel

APIレベル29では、共有/外部ストレージデバイスへの直接アクセスは廃止されました。アプリが_Build.VERSION_CODES.Q_をターゲットとする場合、getExternalStorageDirectory()メソッドから返されるパスは、アプリから直接アクセスできなくなります。アプリは、 Context#getExternalFilesDir(String)MediaStore 、または Intent#ACTION_OPEN_DOCUMENT

アプリ固有のディレクトリに存在しないファイルにアプリがアクセスする必要がない限り、スコープストレージを使用することをお勧めします。

Android-Qでのファイル管理の問題に直面している人は、 this の記事を読んで詳細を確認できます。

5
Anoop M