ファイルの規則性を改善し、ユーザーがファイルをより適切に制御できるようにするために、Android 10では、アプリケーション用の「パーティションストレージ」と呼ばれる新しいパラダイムが導入されています。パーティションストレージは、アプリケーションが外部ストレージ内のファイルを保存およびアクセスする方法を変更します。アプリケーションの移行とパーティションストレージのサポートを支援するために、一般的なユースケースのベストプラクティスを要約して共有します。
メディアファイルを処理する
このセクションでは、メディアファイル(ビデオ、画像、オーディオファイルなど)を処理するための一般的な使用例について説明し、アプリケーションで使用できる方法の概要を説明します。さまざまなシステムバージョンでの各ユースケースとその実践の概要を一覧表示した簡単な図を作成しました。
写真やビデオファイルを複数のフォルダに表示する
使用し たクエリ() APIを メディアコレクションを照会。あなたは調整することができ projection
、 selection
、 selectionArgs
および sortOrder
フィルタとソートのメディアファイルのパラメータに。
特定のフォルダにファイルとビデオを表示する
次の方法を使用します。
- 「アプリの権限のリクエスト」の記事で説明されているベストプラクティスを使用して、権限をリクエストし
READ_EXTERNAL_STORAGE
ます。 - MediaColumns.DATA の値を使用 して、ディスク上のメディアファイルの絶対ファイルシステムパスを含むメディアファイルを取得します。
写真内の位置情報にアクセスする
アプリがパーティションストレージを使用している場合は、メディアストレージガイドの「写真の位置情報」セクションに従うことができます。
注: パーティションストレージを無効にすることを選択した場合でも、MediaStore APIを使用して画像にアクセスし、変更されていない場所情報を読み取る場合は、 ACCESS_MEDIA_LOCATION 権限を要求する必要があります 。
1回の操作で複数のメディアファイルを変更または削除する
実行中のアプリケーションのAndroidバージョンに基づいてロジックを統合する必要があります。
Android11で動作します
次の方法を使用します。
- 使用 MediaStore.createWriteRequest() または MediaStore.createTrashRequestは() 、アプリケーションの書き込みや削除要求の保留中の意図を作成し、ファイルのセットを変更する権限を付与するように促すために意図を呼び出します。
- ユーザーの応答を評価します。
- 許可を得た場合は、変更または削除操作を行ってください。
- 権限を取得できない場合は、アプリにこの権限が必要な理由をユーザーに説明してください。
Android 11で導入されたこれらのメソッドの使用方法の詳細については、ラインバッチ操作を実行してください。
Android10で動作します
アプリのターゲットAPIがAndroid10(APIレベル29)の場合は、パーティションストレージを無効にし、Android9以下で使用されているのと同じ方法を引き続き使用してそのような操作を実行してください。
Android9以下で動作します
次の方法を使用します。
- 記事「アプリの権限のリクエスト」で説明されているベストプラクティスを使用して、WRITE_EXTERNAL_STORAGEの 権限をリクエストし ます。
- MediaStore APIを使用して 、メディアファイルを変更および削除します。
既存の単一の画像をインポートする
既存の画像をインポートする場合(たとえば、ユーザープロファイルに写真を使用する場合)、アプリケーションは独自のUIまたはシステムイメージセレクターを使用してこの操作を実行できます。
独自のユーザーインターフェイスを提供する
次の方法を使用します。
- 「アプリの権限のリクエスト」の記事で説明されているベストプラクティスを使用して、権限をリクエストし
READ_EXTERNAL_STORAGE
ます。 - 使用し たクエリ() APIを メディアコレクションを照会。
- UIに結果を表示します。
システムセレクターを使用する
ACTION_GET_CONTENT インテントを使用して 、インポートする画像を選択するようにユーザーに依頼します。システムセレクターによってユーザーに表示される画像のタイプをフィルター処理する場合は、setType() または EXTRA_MIME_TYPESを使用できます 。
1枚の写真を撮る
写真を撮ってアプリで使用する場合(たとえば、ユーザープロファイルに写真を使用する場合)、 ACTION_IMAGE_CAPTURE インテントを使用して、デバイスのカメラを使用して写真を撮るようにユーザーに依頼します。システムは、MediaStore.Images テーブルに撮影された写真を保存し ます。
メディアファイルを他のアプリと共有する
insert() メソッドを使用 して、レコードをMediaStoreに直接追加します。詳細については、メディアストレージガイドの「プロジェクトの追加」セクションを参照してください。
メディアファイルを特定のアプリと共有する
Android FileProviderコンポーネントを使用します。関連するコンテンツについては、「ファイル共有の設定」ガイドを参照してください。
直接ファイルパスを使用して、コードまたは依存ライブラリからファイルにアクセスする
実行中のアプリケーションのAndroidバージョンに基づいてロジックを統合する必要があります。
Android11で動作します
次の方法を使用します。
- 「アプリのアクセス許可のリクエスト」の記事で説明されているベストプラクティスを使用して、READ_EXTERNAL_STORAGEのアクセス許可をリクエストします。
- 直接ファイルパスを使用してファイルにアクセスします。
詳細については、「元のパスを使用したファイルへのアクセス」を参照してください。
Android10で動作します
アプリのターゲットAPIがAndroid10(APIレベル29)の場合は、パーティションストレージを無効にし、Android9以下で使用されているのと同じ方法を引き続き使用してそのような操作を実行してください。
Android9以下で動作します
次の方法を使用します。
-
「アプリの権限のリクエスト」の記事で説明されているベストプラクティスを使用して、権限をリクエストし
WRITE_EXTERNAL_STORAGE
ます。 -
直接ファイルパスを使用してファイルにアクセスします。
ドキュメントファイルを開く
ACTION_OPEN_DOCUMENT
インテントを使用 して、システムセレクターを介して開くファイルを選択するようにユーザーに要求します。システムセレクターによってユーザーに表示されるファイルタイプをフィルター処理する場合は、setType()
または を使用できます EXTRA_MIME_TYPES
。
たとえば、次のコードですべてのPDF、ODT、およびTXTファイルを見つけることができます。
Kotlinコード
startActivityForResult(
Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
addCategory(Intent.CATEGORY_OPENABLE)
type = "*/*"
putExtra(Intent.EXTRA_MIME_TYPES, arrayOf(
"application/pdf", // .pdf
"application/vnd.oasis.opendocument.text", // .odt
"text/plain" // .txt
))
},
REQUEST_CODE
)
复制代码
Javaコード
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
intent.putExtra(Intent.EXTRA_MIME_TYPES, new String[] {
"application/pdf", // .pdf
"application/vnd.oasis.opendocument.text", // .odt
"text/plain" // .txt
});
startActivityForResult(intent, REQUEST_CODE);
复制代码
古い保存場所から既存のファイルを移行する
ディレクトリが特定のアプリケーションディレクトリでもパブリック共有ディレクトリでもない場合、そのディレクトリは古い保存場所と見なされます。アプリケーションが古いバージョンのストレージの場所にあるファイルを作成または使用する場合は、アプリケーションファイルをパーティションストレージからアクセスできる場所に移行し、アプリケーションに必要な変更を加えて、のファイルを使用することをお勧めします。パーティションストレージ。
データ移行のために古い保存場所へのアクセスを維持する
アプリは、パーティション化されたストレージからアクセスできる場所にファイルを移行できるように、古いストレージの場所へのアクセスを保持する必要があります。使用する方法は、アプリケーションのターゲットAPIレベルによって異なります。
アプリケーションのターゲットプラットフォームがAndroid11の場合
-
preserveLegacyExternalStorage
マーカーを使用 して古いストアモデルを保持し、アプリケーションをユーザーアプリケーションに含めて、ターゲットプラットフォームを新しいバージョンのAndroid11にアップグレードしてユーザーデータを移行できるようにします。注:preserveLegacyExternalStorage を使用する場合 、古いストレージモデルを維持する効果は、ユーザーがアプリケーションをアンインストールするまでのみ有効です。ユーザーがAndroid11を実行しているデバイスにアプリをインストールまたは再インストールし た場合、preserveLegacyExternalStorageの値に関係なく 、アプリはパーティションストレージモデルを無効にすることはできません。
-
引き続きストレージパーティションを無効にして、アプリケーションがAndroid10のレガシーストレージの場所を実行しているデバイス上のファイルに引き続きアクセスできるようにします。
アプリケーションのターゲットプラットフォームがAndroid10の場合
パーティションストレージを無効にして、複数のAndroidバージョン間でアプリの同じ動作をより簡単に維持できるようにします。
アプリケーションデータの移行
アプリケーションを移行する準備ができたら、次の方法を使用します。
- アプリケーションが、
/sdcard/
ディレクトリまたはそのサブディレクトリにあるファイルを作業で使用しているかどうかを確認 します。 - アプリケーションのすべてのプライベートファイルを現在の
/sdcard/
ディレクトリgetExternalFilesDir()
からメソッドによって返されるディレクトリ に移動します 。 - すべての共有非メディアファイルを現在の
/sdcard/
ディレクトリから/sdcard/
ディレクトリの下のアプリケーション固有のサブディレクトリに移動します。 /sdcard/
古いストレージディレクトリのアプリケーションディレクトリの削除から 。
他のアプリとコンテンツを共有する
FileProviderを使用し て、アプリケーションファイルを他のアプリケーションと共有できます。また、相互にファイルを共有する必要があるすべてのアプリケーションについては、コンテンツプロバイダーを使用するアプリケーションごとに、データ収集を同期するアプリを追加することをお勧めします。
メディア以外のファイルをキャッシュする
使用する方法は、キャッシュする必要のあるファイルの種類によって異なります。
-
小さなファイルまたは機密情報を含むファイル: Context#getCacheDir()を使用
-
大きなファイルまたは機密情報を含まないファイル: Context#getExternalCacheDir()を使用
パーティションストレージを一時的に無効にする
アプリケーションがパーティションストレージと完全に互換性がある前に、次のいずれかの方法でパーティションストレージを無効にすることができます。
- ターゲットプラットフォームはAndroid9(APIレベル28)以下に設定されています。
- ターゲットプラットフォームがAndroid10(APIレベル29)以降の場合は、アプリケーションマニフェストのrequestLegacyExternalStorageプロパティを「true」に設定します。
<manifest ... >
<!-- 该属性在目标 API 为 Android 10 或更高版本的应用中默认为 "false" -->
<application android:requestLegacyExternalStorage="true" ... >
...
</application>
</manifest>
复制代码
注:アプリのターゲットAPIをAndroid 11(APIレベル30)に更新した後、アプリがAndroid 11デバイスで実行されている場合、システムはrequestLegacyExternalStorage属性を無視します。したがって、アプリケーションは、パーティションストレージをサポートし、ユーザーがデータを移行するためにデバイスを使用できるように準備する必要があります。
パーティションストレージを使用するときにターゲットAPIがAndroid9以下であるアプリの動作をテストするためにrequestLegacyExternalStorage
、値をfalseに設定することで、アプリが動作を有効にすることを選択できるようにすることが できます。Android 11デバイスでテストする場合は、テストアプリケーションのパーティションストレージがある場合とない場合で、アプリケーション互換性フラグの動作を使用することもできます。
Androidプラットフォームでのファイルの保存とアクセスの詳細については、次のリソースを参照してください。
ストレージスペースを使用するための最新のベストプラクティスについて詳しく知りたい場合は、Androidの公式中国語ドキュメントウェブサイトの「Androidストレージのユースケースとベストプラクティス」セクションを参照してください。
著者:Android_開発者
リンク:https://juejin.im/post/6886618088826273800