【问题标题】:Converting file:// scheme to content:// scheme将 file:// 方案转换为 content:// 方案
【发布时间】:2011-09-12 04:10:04
【问题描述】:

我在使用 Droid X 的文件应用程序和 Astro 文件管理器选择图像文件时遇到问题。这两个应用程序使用方案“file://”返回所选图像,而 Gallery 使用方案“content://”返回图像。如何将第一个模式转换为第二个模式。或者如何解码第二种格式的图像?

【问题讨论】:

    标签: android uri external file-uri


    【解决方案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,它们将无效或随机引用新卡上的文件.
      猜你喜欢
      • 1970-01-01
      • 2019-03-10
      • 2020-06-07
      • 1970-01-01
      • 2022-07-27
      • 1970-01-01
      • 1970-01-01
      • 2012-08-22
      • 1970-01-01
      相关资源
      最近更新 更多