gpt4 book ai didi

android - 从 Android Lollipop 中的 Uri 裁剪照片后总是返回 Null?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:28:11 25 4
gpt4 key购买 nike

我尝试在拍照或选择图片后从 Uri 裁剪图像。我的代码是这样的:

public static void cropImage(Uri uri, Activity activity, int action_code) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", 600);
intent.putExtra("outputY", 600);
intent.putExtra("scale", true);
intent.putExtra("return-data", true);
if (intent.resolveActivity(activity.getPackageManager()) != null) {
activity.startActivityForResult(intent, action_code);
} else {
Toast.makeText(activity, "No Crop App Available", Toast.LENGTH_SHORT).show();
}
}

然后像这样重写 onActivityResult():

if (resultCode == Activity.RESULT_OK && requestCode == Utils.CODE_CROP_IMAGE) {
Bundle extras = data.getExtras();
showCenterToast("ccc");
if (extras != null) {
showCenterToast("CCC");
Bitmap photo = extras.getParcelable("data");
ivAvatar.setImageBitmap(photo); // display image in ImageView
FileOutputStream fos = null;
try {
fos = new FileOutputStream(Utils.AVATAR_FILE);
photo.compress(Bitmap.CompressFormat.PNG, 100, fos);// (0-100)compressing file
showCenterToast("DDD");
Utils.AVATAR_FILE_TMP.delete();
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
IoUtil.closeSilently(fos);
}
}
}

在 Android Pre-Lollipop 设备上,我能够获取 Bitmap photo 并将其显示在 ImageView 中。 但是,在 Android Lollipop 上,我总是从 data.getExtras(); 得到 null

我在谷歌上搜索了很多,但没有找到关于在 Android Lollipop 上裁剪图像的有用信息。

Android 改变了它在 Lollipop 上 com.android.camera.action.CROP 裁剪的返回机制。那么,新机制是什么?在 Lollipop 上裁剪后如何获取返回的 Bitmap

任何提示将不胜感激。提前致谢。

最佳答案

我认为您的问题与 Android 版本无关,而是您要裁剪的图像。在类 com.android.gallery3d.filtershow.crop.CropActivity#BitmapIOTask 中处理裁剪图像。当图片太大无法返回时,会尝试返回图片的thumb,有时会返回null。为避免这种情况,您可以通过设置 intent.putExtra(MediaStore.EXTRA_OUTPUT, tmpUri); 来获取裁剪图像而不是位图的 uri,其中 tmpUri 是为保存而创建的 uri结果。然后你可以从 tmpUri 中获取位图。

示例代码:

private static final String IMAGE_FILE_LOCATION = "file:///sdcard/temp.jpg";//temp file
private static Uri tmpUri = Uri.parse(IMAGE_FILE_LOCATION);//The Uri to store the big bitmap

public static void cropImage(Uri uri, Activity activity, int action_code) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", 600);
intent.putExtra("outputY", 600);
intent.putExtra("scale", true);
intent.putExtra(MediaStore.EXTRA_OUTPUT, tmpUri);
if (intent.resolveActivity(activity.getPackageManager()) != null) {
activity.startActivityForResult(intent, action_code);
} else {
Toast.makeText(activity, "No Crop App Available", Toast.LENGTH_SHORT).show();
}
}

在函数 onActivityResult 中:

if (resultCode == Activity.RESULT_OK && requestCode == Utils.CODE_CROP_IMAGE) {
// Bundle extras = data.getExtras();
Uri uri = data.getData();
showCenterToast("ccc");
if (uri != null) {
showCenterToast("CCC");
// Bitmap photo = null;
// if (tmpUri != null) {
// photo = decodeBitmapFromUri(tmpUri); // Get bitmap from uri.
// }

Bitmap photo = decodeUriAsBitmap(uri);
ivAvatar.setImageBitmap(photo); // display image in ImageView
FileOutputStream fos = null;
try {
fos = new FileOutputStream(Utils.AVATAR_FILE);
photo.compress(Bitmap.CompressFormat.PNG, 100, fos);// (0-100)compressing file
showCenterToast("DDD");
Utils.AVATAR_FILE_TMP.delete();
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
IoUtil.closeSilently(fos);
}
} else {
showCenterToast("Uri is NULL");
}
}

private Bitmap decodeUriAsBitmap(Uri uri){
Bitmap bitmap = null;
try {
bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri));
} catch (FileNotFoundException e) {
e.printStackTrace();
return null;
}
return bitmap;
}

我没有测试我的代码是否正确,但我认为你可以修复错误。

关于android - 从 Android Lollipop 中的 Uri 裁剪照片后总是返回 Null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31262080/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com