2

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

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,它会加载应用程序,但会因“加载图像失败”消息而崩溃。

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

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

我也试过 putExtra 并没有帮助:

.putExtra(Intent.ACTION_EDIT, myUri);

我的设备上有一些图库应用程序,它们都启动Sketch_Camera并且AirBrush没有任何问题。

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

4

1 回答 1

2

它是通过查询 MediaStore.Images.Media.EXTERNAL_CONTENT_URI 从一个媒体存储文件的路径创建的文件

无法保证其他应用程序有权访问此位置,甚至无法保证您的应用程序有权访问此位置。例如,图像可能位于可移动存储上。此外,无论如何,file Uri计划被禁止跨应用程序使用。

改用 a content Uri。例如,在这个示例应用程序中,我查询MediaStore视频。给定一个位于特定视频上的Cursor命名,我通过以下方式为它生成:rowUri

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

Uri既适用于我自己的目的(例如,交给毕加索以获取缩略图,也VideoView适用于播放)和交给第三方应用程序(例如,ACTION_VIEW用于播放)。

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

另外,从你的Intent. 这些仅适用于Intent指向您自己的位置ContentProvider,在您的原始代码或Uri您创建的代码中都不是这种情况withAppendedId()

于 2016-06-28T12:02:06.480 回答