我正在尝试通过 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/