Разрешение URI из разных источников в Android при открытии изображения - PullRequest
4 голосов
/ 14 ноября 2011

Мое приложение для Android открывает изображения и манипулирует ими.Моя активность запрашивает открытие изображения следующим образом:

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

При этом он запускает диалоговое окно с тремя-четырьмя параметрами, такими как ES File Explorer: Файлы, Галерея и т. Д.

Я хочу прочитать это как растровое изображение, используя BitmapFactory.decodeFile(path).

Когда я выбираю файл из ES File Explorer, путь вычисляется следующим образом:

String path = imageData.getData().getPath();

Однако этоне работает выбор изображения из галереи или файлов, где значение пути, например, /external/images/media/38.

Поэтому я поставил галочку, чтобы преобразовать такой путь, который начинается с external используя:

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);
}

Это преобразует вышеуказанный путь в /mnt/sdcard/dcim/Camera/2011-11-13_15-33-24_304.jpg, и теперь это работает для BitmapFactory.decodeFile(path).

Я понимаю, что жесткое кодирование такой проверки (/ external) нехорошая идея, есть ли лучший, возможно, общий способ разрешения формата URI, возвращаемого в Intent?

Ответы [ 2 ]

8 голосов
/ 14 ноября 2011

Я понимаю, что жесткое кодирование такой проверки (/ 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
}
0 голосов
/ 17 января 2012

Вы можете попросить MediaStore создать ваше растровое изображение из Uri:

Bitmap bmp = MediaStore.Images.Media.getBitmap( getContext().getContentResolver(), uri );
...