android - 通过 Android 上的 ContentProvider 在应用程序的数据目录中共享图像

标签 android android-intent android-contentprovider

我正在尝试通过 ContentProvider 公开位于我的应用程序的/data 目录中的 .png 文件,而不是到达正在调用 openFile 方法的 query 。现在我只有一张图片需要公开以共享给其他应用程序,我如何设置我的 Intent 以转到 openFile 而不是 query

Intent shareImageIntent = new Intent(Intent.ACTION_SEND);

            shareImageIntent.setType("image/*");

            shareImageIntent.putExtra(Intent.EXTRA_STREAM, imageUri);
            startActivity(Intent.createChooser(shareImageIntent, "Share image"));

Uri 的样子

content://my.package.contentprovider/fileName

或者我是否需要为此创建一个数据库并返回一个游标?

更新

所以这似乎适用于除 SMS 应用程序以外的所有应用程序(这是我决定首先测试的),但是我想支持共享到它。

这是相关的堆栈跟踪:

Caused by: java.lang.IllegalArgumentException: Query on content://mypackage.myprovider/someImage.png returns null result. at com.android.mms.ui.UriImage.initFromContentUri(UriImage.java:104) at com.android.mms.ui.UriImage.(UriImage.java:63) at com.android.mms.model.ImageModel.initModelFromUri(ImageModel.java:83) at com.android.mms.model.ImageModel.(ImageModel.java:65) at com.android.mms.data.WorkingMessage.changeMedia(WorkingMessage.java:481) at com.android.mms.data.WorkingMessage.setAttachment(WorkingMessage.java:375) ...

所以 SMS 应用程序正在执行查询而不是直接从 openFile 读取,我手机上的所有其他应用程序似乎都这样做(包括其他 Google 应用程序)

有谁知道我需要在这里返回什么来适本地完成查询?我现在要去 AOSP 挖掘。

最佳答案

在深入研究 SMS(真正的 MMS)应用程序的源代码后,这就是我想出的。

UriImage.initFromContentUri 中,应用程序生成查询代码并假设 Cursor 中有 2 个返回列

 } else {
   filePath = c.getString(c.getColumnIndexOrThrow(Images.Media.DATA));
   mContentType = c.getString(c.getColumnIndexOrThrow(Images.Media.MIME_TYPE));
 }

因此,为了让您的 ContentProvider 与 MMS 应用程序一起工作,您需要在 query 中返回一个只有一行的 Cursor 并且具有适当数据的两列(Images.Media.DATA & Images.Media.MIME_TYPE)。然后 MMS 将调用 openFile 以实际检索图像。

关于android - 通过 Android 上的 ContentProvider 在应用程序的数据目录中共享图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7177615/

相关文章:

java - android 窗口软输入模式

android - 单击按钮时如何提供 SlideUp 效果

android - 在 Android 中将字符串从一个类传递到另一个类

android - 安装应用程序的顺序正在改变行为?

android - 是安卓 :exported ="true" required for internal use of content provider

android - ContentProvider android权限

java - "Tag <Activity > attribute name has invalid character ' '. "安卓 list

android - 为什么内部存储中的 pdf 未在 Web View 中显示

java - Android 通过 id 更新自定义 XML imageView

android - Notification PendingIntent Intent extras 被另一个通知覆盖