Android:通过 content:// URI 从第三方应用程序(例如 WhatsApp)获取图像位图
Android: Getting image bitmap from third party app (e.g. WhatsApp) via content:// URI
我正在尝试从第三方应用程序(例如 WhatsApp)获取图像到我的应用程序(在 Marshmallow 上进行测试)。当我从 WhatsApp 执行"共享图像"并与我的应用程序共享时,我得到的 URI 是这样的:
content://com.whatsapp.provider.media/item/61025
|
但在我的应用程序中,当我使用上述 URI 调用
java.lang.SecurityException: Permission Denial: opening provider
com.whatsapp.MediaProvider from ProcessRecord{a4b804a
30321:com.myapp/u0a145} (pid=30321, uid=10145) that is not exported
from uid 10083
到目前为止我尝试了什么
我在 SO 上查找了此异常,发现提出了类似的问题,但要从 Google Photos 导入图像并需要添加以下权限:
但对此不以为然,因为可能有很多应用程序,需要为每个应用程序添加权限或什么。
在其他一些答案中,建议立即从内容提供者读取/复制数据。但不确定如何。因为我在
我还必须提到,WhatsApp 图像可以成功地与其他应用程序(例如 Google Drive)共享,所以必须有一些方法可以做到这一点。
请有人对此提供分享提示或可行的解决方案吗?
相关讨论
- 您是否有权从外部存储读取并在运行时检查它?
- 该提供程序未导出,只有一些有限的包子集可以访问它(如谷歌驱动器),但您的应用程序不允许这样做
- @Nabin 是的,我有权限
- @pskink如果是这种情况,那么标准是什么。因为我尝试使用其他一些非 Google 应用程序(例如图像编辑器应用程序 InShot、文件传输 Xender)并且它可以与它们一起使用。无论如何是记录在任何地方请分享链接。谢谢。
- 发布您尝试过的代码,包括清单。仅从 WhatsApp 或从其他应用程序共享时是否会出现此问题?从画廊呢?
-
@Nabin我观察到的是,当我的应用程序通过内容uri(
content: )而不是当它获取文件uri(file: )时,会发生这种情况。由于画廊和其他应用程序我尝试使用文件 uri 共享他们的图像,所以我没有得到异常。但是 WhatsApp 给了我它图片的内容 uri。 -
@Nabin:应用程序代码太大,无法共享。但是只要涉及到这次崩溃,就没有什么了。我只是将输入 URI 传递给
getContentResolver().openInputStream(uri) 并且它在那里崩溃,尤其是当 uri 是来自 WhatsApp 的内容 uri 时。
好的。我发现问题出在哪里。在我的应用程序的初始活动中,我将内容 URI(我从 WhatsApp 或 Chrome 等第三方应用程序获得,例如 content://com.whatsapp.provider.media/item/61025)存储在一个数组中,并从其他活动。
那是不正确的。我从这个答案中得到了提示,我在获得共享内容后立即从应用程序的启动器活动中调用了
相关讨论
- 您能否提供示例代码以从内容获取路径://com.whatsapp.provider.media/item/45856
-
不要尝试从 URI 获取路径 它不是处理 URI 的正确方法。而是使用
getContentResolver().openInputStream(uri) - getContentResolver().openInputStream(uri) 它返回什么??我完全糊涂了
-
getContentResolver().openInputStream 返回InputStream 您需要读取共享数据。例如,如果是图像数据,您可以调用BitmapFactory.decodeStream 。请谷歌如何从InputStream 读取数据。 - 感谢您的解释,我解决了。它从 BitmapFactory.decodeStream 返回位图,从那里我得到了路径。花了 2 天哇! 1 为您提供帮助。