私は単純なイメージエディタアプリを作成しているので、イメージファイルをロードして保存する必要があります。保存したファイルが別のアルバムでギャラリーに表示されるようにしてください。 Android API 28から29まで、アプリがストレージにアクセスできる範囲への劇的な変更がありました。私はAndroid Q(API 29)で欲しいものをすることができますが、その方法は後方互換性がありません。
私が低いAPIバージョンで同じ結果を達成したいとき、私はこれまでのところ、廃止予定コードの使用を必要とする(API 29の時)。
これらは以下のとおりです。
MediaStore.Images.Media.DATA
_列の使用Environment.getExternalStoragePublicDirectory(...)
を介して外部ストレージへのファイルパスを取得するMediaStore.Images.Media.insertImage(...)
を介して直接画像を挿入する私の質問は次のとおりです。そのような方法で実装することは可能です。そうでない場合は、この状況で廃止予定のコードを使用しても大丈夫ですか、それともこれらのメソッドはすぐにSDKから削除されますか?いずれにせよ、廃止予定された方法を使用するのは非常に悪いと感じています。
これは私がAPI 29と連携するのを見つけた方法です。
_ContentValues values = new ContentValues();
String filename = System.currentTimeMillis() + ".jpg";
values.put(MediaStore.Images.Media.TITLE, filename);
values.put(MediaStore.Images.Media.DISPLAY_NAME, filename);
values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
values.put(MediaStore.Images.Media.DATE_ADDED, System.currentTimeMillis() / 1000);
values.put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis());
values.put(MediaStore.Images.Media.RELATIVE_PATH, "PATH/TO/ALBUM");
getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,values);
_
その後、INSERTメソッドによって返されたURIを使用してビットマップを保存します。この問題は、フィールドRASSTRE_PATHがAPI 29で導入されたため、下位バージョンでコードを実行すると、画像が「Pictures」フォルダに入れ、「path/to/album」フォルダに入れられます。
Old APIの場合(<29)私は外部メディアディレクトリにイメージを配置し、MediascannerConnectionによってそれをスキャンします。
私のコードを見ましょう。
この関数はイメージファイルを作成します。 AppName変数に注意してください - それは画像が表示されるアルバムの名前です。
override fun createImageFile(appName: String): File {
val dir = File(appContext.externalMediaDirs[0], appName)
if(!dir.exists()) {
ir.mkdir()
}
return File(dir, createFileName())
}
_
その後、イメージをファイルに入れ、ついにこのようにメディアスキャナを実行します。
private suspend fun scanNewFile(shot: File): Uri? {
return suspendCancellableCoroutine { continuation ->
MediaScannerConnection.scanFile(
appContext,
arrayOf<String>(shot.absolutePath),
arrayOf(imageMimeType)) { _, uri -> continuation.resume(uri)
}
}
}
_