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

时间:2011-08-24 14:56:37

标签: 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应用程序之外的所有内容(这是我决定先测试的内容)但是我想支持共享它。

这是相关的堆栈跟踪:

  

引起: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挖掘。

3 个答案:

答案 0 :(得分:4)

在深入了解SMS(MMS really)应用程序的源代码之后,这就是我想出来的。

UriImage.initFromContentUri内部,应用程序生成查询代码,并假设Cursor

中有2个返回的列
 } 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);

最终更新使用ContentProviderCursor

您的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());

干杯!