我正在尝试通过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应用程序之外的所有内容(这是我决定先测试的内容)但是我想支持共享它。
这是相关的堆栈跟踪:
引起:java.lang.IllegalArgumentException:查询 content://mypackage.myprovider/someImage.png返回null结果。在 com.android.mms.ui.UriImage.initFromContentUri(UriImage.java:104)at at com.android.mms.ui.UriImage。(UriImage.java:63)at com.android.mms.model.ImageModel.initModelFromUri(ImageModel.java:83) 在com.android.mms.model.ImageModel。(ImageModel.java:65)at com.android.mms.data.WorkingMessage.changeMedia(WorkingMessage.java:481) 在 com.android.mms.data.WorkingMessage.setAttachment(WorkingMessage.java:375) ...
因此,短信应用正在执行查询,而不是直接从openFile
进行阅读,我的手机上的其他应用似乎都是这样做(包括其他Google应用)
是否有人知道我需要返回此处以适当地填充查询?我现在要去AOSP挖掘。
答案 0 :(得分:4)
在深入了解SMS(MMS really)应用程序的源代码之后,这就是我想出来的。
在UriImage.initFromContentUri
内部,应用程序生成查询代码,并假设Cursor
} else {
filePath = c.getString(c.getColumnIndexOrThrow(Images.Media.DATA));
mContentType = c.getString(c.getColumnIndexOrThrow(Images.Media.MIME_TYPE));
}
因此,为了让您的ContentProvider
使用彩信应用,您需要在Cursor
中返回query
只有一行和两列(Images.Media.DATA) & Images.Media.MIME_TYPE)带有适当的数据。然后,MMS将调用openFile
来实际检索图像。
答案 1 :(得分:2)
共享图像资源的一种更简单的方法是将其保存到外部存储(SD卡),然后执行:
Uri imageUri = Uri.fromFile(pathToFile);
<强>更新强>
尝试使用
Uri imageUri = Uri.parse("android.resource://com.package.yourapp/" +imageResID);
<强> UPDATE2 强>
尝试将文件保存到Media Store,然后发送:
String url = Media.insertImage(context.getContentResolver(), imageFile.getAbsolutePath(), imageFile.getName(), imageFile.getName());
Uri imageUri = Uri.parse(url);
最终更新使用ContentProvider
和Cursor
:
您的ContentProvider
必须实施query(..)
方法,并且必须返回Cursor
。请参阅source code of UrlImage.initFromContentUri(..)
(MMS应用程序内部使用)以查看如何调用游标。如果它适合账单,请查看MatrixCursor
。
答案 2 :(得分:0)
如果您的内容提供商已在使用,您可以通过内容提供商中的openFileDescriptor方法访问ParcelFileDescriptor。
这是一个快速而又肮脏的例子:
ParcelFileDescriptor descriptor = mContext.getContentResolver().openFileDescriptor(IMGURI, "r");
Bitmap bmp = BitmapFactory.decodeFileDescriptor(descriptor.getFileDescriptor());
干杯!