Android: 通过 content:// URI 从第三方应用程序(例如 WhatsApp)获取图像位图
Android: Getting image bitmap from third party app (e.g. WhatsApp) via content:// URI
我正在尝试从第三方应用程序(例如 WhatsApp)获取图像到我的应用程序(正在 Marshmallow 上测试)。当我从 WhatsApp 执行 "share image" 并与我的应用程序共享时,我得到的 URI 是这样的:
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 上查找了这个异常,发现 similar question 提出了但要从 Google Photos 导入图像并获得需要添加权限,如:
<uses-permission android:name="com.google.android.apps.photos.permission.GOOGLE_PHOTOS"/>
但对此不满意,因为可能有很多应用程序并且需要为每个应用程序添加权限等等。
在其他一些 中,建议立即 read/copy 来自内容提供商的数据。但不确定如何。因为我在 openInputStream
本身得到异常。
我还必须提到,WhatsApp 图像可以成功地与其他应用程序共享(例如 Google Drive),因此必须有一些方法可以做到这一点。
有人可以就此提供共享提示或工作解决方案吗?
好的。我发现问题出在哪里。在我的应用程序的初始 activity 中,我存储了内容 URI(这是我从 WhatsApp 或 Chrome 等第三方应用程序获得的,例如 content://com.whatsapp.provider.media/item/61025)在数组中并从其他 activity.
访问它
那是不正确的。我从 的回答中得到提示,并且在我获得共享内容后立即从应用程序的启动器 activity 调用了 getContentResolver().openInputStream(uri)
。它起作用了,没有抛出任何异常。
我正在尝试从第三方应用程序(例如 WhatsApp)获取图像到我的应用程序(正在 Marshmallow 上测试)。当我从 WhatsApp 执行 "share image" 并与我的应用程序共享时,我得到的 URI 是这样的:
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 上查找了这个异常,发现 similar question 提出了但要从 Google Photos 导入图像并获得需要添加权限,如:
<uses-permission android:name="com.google.android.apps.photos.permission.GOOGLE_PHOTOS"/>
但对此不满意,因为可能有很多应用程序并且需要为每个应用程序添加权限等等。
在其他一些 openInputStream
本身得到异常。
我还必须提到,WhatsApp 图像可以成功地与其他应用程序共享(例如 Google Drive),因此必须有一些方法可以做到这一点。
有人可以就此提供共享提示或工作解决方案吗?
好的。我发现问题出在哪里。在我的应用程序的初始 activity 中,我存储了内容 URI(这是我从 WhatsApp 或 Chrome 等第三方应用程序获得的,例如 content://com.whatsapp.provider.media/item/61025)在数组中并从其他 activity.
访问它那是不正确的。我从 getContentResolver().openInputStream(uri)
。它起作用了,没有抛出任何异常。