android 隐式意图编辑未能加载图像

android implicit intent edit failed to load image

这是我在设备上调用图像编辑应用程序的隐含意图:

startActivity(new Intent(Intent.ACTION_EDIT).setDataAndType(myUri,
     getMimeType(myUri)).setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | 
     Intent.FLAG_GRANT_WRITE_URI_PERMISSION));

这就是我获取 MimeType 的方式:

public String getMimeType(Uri uri) {
    String mimeType = null;
    if (uri.getScheme().equals(ContentResolver.SCHEME_CONTENT)) {
        ContentResolver cr = getContentResolver();
        mimeType = cr.getType(uri);
    } else {
        String fileExtension = MimeTypeMap.getFileExtensionFromUrl(uri
                .toString());
        mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(
                fileExtension.toLowerCase());
    }
    return mimeType;
}

某些应用程序加载时崩溃:

在应用程序 Sketch_Camera 上只有一个不可见的页面加载并禁用与我的应用程序的交互。

在应用程序 AirBrush 上它加载应用程序但崩溃并显示此消息 "Failed to load image"。

我的是16,和最低sdk版本有关吗? 我也在 9 的最低 sdk 版本上对此进行了测试,结果没有变化。

为了与所有应用程序一起使用,我还应该添加什么其他内容吗?

我也试过 putExtra 但没有用:

.putExtra(Intent.ACTION_EDIT, myUri);

我的设备上有一些图库应用程序,它们都可以正常启动 Sketch_CameraAirBrush

这里发生了什么?经过两天与这种现象的斗争,我很困惑。

It's a file created from path of one media store file by querying MediaStore.Images.Media.EXTERNAL_CONTENT_URI

不保证其他应用程序有权访问此位置,甚至您的 应用程序有权访问此位置。例如,图像可能位于 removable storage. Besides, the file Uri scheme is being banned for cross-app usage,无论如何。

改用 content Uri。例如,在 this sample app 中,我查询 MediaStore 中的视频。给定位于特定视频的名为 rowCursor,我通过以下方式为其生成 Uri

videoUri=
    ContentUris.withAppendedId(
      MediaStore.Video.Media.EXTERNAL_CONTENT_URI, row.getInt(row.getColumnIndex(MediaStore.Video.Media._ID)));

Uri 既可用于我自己的目的(例如,交给 Picasso 获取缩略图,交给 VideoView 进行播放),也可用于交给第三方应用程序(例如,ACTION_VIEW 播放)。

除了将基 Uri 更改为您查询的那个 (MediaStore.Images.Media.EXTERNAL_CONTENT_URI) 之外,相同的基本代码应该适用于您。

此外,从您的 Intent 中删除标记。这些仅适用于 Intent 指向您自己的 ContentProvider 的情况,您的原始代码或您从 withAppendedId() 创建的 Uri 都不是这种情况。