我的应用程序可以选择将ACTION_CAPTURE_IMAGE
意图传递到相机应用程序帖子,我提供了一个选项,可以使用可以裁剪它的任何可用应用程序裁剪图像。现在,由于Google照片目前在许多设备上默认可用,事实证明Google照片是唯一可用于裁剪的应用程序。
现在,捕获或裁剪没有问题API级别< = 23上的图片,但API级别为24,Android的安全模型已进行更改,现在为we are not allowed to expose a file://
URI directly through an Intent。这也在SO上进行了讨论:
解决方案使用ContentProvider
并且解决方案有效,除了现在我们用{{1而不是content://
所以,我现在向任何可用的裁剪应用程序发送file://
URI。事实证明,Google相册正在展示Toast - “此图片不支持修改”。这是因为无法处理content://
URI。现在,如果某个第三方应用程序没有处理content://
URI并且Android不允许我传递content://
URI,那么我该如何裁剪图像?
发送CROP请求以供参考的代码:
file://
这是Logcat输出:
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setType("image/*");
List < ResolveInfo > list = getPackageManager().queryIntentActivities(
intent, 0);
int size = list.size();
if (size == 0) {
Toast.makeText(this, "Can not find image crop app",
Toast.LENGTH_SHORT).show();
} else {
//intent.setData(mImageCaptureUri);
intent.setDataAndType(mImageCaptureUri, "image/*");
intent.putExtra("crop", "true");
intent.putExtra("outputX", 150);
intent.putExtra("outputY", 150);
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("scale", true);
intent.putExtra("return-data", true);
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
if (size == 1) {
Intent i = new Intent(intent);
ResolveInfo res = list.get(0);
i.setComponent(new ComponentName(res.activityInfo.packageName,
res.activityInfo.name));
startActivityForResult(i, CROP_FROM_CAMERA);
}
答案 0 :(得分:0)
您应该在意图中添加额外的putExtra()。
Google Fotos应用程序不想更改原始图像,而是告诉它不要哭泣
"Editing not supported on this image"
(再次是坏消息的一个例子)
因此,请指明可以使用以下方式保存裁剪图像的路径:
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(getTempFile(this)));
例如,getTempFile()为-non existing或existing-cache dir中的-non existing或existing-文件提供File对象。
这里有趣的是你可以在Android 7上提供一个file://路径。确实好笑。