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_Camera
和 AirBrush
。
这里发生了什么?经过两天与这种现象的斗争,我很困惑。
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
中的视频。给定位于特定视频的名为 row
的 Cursor
,我通过以下方式为其生成 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
都不是这种情况。
这是我在设备上调用图像编辑应用程序的隐含意图:
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_Camera
和 AirBrush
。
这里发生了什么?经过两天与这种现象的斗争,我很困惑。
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
中的视频。给定位于特定视频的名为 row
的 Cursor
,我通过以下方式为其生成 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
都不是这种情况。