web-dev-qa-db-ja.com

後方互換性が残っている間、Android Qのサブディレクトリに画像を保存する方法

私は単純なイメージエディタアプリを作成しているので、イメージファイルをロードして保存する必要があります。保存したファイルが別のアルバムでギャラリーに表示されるようにしてください。 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」フォルダに入れられます。

13
multimodcrafter

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)
        }
    }
}
 _
0
Alex Shevelev