2020/03/07

Android Q で外部ストレージのファイルが開けなくなった

Android Pi (API Level 28) まで正しく動いていたアプリが、Android Q 上で動作させると動かなくなってしまいました。

具体的には、External Storage にファイルを書き込もうとすると、以下のような例外が発生してしまうのです。

java.io.FileNotFoundException: /storage/emulated/0/202003061644.zip: open failed: EACCES (Permission denied)

Android Pi までは動作していたので、当然 WRITE_EXTERNAL_STORAGEREAD_EXTERNAL_STORAGE パーミッションは適切に1取得しています。

Android Q から External Storage のアクセス権が厳しくなった

調べてみると、Android Q からは External Storage に直接アクセス出来るエリアが限定されたようです。 具体的には getExternalFilesDir() で取得されるディレクトリ以外はパス指定で読み書き出来ません2

参考

Exception 'open failed: EACCES (Permission denied)' on Android - Stack Overflow

対象範囲別外部ストレージ アクセスを管理する  |  Android デベロッパー  |  Android Developers

解決策(暫定)

以下のフラグを `AndroidManifest.xml" に書いておくと、API 28 までと同等のアクセス権に変わるとのこと。

AndroidManifest.xml
1
2
<application
    android:requestLegacyExternalStorage="true"

しかし、これは暫定対応です。 来年(2020年)以降リリースのバージョンではこのフラグは動かないらしいです。

解決策

そもそも External Storage を使わないか、getExternalFilesDir()を使うようにするしかないと思われます。

なお、Media 系と Download ディレクトリは別途アクセスする方法が提供されています。

詳しくは上記、公式サイトをご参考ください。

  1. 静的にも動的にも 
  2. その代わり、パーミッションは必要なくなった 
?

0 件のコメント: