在app'中共享图像;通过Android上的ContentProvider创建数据目录
我试图通过ContentProvider公开位于我的应用程序的/data目录中的.png文件,但没有访问调用的在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
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应用程序填写。