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)共享,所以必须有一些方法可以做到这一点。
请有人对此提供分享提示或可行的解决方案吗?
- 您是否有权从外部存储读取并在运行时检查它?
-
该提供程序未导出,只有一些有限的包子集可以访问它(如谷歌驱动器),但您的应用程序不允许这样做
-
@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)存储在一个数组中,并从其他活动。
那是不正确的。我从这个答案中得到了提示,我在获得共享内容后立即从应用程序的启动器活动中调用了 getContentResolver().openInputStream(uri) 。它有效,没有抛出任何异常。
- 您能否提供示例代码以从内容获取路径://com.whatsapp.provider.media/item/45856
-
不要尝试从 URI 获取路径 它不是处理 URI 的正确方法。而是使用 getContentResolver().openInputStream(uri)
-
getContentResolver().openInputStream(uri) 它返回什么??我完全糊涂了
-
getContentResolver().openInputStream 返回 InputStream 您需要读取共享数据。例如,如果是图像数据,您可以调用 BitmapFactory.decodeStream。请谷歌如何从 InputStream 读取数据。
-
感谢您的解释,我解决了。它从 BitmapFactory.decodeStream 返回位图,从那里我得到了路径。花了 2 天哇! 1 为您提供帮助。