这是我在设备上调用图像编辑应用程序的隐含意图:
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_Camera
和AirBrush
。
这里发生了什么?经过两天与这种现象的斗争后,我感到很困惑。
答案 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
更改为您查询的基础Uri
(MediaStore.Images.Media.EXTERNAL_CONTENT_URI
)之外,相同的基本代码应该适用于您。
另外,摆脱Intent
的旗帜。这些仅适用于Intent
指向您自己ContentProvider
的位置,而原始代码或您使用Uri
创建的withAppendedId()
则不是这种情况。< / p>