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

smi*_*324 5 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"));
Run Code Online (Sandbox Code Playgroud)

Uri的样子

content://my.package.contentprovider/fileName
Run Code Online (Sandbox Code Playgroud)

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

UPDATE

所以这似乎是在除了SMS应用程序之外的所有内容(这是我决定首先测试的)我想支持共享.

这是相关的堆栈跟踪:

引起:java.lang.IllegalArgumentException:对内容的查询:// mypackage.myprovider/someImage.png返回null结果.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)位于com.android.mms的com.android.mms.data.WorkingMessage.changeMedia(WorkingMessage.java:481)的com.android.mms.model.ImageModel.(ImageModel.java:65). data.WorkingMessage.setAttachment(WorkingMessage.java:375)...

所以短信应用正在执行查询而不是直接阅读openFile,我的手机上的其他应用似乎都是这样(包括其他Google应用)

有谁知道我需要返回这里以适当地填充查询?我现在要去AOSP挖掘了.

smi*_*324 4

在深入研究短信(实际上是彩信)应用程序的源代码后,这就是我想到的。

在应用程序内部UriImage.initFromContentUri编写查询代码并假设有 2 个返回列Cursor

 } else {
   filePath = c.getString(c.getColumnIndexOrThrow(Images.Media.DATA));
   mContentType = c.getString(c.getColumnIndexOrThrow(Images.Media.MIME_TYPE));
 }
Run Code Online (Sandbox Code Playgroud)

因此,为了使您ContentProvider能够使用彩信应用程序,您需要返回一个只有Cursor一行 query和两列(Images.Media.DATA 和 Images.Media.MIME_TYPE)以及适当数据的文件。然后 MMS 将调用 来openFile实际检索图像。