当应用程序无法使用content:// URI时,我该怎么办?

时间:2017-09-01 08:08:04

标签: android

我的应用程序可以选择将ACTION_CAPTURE_IMAGE意图传递到相机应用程序帖子,我提供了一个选项,可以使用可以裁剪它的任何可用应用程序裁剪图像。现在,由于Google照片目前在许多设备上默认可用,事实证明Google照片是唯一可用于裁剪的应用程序。

现在,捕获或裁剪没有问题API级别< = 23上的图片,但API级别为24,Android的安全模型已进行更改,现在为we are not allowed to expose a file:// URI directly through an Intent。这也在SO上进行了讨论:

android.os.FileUriExposedException: file:///storage/emulated/0/test.txt exposed beyond app through Intent.getData()

解决方案使用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);
    }

1 个答案:

答案 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://路径。确实好笑。