将 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:// 方案的主要内容,如果未能解决你的问题,请参考以下文章

将pil图像转换为gtk pixbuf

将文件名转换为 file:// URL

file_get_contents(): No such host is known 错误

我可以使用 XSLT 将 OpenOffice ODT 内容 (content.xml) 转换为 HTML 吗?

将上传的 JPEG 转换为渐进式并在 PHP 中上传到服务器

Right ImageMagick 通过 php 从 yr.no 将 svg 转换为 png