web-dev-qa-db-ja.com

Android 10:外部ストレージのファイルを「/ sdcard / my-app /」というディレクトリに保存するためのオプションは何ですか?

Android Pieまで私はアプリが_/sdcard/my-app/_に保存するために必要なファイルを常に保存しました。

File fBaseDir = new File(Environment.getExternalStorageDirectory(), "my-app");

私のアプリの1つは、数百(最大数千)のファビコンを_/sdcard/my-app/favicons_に保存し、ユーザーがアプリのバックアップを作成すると、_/sdcard/my-app/backups_に保存されます。 Googleが撮影したWebページのスクリーンショットChromeアプリと共有すると、_/sdcard/my-app/screenshots_に保存されます。

アプリをアンインストールすると、後で再インストールでき、すべてのファビコン、スクリーンショット、およびバックアップを保持して状態を復元でき、すべてのファビコンを再ダウンロードする必要がありません(他のすべてのデータが失われた可能性があります)。

また、PCにコピーして_/sdcard/my-app/_ディレクトリのバックアップを簡単に作成し、たとえば新しいデバイスに移行するときに別の電話に復元することもできます。

また、ファイルエクスプローラーを使用して、そのディレクトリにあるファイルを確認し、それらを選択してメールで送信するか、Googleドライブにコピーするか、一部のファイル(古いバックアップファイルなど)を削除することもできます。

Android 10の場合、このアプローチは崩壊しました。ファビコンは実際の画像ではないため、Images Media-Folderに追加できません。ビューが不必要に乱雑になり、開発者アカウントがこれを行うためのPlayストア。アプリがアンインストールされるとデータが削除され、Explorerなどの他のアプリがデータにアクセスできないため、このデータをすべてApp-Privateディレクトリに保存したくありません。

私のオプションは何ですか?ファイルまたはディレクトリを手動で選択することはできません。ただし、ディレクトリを一度選択するだけで、アクセス権が永久に付与されます(ファイルの読み取りと書き込み)。

_/sdcard/my-app/_の外部での読み取りや書き込みは行いません。

15
Daniel F

Android Qでは、Qダイレクトファイルアクセスは、プライベートフォルダー外のアプリではデフォルトで無効になっています。この場合に使用できるいくつかの戦略:

  1. マニフェストオプションrequestLegacyStorageを使用して古い動作をさせますが、Android Rでは動作しません。そのため、これは実際には短期的な解決策です。
  2. getExternalFilesDir()メソッドを使用してファイルを保存します。これはプライベートフォルダーです。他のアプリは、_READ_EXTERNAL_STORAGE_権限がある場合にのみこれらのファイルにアクセスできます。この場合、FileProviderを使用して、ファイルへの他のアプリへのアクセスを許可することをお勧めします。
  3. クラスStorageManagerのメソッドgetPrimaryStorageVolume().createOpenDocumentTreeIntent()を使用して、外部プライマリボリュームへのアクセスを要求します。この場合、ユーザーの同意が必要であり、いずれにせよFile apiを直接使用することはできませんが、DocumentFileクラスを使用すると非常によく似たインターフェースが得られるため、これは古い動作。これは、フォアグラウンドとバックグラウンドで操作を実行する必要がある場合に機能します。つまり、許可を要求する最初の操作を除いて、ユーザーの操作なしで操作できます。

ポイント3の Flipper ライブラリをリンクすると、古いAndroidバージョンのようにファイルを管理するのに役立ちます。

12
greywolf82