在打开图像时解析Android中不同来源的URI

Tan*_*er4 4 android uri image android-intent

我的Android应用会打开图片并对其进行操作.我的活动要求打开图像,如下所示:

Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,
                                            "Complete action using"),
                                            PICK_FROM_FILE);
Run Code Online (Sandbox Code Playgroud)

执行此操作时,它会启动一个包含三到四个选项的对话框,例如ES文件资源管理器:文件,图库等.

我希望将其作为Bitmap使用BitmapFactory.decodeFile(path).

当我从ES文件资源管理器中选择文件时,路径计算如下:

String path = imageData.getData().getPath();
Run Code Online (Sandbox Code Playgroud)

但是,这不适用于从Gallery或Files中选择图像/external/images/media/38,例如path的值.

所以我做了一个检查,转换这样一个以外部开头的路径:

if (path.startsWith("/external")) {
  path = getFilePathFromUri(imageData.getData());
}

private String getFilePathFromUri(Uri uri) {
  Cursor cursor = managedQuery(uri,
                               new String[] { MediaStore.Images.Media.DATA },
                               null, null, null);
  int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
  cursor.moveToFirst();

  return cursor.getString(column_index);
}
Run Code Online (Sandbox Code Playgroud)

这会将上述路径转换为/mnt/sdcard/dcim/Camera/2011-11-13_15-33-24_304.jpg现在可用于此目的BitmapFactory.decodeFile(path).

我知道硬编码这样的检查(/ external)不是一个好主意,是否有更好的,也许是通用的方法来解析Intent中返回的URI的格式?

Vit*_*nko 8

我理解硬编码这样的检查(/ external)不是一个好主意,是否有更好的,也许是通用的方法来解析意图中返回的URI的格式?

imageData.getData()返回一个Uri.如果它的路径以file://(这是大多数文件管理器将返回的)开头,则uri表示文件.另一个选项是uri代表一个内容项(这是Gallery将返回的内容),在这种情况下,它的路径以它开头,content://你应该调用ContentProvider来获取实际的图像文件路径(就像你在样本中那样).所以我认为你可以选择这样的东西:

Uri uri = imageData.getData();
String scheme = uri.getScheme();
if ("file".equals(scheme)) {
    // process as a uri that points to a file
} else if ("content".equals(scheme)) {
    // process as a uri that points to a content item
}
Run Code Online (Sandbox Code Playgroud)