Android:通过 content://URI 从第三方应用程序(例如 WhatsApp)获取图像位图

标签 android android-6.0-marshmallow android-permissions android-contentresolver

我正在尝试从第三方应用程序(例如 WhatsApp)获取图像到我的应用程序(正在 Marshmallow 上测试)。当我从 WhatsApp“分享图片”并与我的应用分享时,我得到的 URI 是这样的:

content://com.whatsapp.provider.media/item/61025

但是在我的应用程序中,当我调用 getContentResolver().openInputStream(uri) 时或 getContentResolver().openFileDescriptor(uri, "r")使用上述 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 上查找此异常并找到 similar question摆姿势,但要从 Google Photos 导入图片并需要添加权限,例如:

<uses-permission android:name="com.google.android.apps.photos.permission.GOOGLE_PHOTOS"/>

但对此并不满意,因为可能有很多应用程序并且需要为每个应用程序或其他什么添加权限。

在其他一些answers建议立即从内容提供者读取/复制数据。但不确定如何。因为我在 openInputStream 中遇到异常本身。

我还必须提到,WhatsApp 图片可以成功地与其他应用程序(例如 Google 云端硬盘)共享,因此必须有某种方法可以做到这一点。

请有人可以就此提供共享提示或工作解决方案?

最佳答案

好的。我发现问题出在哪里。在我的应用程序的初始 Activity 中,我将内容 URI(我从 WhatsApp 或 Chrome 等第三方应用程序获得,例如 content://com.whatsapp.provider.media/item/61025)存储在一个数组中,并从其他 Activity 。

那是正确的。我从 this 得到提示answer 并且我在获取共享内容后立即从应用程序的启动器 Activity 中调用了 getContentResolver().openInputStream(uri)。它起作用了,没有抛出任何异常。

关于Android:通过 content://URI 从第三方应用程序(例如 WhatsApp)获取图像位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46578918/

相关文章:

Android 复合控件内部点击事件

x 轴上带有日期的 Android 图表

java - 在 EditText 上禁用剪贴板建议中的粘贴

android - Assetlinks.json 中的应用链接 Intent 过滤器在 Android 上不起作用

android - ERROR_ALREADY_REQUESTING_PERMISSIONS flutter

java - 使用 Toast 处理 Fragment 类之外的异常

android - 使用 MediaSync 和 MediaExtractor 播放速度提高 2 倍

Android 5.0+ getRunningTasks 已弃用

android - 当用户接受 READ_EXTERNAL_STORAGE 权限时需要重新启动应用程序

android - 授予 FileProvider 的 uri 权限会产生 SecurityException