将 file:// 方案转换为 content:// 方案
Posted
技术标签:
【中文标题】将 file:// 方案转换为 content:// 方案【英文标题】:Converting file:// scheme to content:// scheme 【发布时间】:2011-09-12 04:10:04 【问题描述】:我在使用 Droid X 的文件应用程序和 Astro 文件管理器选择图像文件时遇到问题。这两个应用程序使用方案“file://”返回所选图像,而 Gallery 使用方案“content://”返回图像。如何将第一个模式转换为第二个模式。或者如何解码第二种格式的图像?
【问题讨论】:
【参考方案1】:您可能希望将 content:// 转换为 file://
对于图库图片,请尝试以下操作:
Uri myFileUri;
Cursor cursor = context.getContentResolver().query(uri,new String[]android.provider.MediaStore.Images.ImageColumns.DATA, null, null, null);
if(cursor.moveToFirst())
myFileUri = Uri.parse(cursor.getString(0)).getPath();
cursor.close
【讨论】:
在我阅读之前解决了这个问题。但这就是我所做的。无论如何,我可以通过修剪“file://”并将其传递给 BitmapFactory.decodeFile 来支持 Files 和 Astro 以 file:// 格式返回数据。感谢您的回复。Uri.getPath()
返回一个String
,否则会为此 +1,因为它有效。【参考方案2】:
这里的问题是,对于所有文件,我们不能有一个内容 Uri (content://)。因为内容 uri 适用于属于MediaStore
的那些文件。例如:图像、音频和视频。
但是,对于支持的文件,我们可以找到它的绝对路径。喜欢的图片如下-
File myimageFile = new File(path);
Uri content_uri=getImageContentUri(this,myimageFile);
通用方法如下。
public static Uri getImageContentUri(Context context, File imageFile)
String filePath = imageFile.getAbsolutePath();
Cursor cursor = context.getContentResolver().query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
new String[] MediaStore.Images.Media._ID ,
MediaStore.Images.Media.DATA + "=? ",
new String[] filePath , null);
if (cursor != null && cursor.moveToFirst())
int id = cursor.getInt(cursor
.getColumnIndex(MediaStore.MediaColumns._ID));
Uri baseUri = Uri.parse("content://media/external/images/media");
return Uri.withAppendedPath(baseUri, "" + id);
else
if (imageFile.exists())
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.DATA, filePath);
return context.getContentResolver().insert(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
else
return null;
【讨论】:
【参考方案3】:使用 ContentResolver.openInputStream() 或相关方法访问字节流。您通常不应该担心它是 file: 还是 content: URI。
http://developer.android.com/reference/android/content/ContentResolver.html#openInputStream(android.net.Uri)
【讨论】:
有时您希望能够将您从某个应用程序获得的 URI 传递给另一个应用程序。然后转换很有用,因为一些应用程序对它们接受什么样的 URI 很挑剔(我很难学会这一点。)但仍在寻找解决方案...... @hackbod,当您将 sdcard 换成另一个 sdcard 时,Uri 存在一个错误。 Uri 指向不同的图片。 这不是 Uri 错误,这只是……好吧,您期望什么? :) 如果您有一个文件的路径,并将底层文件系统交换为具有不同内容的其他文件系统,那么您就不能指望该路径有意义了。这里唯一的问题是媒体内容提供者的 URI 不是路径,而是为它扫描的每个文件创建了一个唯一的 ID。当您放入不同的 SD 卡时,旧数据库将被删除,文件将重新扫描并分配新的 id,因此如果您有来自旧卡的任何 URI,它们将无效或随机引用新卡上的文件.以上是关于将 file:// 方案转换为 content:// 方案的主要内容,如果未能解决你的问题,请参考以下文章
file_get_contents(): No such host is known 错误
我可以使用 XSLT 将 OpenOffice ODT 内容 (content.xml) 转换为 HTML 吗?