我使用Google Photo应用程序选择图库照片,然后当我裁剪图片并保存时,它会捕获异常,这是我的代码:
goto_picture.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
intent = new Intent(Intent.ACTION_PICK, null);
intent.setDataAndType(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
IMAGE_UNSPECIFIED);
startActivityForResult(intent, PHOTO_ZOOM);
dialog.cancel();
}
});
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK) {
if (requestCode == PHOTO_GRAPH) {
startPhotoZoom(Uri.fromFile(file));
String imagePath = SystemUtils.getSDPath() + "/temp.jpg";
File picture = new File(imagePath);
if (picture.exists()) {
pictureBitmap = BitmapFactory.decodeFile(imagePath);
ImageUtils.SaveCacheBitmap(pictureBitmap);
rvEditAvatar.setImageBitmap(pictureBitmap);
}
}
if (requestCode == PHOTO_ZOOM) {
startPhotoZoom(data.getData());
}
if (requestCode == PHOTO_RESULT) {
Bundle extras = data.getExtras();
if (extras != null) {
pictureBitmap = extras.getParcelable("data");
ByteArrayOutputStream stream = new ByteArrayOutputStream();
pictureBitmap.compress(Bitmap.CompressFormat.JPEG, 100,
stream);
ImageUtils.SaveCacheBitmap(pictureBitmap);
rvEditAvatar.setImageBitmap(pictureBitmap);
}
}
}
}
public void startPhotoZoom(Uri uri) {
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", 180);
intent.putExtra("outputY", 180);
intent.putExtra("return-data", true);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
startActivityForResult(intent, PHOTO_RESULT);
}
logcat的:
流程:com.google.android.apps.photos,PID:7031 java.lang.RuntimeException:无法恢复活动 {} com.google.android.apps.photos/com.google.android.apps.photos.photoeditor.intents.EditActivity: java.lang.UnsupportedOperationException:No' output'额外指定 并且无法保存到指定的inputUri: 内容://com.google.android.apps.photos.contentprovider/0/1/content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F72072/ACTUAL
答案 0 :(得分:0)
如异常所述,您必须指定输出额外的内容,如下面的代码。
intent.putExtra(MediaStore.EXTRA_OUTPUT, someOutPutPath);
如果裁剪大图像可能导致崩溃,则返回数据不安全。我认为这就是为什么它迫使你使用额外的输出而不是直接使用数据。因此,您也可以将return-data设置为false:
intent.putExtra("return-data", false);
答案 1 :(得分:0)
我今天遇到了这个问题,并通过仔细检查数据传回来解决。我在Android L和Android 4上测试以下代码。在Android L上,fileUri
不是空的,而在Android L之前我们得到了fileUri
null(在这种情况下,我只通过getData
得到了位图)。
private Bitmap decodeBitmapFromCrop(Intent data) {
Bundle extras = data.getExtras();
Bitmap photo = null;
if (extras != null) {
photo = extras.getParcelable("data");
} else {
Uri fileUri = data.getData();
if (fileUri != null) {
try {
photo = MediaStore.Images.Media.getBitmap(getContentResolver(), fileUri);
} catch (IOException e) {
XXLog.d(TAG, "Media.getBitmap", e);
}
}
}
return photo;
}