web-dev-qa-db-ja.com

API 29で非推奨の「getBitmap」。代替コードはありますか?

onActivityResultは廃止されているため、私のgetBitmapは機能しません。これを達成するための代替コードはありますか?

ここに変更が必要なコードがあります。提案はありますか?

val bitmap = MediaStore.Images.Media.getBitmap(contentResolver, selectedPhotoUri)

getBitmapが交差し、非推奨となった

10
jaedster medina

これは私のために働いた、

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)

        if(requestCode == 1 && resultCode == Activity.RESULT_OK && data != null) {

            val selectedPhotoUri = data.data
            try {
                selectedPhotoUri?.let {
                    if(Build.VERSION.SDK_INT < 28) {
                        val bitmap = MediaStore.Images.Media.getBitmap(
                            this.contentResolver,
                            selectedPhotoUri
                        )
                        imageView.setImageBitmap(bitmap)
                    } else {
                        val source = ImageDecoder.createSource(this.contentResolver, selectedPhotoUri)
                        val bitmap = ImageDecoder.decodeBitmap(source)
                        imageView.setImageBitmap(bitmap)
                    }
                }
            } catch (e: Exception) {
                e.printStackTrace()
            }
        }
    }
9
Ali

これは私にとってJavaでうまくいきました

ImageDecoder.Source source = ImageDecoder.createSource(this.getContentResolver(), pictureUri);
Bitmap bitmap = ImageDecoder.decodeBitmap(source);
5
davincia

公式ドキュメント: を確認してください

このメソッドはAPIレベル29で廃止されました。画像の読み込みは、PostProcessorのような最新の機能を提供する ImageDecoder#createSource(ContentResolver, Uri) を介して実行する必要があります。

5

以下を使用できます。

    private fun getCapturedImage(selectedPhotoUri: Uri): Bitmap {
        val bitmap = when {
            Build.VERSION.SDK_INT < 28 -> MediaStore.Images.Media.getBitmap(
                this.contentResolver,
                selectedPhotoUri
            )
            else -> {
                val source = ImageDecoder.createSource(this.contentResolver, selectedPhotoUri)
                ImageDecoder.decodeBitmap(source)
            }
        }
4
Hasan A Yousef

Uriからビットマップをロードするためのクラスを作成しました。

public class BitmapResolver {
    private final static String TAG = "BitmapResolver";

    @SuppressWarnings("deprecation")
    private static Bitmap getBitmapLegacy(@NonNull ContentResolver contentResolver, @NonNull Uri fileUri){
        Bitmap bitmap = null;

        try {
            bitmap = MediaStore.Images.Media.getBitmap(contentResolver, fileUri);
        } catch (IOException e) {
            e.printStackTrace();
        }

        return bitmap;
    }

    @TargetApi(Build.VERSION_CODES.P)
    private static Bitmap getBitmapImageDecoder(@NonNull ContentResolver contentResolver, @NonNull Uri fileUri){
        Bitmap bitmap = null;

        try {
            bitmap = ImageDecoder.decodeBitmap(ImageDecoder.createSource(contentResolver, fileUri));
        } catch (IOException e) {
            e.printStackTrace();
        }

        return bitmap;
    }

    public static Bitmap getBitmap(@NonNull ContentResolver contentResolver, Uri fileUri){
        if (fileUri == null){
            Log.i(TAG, "returning null because URI was null");
            return null;
        }

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P){
            return getBitmapImageDecoder(contentResolver, fileUri);
        } else{
            return getBitmapLegacy(contentResolver, fileUri);
        }
    }
   }

時間を節約するために...

1
t7bdh3hdhb

getBitmap AP​​Iが最新のAndroid SDK-29)では機能しないことは明らかでした。つまり、これは私にとってはうまくいきました

Uri contentURI = data.getData();
try {
    imageView.setImageURI(contentURI);
} catch (Exception e) {
    e.printStackTrace();
}

これがあなたのために機能しない場合は、私に知らせてください、他のオプションがあります!

0
Aashish Chaubey

これを試しましたか?

val bitmap = ImageDecoder.createSource(contentResolver, uri)

0

ImageDecoder.createSource(this.getContentResolver()、pictureUri)

正常に動作しますが、このコードを使用できるようにするには、mindSdkVersionが28以上である必要があります。

0
TonyMontana