在app'中共享图像;通过Android上的ContentProvider创建数据目录

在app'中共享图像;通过Android上的ContentProvider创建数据目录,android,android-intent,android-contentprovider,Android,Android Intent,Android Contentprovider,我试图通过ContentProvider公开位于我的应用程序的/data目录中的.png文件,但没有访问调用的openFile方法query。现在,我只有一个图像需要公开给其他应用程序共享,我如何设置我转到openFile而不是query Intent shareImageIntent = new Intent(Intent.ACTION_SEND); shareImageIntent.setType("image/*"); shareImag

我试图通过ContentProvider公开位于我的应用程序的/data目录中的.png文件,但没有访问调用的
openFile
方法
query
。现在,我只有一个图像需要公开给其他应用程序共享,我如何设置我转到
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
或者,我需要为此创建一个数据库并返回一个游标吗

更新

所以,除了短信应用程序(这是我决定首先测试的)之外,这似乎在所有方面都起作用。不过,我想支持分享

以下是相关的堆栈跟踪:

原因:java.lang.IllegalArgumentException:上的查询 content://mypackage.myprovider/someImage.png 返回空结果。在 com.android.mms.ui.UriImage.initFromContentUri(UriImage.java:104)位于 com.android.mms.ui.UriImage.(UriImage.java:63)位于 com.android.mms.model.ImageModel.initModelFromUri(ImageModel.java:83) 在com.android.mms.model.ImageModel.(ImageModel.java:65)上 com.android.mms.data.WorkingMessage.changeMedia(WorkingMessage.java:481) 在 com.android.mms.data.WorkingMessage.setAttachment(WorkingMessage.java:375)

因此,SMS应用程序正在执行一个查询,而不是直接从
openFile
读取,而我手机上的其他应用程序(包括其他谷歌应用程序)似乎都是这样做的


有人知道我需要返回什么来适当地完成查询吗?我现在要开始AOSP挖掘。

共享图像资源的一种更简单的方法是将其保存到外部存储器(SD卡),然后执行以下操作:

Uri imageUri = Uri.fromFile(pathToFile);
更新:

试用

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

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

String url = Media.insertImage(context.getContentResolver(), imageFile.getAbsolutePath(), imageFile.getName(), imageFile.getName());

Uri imageUri = Uri.parse(url);
最终更新使用
ContentProvider
光标


您的
ContentProvider
必须实现
query(..)
方法,并且它必须返回
游标。请参阅(MMS应用程序内部使用)以了解如何调用游标。查看是否符合要求。

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

这是一个快速而肮脏的例子:

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

干杯

在翻阅了短信(MMS)应用程序的源代码后,我想到了这一点

UriImage.initFromContentUri
内部,应用程序生成查询代码,并假设
光标中有2个返回列

 } else {
   filePath = c.getString(c.getColumnIndexOrThrow(Images.Media.DATA));
   mContentType = c.getString(c.getColumnIndexOrThrow(Images.Media.MIME_TYPE));
 }

因此,为了让您的
ContentProvider
使用彩信应用程序,您需要在
query
中返回一个
光标,该光标只有一行和两列(Images.Media.DATA&Images.Media.MIME_TYPE)以及相应的数据。然后,彩信将调用
openFile
,以实际检索图像

我特别想访问我的内存。默认情况下,我使用的是外部SD卡,但如果它不可用,我需要一个备用。看看这个:如果用户没有SD卡怎么办?奇怪但有可能。@Francisco这就是我试图解决的问题(不仅仅是SD,还有外部存储)。@Peter,这个问题是处理应用程序资源中的事情,我的图像是动态创建的,然后保存到本地目录中。是的,没错。尝试通过将文件保存到媒体商店来解决问题。是的,我的ContentResolver工作正常,问题是SMS应用程序没有正确使用它。请看我的更新。这个伟大的答案Thx!还请注意,这些列不是请求的,但需要为sms应用程序填写。