2011-11-13 1 views
4

Приложение для Android открывает изображения и делает манипуляции с ними. Моя активность запрашивает изображение, чтобы открыть следующим образом:Устранение URI из разных источников в 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 например.

Так что я положил чек, чтобы преобразовать такой путь, который начинается с внешнего с помощью:

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?

+0

Намерение ImageData = намерения; – Tanager4

ответ

8

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

imageData.getData() возвращает Uri. Если его путь начинается с file:// (это то, что вернет большинство файловых менеджеров), тогда uri представляет файл. Другим вариантом является uri представляет элемент контента (это то, что Галерея вернется), в этом случае его путь начинается с 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

Вы можете задать Mediastore создать Bitmap из Uri:

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