2011-06-10 5 views
4

У меня проблема с использованием приложения Droid X's Files и Astro file manager для выбора файла изображения. Эти два приложения возвращают выбранное изображение со схемой «файл: //», а Галерея возвращает изображение со схемой «content: //». Как преобразовать первую схему во вторую. Или как декодировать изображение со вторым форматом?Преобразование файла: // схема к контенту: // схема

ответ

3

Вы, вероятно, хотите, чтобы преобразовать содержание: // в файл: //

Для галереи изображений, попробовать что-то вроде этого:

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 
+0

Решил, прежде чем я прочитаю это. Но это то, что я сделал. В любом случае, я могу поддерживать файлы и данные возврата Astro в файле формата: // обрезая «file: //» и передавая его в BitmapFactory.decodeFile. Спасибо, что ответили. – KITT

+0

'Uri.getPath()' возвращает 'String', но в противном случае +1 для этого, потому что он работает. –

3

Используйте ContentResolver.openInputStream() или связанные методы для доступа к потоку байтов. Обычно вы не должны беспокоиться о том, является ли это файлом или содержимым: URI.

http://developer.android.com/reference/android/content/ContentResolver.html#openInputStream(android.net.Uri)

+1

Иногда вы хотите передать URI, полученный из какого-либо приложения, в другое приложение. Тогда преобразование полезно, так как некоторые приложения придирчивы к тому, какие URI они принимают (я узнал это с трудом.) Все еще ищу решение, хотя ... –

+0

@hackbod, есть ошибка с Uri, когда вы меняете SD-карту для другой sdcard. Ури указывает на другую картину. – KITT

+1

Это не ошибка Uri, это просто ... ну что вы ожидаете? :) Если у вас есть путь к файлу и смените базовую файловую систему на что-то другое с другим содержимым, вы больше не можете считать этот путь значимым. Единственная морщина здесь заключается в том, что URI для поставщика медиаконтента не являются путями, а созданы с уникальным идентификатором для каждого проверенного файла. Когда вы кладете другую карту SD, старая база данных будет удалена, а файлы будут повторно проверены и назначены новые идентификаторы, поэтому, если у вас есть URI со старой карты, они либо будут недействительными, либо случайным образом возвратят файл на новую карту , – hackbod

3

Здесь проблема заключается в том, что , для всех файлов мы не можем иметь контент 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; 
    } 
}}