До сих пор мы решали Cursor == null
при извлечении через ContentResolver
с использованием отдельной логики для SDK < 11, 11-18,> = 19. Что-то вродеКак получить курсор через ContentResolver на любом устройстве?
public static Cursor getRealPathFromURI_API19(Context context, Uri uri) {
String[] filePathColumn = {MediaStore.Images.Media.DATA};
Cursor cursor = context.getContentResolver().query(uri, filePathColumn, null, null, null);
return cursor;
}
public static Cursor getRealPathFromURI_API11to18(Context context, Uri contentUri) {
String[] proj = {MediaStore.Images.Media.DATA};
String result = null;
CursorLoader cursorLoader = new CursorLoader(context, contentUri, proj, null, null, null);
Cursor cursor = cursorLoader.loadInBackground();
return cursor;
}
public static Cursor getRealPathFromURI_BelowAPI11(Context context, Uri contentUri) {
String[] proj = {MediaStore.Images.Media.DATA};
Cursor cursor = context.getContentResolver().query(contentUri, proj, null, null, null);
return cursor;
}
Однако, на Galaxy S5, когда мы сохраняем изображение в своем собственном каталоге во внутренней общественной памяти (не частный data/data
), мы получаем cursor==null
. На других устройствах мы НЕ получаем нулевой курсор.
Поток приложения, как это:
Возьмите изображение с камеры
сохранить его в файл в своей директории (папки общего доступа во внутренней памяти)
доступа файл по
ContentResolver
и возвратуCursor
Шаги 1 и 2 выполнены правильно. Проверено! Я вижу изображение, которое я делаю с помощью камеры внутри указанного каталога.
Я также проверил, если Bitmap
доступен через
InputStream input;
Bitmap bmp;
try {
input = getContentResolver().openInputStream(uri);
bmp = BitmapFactory.decodeStream(input);
} catch (FileNotFoundException e1) {
Log.e("tafg", "error");
}
, и я никогда не получаю исключение.
Однако, несмотря на все это, Cursor
остается недействительным на некоторых устройствах. Кто-нибудь может догадаться, почему и какой конечный способ никогда не получить нулевой курсор?
PS. есть ли сторонняя библиотека, которая правильно обрабатывает эту часть?
PPS. Мы используем Retrofit для получения до 10 изображений, сохраненных с помощью камеры, и загрузки на удаленный сервер. Использование и работа с Bitmap
невозможно в этом случае, поскольку мы получаем OOM на 5-м или 6-м изображении. Таким образом, логика переоснащения должна использовать ContentResolver
, чтобы получить изображения, которые необходимо загрузить.
Да, вставить вопрос. Исправлена! – sandalone
Я не сказал, что мы используем Retrofit для запроса файла, чтобы мы могли загрузить его на удаленный сервер. До 10 файлов, которые одновременно загружаются на сервер. И когда я нажимаю «Загрузить изображения через Retrofit», приложение разбивается на 'cursor == null'. Означает ли эта дополнительная информация о Дополнении что-либо в вашем ответе? – sandalone
@sandalone: Не совсем. На шаге 2 у вас есть путь к файловой системе для изображения, которое вы выписали в [внешнем хранилище] (https://commonsware.com/blog/2014/04/08/storage-situation-external-storage.html) («Сохраните его в файл в своем собственном каталоге»). Используйте этот путь к файловой системе с помощью Retrofit. В лучшем случае, Шаг № 3 - это круговой, медленный, ненадежный способ получить тот же самый путь к файловой системе, и я не вижу, как это поможет вам или пользователю. – CommonsWare