首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从imageUri获取30级的位图?

如何从imageUri获取30级的位图?
EN

Stack Overflow用户
提问于 2020-12-09 04:11:26
回答 2查看 6.9K关注 0票数 3

我在旧版本中使用getBitmap方法,但我无法从Uri中找到任何替代getBitmap的方法。

代码语言:javascript
复制
        try {
            bitmap = MediaStore.Images.Media.getBitmap(contentResolver, imageUri);
        } catch (IOException e) {
            e.printStackTrace();
        }

现在,我从android指南中找到了另一种方法,但这是行不通的。我不知道如何在工作线程中执行此方法。向导说,此方法应该在工作线程中运行。有人能帮我做这件事吗?

代码语言:javascript
复制
        try {
            bitmap = ImageDecoder.decodeBitmap(ImageDecoder.createSource(contentResolver, imageUri));
        } catch (IOException e) {
            e.printStackTrace();
        }

我创建了一个简单的类来从imageUri获取位图。在这呢。

代码语言:javascript
复制
public class 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){
            return null;
        }

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

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-09 05:17:38

看看文档

API级别29中不推荐此方法。图像的加载应该通过ImageDecoder#createSource(ContentResolver,Uri)来执行,后者提供了像PostProcessor这样的现代特性。

所以你必须使用ImageDecoder.createSource,就像这样:

代码语言:javascript
复制
Bitmap bitmap = null;
ContentResolver contentResolver = getContentResolver(); 
try {
    if(Build.VERSION.SDK_INT < 28) {
        bitmap = MediaStore.Images.Media.getBitmap(contentResolver, imageUri);
    } else {
        ImageDecoder.Source source = ImageDecoder.createSource(contentResolver, imageUri);
        bitmap = ImageDecoder.decodeBitmap(source);
    }
} catch (Exception e) {
    e.printStackTrace();
}

以上应该是线程安全。

票数 10
EN

Stack Overflow用户

发布于 2022-04-25 07:35:49

这是给Kotlin开发者的

代码语言:javascript
复制
fun getBitmap(contentResolver: ContentResolver, fileUri: Uri?): Bitmap? {
    return try {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            ImageDecoder.decodeBitmap(ImageDecoder.createSource(contentResolver, fileUri!!))
        } else {
            MediaStore.Images.Media.getBitmap(contentResolver, fileUri)
        }
    } catch (e: Exception){
        null
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65210522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档