web-dev-qa-db-fra.com

Obsolète "getBitmap" avec l'API 29. Des codes alternatifs?

Mon onActivityResult ne fonctionne pas car getBitmap est obsolète, des codes alternatifs pour y parvenir?

voici les codes à changer, des suggestions?

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

le getBitmap est traversé et dit son obsolète

10
jaedster medina

Cela a fonctionné pour moi,

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

Cela a bien fonctionné pour moi à Java

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

Vérifiez le doc officiel:

Cette méthode a été déconseillée au niveau de l'API 29. Le chargement des images doit être effectué via ImageDecoder#createSource(ContentResolver, Uri) , qui offre des fonctionnalités modernes comme PostProcessor.

5
Gabriele Mariotti

Vous pouvez utiliser:

    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

J'ai créé une classe pour charger un Bitmap depuis 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);
        }
    }
   }

Juste pour vous faire gagner du temps ...

1
t7bdh3hdhb

Il était évident que l'API getBitmap ne fonctionne pas avec le dernier Android SDK - 29. Donc, cela a fonctionné pour moi

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

S'il vous plaît laissez-moi savoir si cela ne fonctionne pas pour l'un d'entre vous, d'autres options seront possibles!

0
Aashish Chaubey

Avez-vous essayé cela?

val bitmap = ImageDecoder.createSource(contentResolver, uri)

0
Alberto Sáez Vela

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

fonctionne bien, mais pour pouvoir utiliser ce code, mindSdkVersion doit avoir au moins 28.

0
TonyMontana