Преобразование файла: // схема в содержимое: // схема - PullRequest
6 голосов
/ 10 июня 2011

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

Ответы [ 3 ]

4 голосов
/ 10 июня 2011

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

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

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
3 голосов
/ 04 июня 2013

Здесь проблема в том, что для всех файлов у нас не может быть содержимого 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 голосов
/ 10 июня 2011

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

...