我在旧版本中使用getBitmap方法,但我无法从Uri中找到任何替代getBitmap的方法。
try {
bitmap = MediaStore.Images.Media.getBitmap(contentResolver, imageUri);
} catch (IOException e) {
e.printStackTrace();
}现在,我从android指南中找到了另一种方法,但这是行不通的。我不知道如何在工作线程中执行此方法。向导说,此方法应该在工作线程中运行。有人能帮我做这件事吗?
try {
bitmap = ImageDecoder.decodeBitmap(ImageDecoder.createSource(contentResolver, imageUri));
} catch (IOException e) {
e.printStackTrace();
}我创建了一个简单的类来从imageUri获取位图。在这呢。
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);
}
}
}发布于 2020-12-09 05:17:38
看看文档
API级别29中不推荐此方法。图像的加载应该通过ImageDecoder#createSource(ContentResolver,Uri)来执行,后者提供了像PostProcessor这样的现代特性。
所以你必须使用ImageDecoder.createSource,就像这样:
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();
}以上应该是线程安全。
发布于 2022-04-25 07:35:49
这是给Kotlin开发者的
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
}
}https://stackoverflow.com/questions/65210522
复制相似问题