У меня проблема с использованием приложения Droid X's Files и Astro file manager для выбора файла изображения. Эти два приложения возвращают выбранное изображение со схемой «файл: //», а Галерея возвращает изображение со схемой «content: //». Как преобразовать первую схему во вторую. Или как декодировать изображение со вторым форматом?Преобразование файла: // схема к контенту: // схема
ответ
Вы, вероятно, хотите, чтобы преобразовать содержание: // в файл: //
Для галереи изображений, попробовать что-то вроде этого:
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
Используйте ContentResolver.openInputStream() или связанные методы для доступа к потоку байтов. Обычно вы не должны беспокоиться о том, является ли это файлом или содержимым: URI.
Иногда вы хотите передать URI, полученный из какого-либо приложения, в другое приложение. Тогда преобразование полезно, так как некоторые приложения придирчивы к тому, какие URI они принимают (я узнал это с трудом.) Все еще ищу решение, хотя ... –
@hackbod, есть ошибка с Uri, когда вы меняете SD-карту для другой sdcard. Ури указывает на другую картину. – KITT
Это не ошибка Uri, это просто ... ну что вы ожидаете? :) Если у вас есть путь к файлу и смените базовую файловую систему на что-то другое с другим содержимым, вы больше не можете считать этот путь значимым. Единственная морщина здесь заключается в том, что URI для поставщика медиаконтента не являются путями, а созданы с уникальным идентификатором для каждого проверенного файла. Когда вы кладете другую карту SD, старая база данных будет удалена, а файлы будут повторно проверены и назначены новые идентификаторы, поэтому, если у вас есть URI со старой карты, они либо будут недействительными, либо случайным образом возвратят файл на новую карту , – hackbod
Здесь проблема заключается в том, что , для всех файлов мы не можем иметь контент 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;
}
}}
Решил, прежде чем я прочитаю это. Но это то, что я сделал. В любом случае, я могу поддерживать файлы и данные возврата Astro в файле формата: // обрезая «file: //» и передавая его в BitmapFactory.decodeFile. Спасибо, что ответили. – KITT
'Uri.getPath()' возвращает 'String', но в противном случае +1 для этого, потому что он работает. –