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

Android: Getting image bitmap from third party app (e.g. WhatsApp) via content:// URI

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

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

但在我的应用程序中,当我使用上述 URI 调用 getContentResolver().openInputStream(uri)getContentResolver().openFileDescriptor(uri,"r") 时,它会崩溃并出现异常:

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 导入图像并需要添加以下权限:

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

但对此不以为然,因为可能有很多应用程序,需要为每个应用程序添加权限或什么。

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

我还必须提到,WhatsApp 图像可以成功地与其他应用程序(例如 Google Drive)共享,所以必须有一些方法可以做到这一点。

请有人对此提供分享提示或可行的解决方案吗?


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

那是不正确的。我从这个答案中得到了提示,我在获得共享内容后立即从应用程序的启动器活动中调用了 getContentResolver().openInputStream(uri) 。它有效,没有抛出任何异常。