android隐式意图编辑无法加载图片

时间:2016-06-28 10:44:06

标签: android android-intent edit android-implicit-intent

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

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

这就是我getMimeType的方式:

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_CameraAirBrush

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

1 个答案:

答案 0 :(得分:2)

  

这是通过查询MediaStore.Images.Media.EXTERNAL_CONTENT_URI

从一个媒体商店文件的路径创建的文件

无法保证其他应用拥有此位置的权利,甚至您的应用对此位置拥有权利。例如,图片可以在removable storage上。此外,the file Uri scheme is being banned for cross-app usage,无论如何。

改为使用content Uri。例如,在this sample app中,我向MediaStore查询视频。如果某个Cursor名为row位于特定视频,我会通过以下方式生成Uri

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

Uri这两个都适用于我自己的目的(例如,交给毕加索获取缩略图,交给VideoView进行播放)以及交给第三方应用(例如{{1}播放)。

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

另外,摆脱Intent的旗帜。这些仅适用于Intent指向您自己ContentProvider的位置,而原始代码或您使用Uri创建的withAppendedId()则不是这种情况。< / p>