【发布时间】:2015-09-24 13:23:36
【问题描述】:
我在拍照或挑选照片后尝试从 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。
我在 Google 上搜索了很多,但几乎没有关于在 Android Lollipop 上裁剪图像的有用信息。
Android 更改了其在 Lollipop 上裁剪 com.android.camera.action.CROP 的返回机制。那么,新机制是什么?在 Lollipop 上裁剪后如何获得返回的Bitmap?
任何提示将不胜感激。提前致谢。
【问题讨论】:
-
我从来没有做过 CROP,但是你能检查一下你是否从 data.getData() 得到了什么吗?它可能是一个 URI?
-
我拍照后得到
data.getData()的Uri,拍照后成功转换成Uri。我用这个Uri进行裁剪,但在Bitmap photo = extras.getParcelable("data");按照建议完成裁剪过程后什么也没有。 -
我的意思是当 requestCode == Utils.CODE_CROP_IMAGE 时检查数据中的所有内容。可能里面有 Uri,也可能裁剪后的图片也在 content provider 中。
-
当当前版本等于或大于 Lollipop 时,我尝试了
Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), data.getData());,但抛出了 NPE。在 Lollipop 上,我确实认为返回了数据,但我不知道它在哪里以及如何获取它。 -
你有解决办法吗?
标签: android crop onactivityresult