2011-08-24 24 views
5

我试图通过ContentProvider公开位于我的应用程序的/ data目录中的.png文件,但不是达到openFile方法query正在被调用。现在我只有一个图像需要公开以便与其他应用程序共享,我如何设置我的意图以转到openFile而不是query通过Android上的ContentProvider在应用程序的数据目录中共享图像

Intent shareImageIntent = new Intent(Intent.ACTION_SEND); 

      shareImageIntent.setType("image/*"); 

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

凡乌里看起来像

content://my.package.contentprovider/fileName 

或替代地,我需要为此建立一个数据库,并返回一个指针?

UPDATE

因此,这似乎是工作之外的所有的短信应用(这是我决定测试第一)我想不过来支持共享它。

以下是有关堆栈跟踪:

产生的原因:java.lang.IllegalArgumentException异常:在 内容查询://mypackage.myprovider/someImage.png返回null结果。在 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) ...

所以短信应用程序正在执行一个查询,而不是直接从openFile读书,这对每一个其他应用程序我手机似乎在做(包括ot她的谷歌应用程序)

有谁知道我需要返回这里fullfil查询适当?我现在要去AOSP挖掘。

回答

4

在深入了解SMS(MMS真正的)应用程序的源代码之后,我就想到了这一点。

UriImage.initFromContentUri的应用使得查询代码,并假设有2返回的列在Cursor

} 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实际检索图像。

+0

Thx这个伟大的答案! – Snicolas

+0

另请注意,列未被请求,但需要填写短信应用程序。 – Snicolas

2

共享图像资源更简单的方法是将其保存到外部存储设备(SD卡),然后执行:

Uri imageUri = Uri.fromFile(pathToFile); 

更新:

尝试使用

Uri imageUri = Uri.parse("android.resource://com.package.yourapp/" +imageResID); 

Update2

尝试保存文件到媒体商店,然后将其发送:

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是否符合法案。

+0

我特别试图访问我的内存。我默认使用外部,但如果它不可用,我需要一个后备。 – smith324

+0

看看这个:http://stackoverflow.com/questions/7175498/why-doesnt-this-code-attach-an-image-to-mms-message –

+0

如果用户没有SD卡?奇怪但可能。 –

0

如果您的内容提供者已经在工作,则可以通过内容提供者中的方法openFileDescriptor访问ParcelFileDescriptor。

一个快速和肮脏的,比如这个:

ParcelFileDescriptor descriptor = mContext.getContentResolver().openFileDescriptor(IMGURI, "r"); 
Bitmap bmp = BitmapFactory.decodeFileDescriptor(descriptor.getFileDescriptor()); 

干杯!

+0

是的我的ContentResolver工作正常,问题是SMS应用程序没有正确使用它。请参阅我的更新。 – smith324

相关问题