2016-05-30 2 views
0

До сих пор мы решали 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. На других устройствах мы НЕ получаем нулевой курсор.

Поток приложения, как это:

  1. Возьмите изображение с камеры

  2. сохранить его в файл в своей директории (папки общего доступа во внутренней памяти)

  3. доступа файл по 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, чтобы получить изображения, которые необходимо загрузить.

ответ

1

До сих пор мы решили Cursor == нуль при извлечении с помощью ContentResolver с помощью отдельной логики для SDKs < 11, 11-18,> = 19.

Настоятельно рекомендую удалить весь этот код и use a Uri properly.

Поток приложения, как это:

Ваш шаг # 3 бессмысленно. Вы знаете, где находится файл, потому что вы его разместили на шаге 2. И, избавившись от шага №3, вы также можете избавиться от всего фиктивного кода «реального пути».

Любой человек может догадаться, почему

Возможно MediaStore не знает об образе, потому что она не была проиндексирована еще.См. MediaScannerConnection и его метод scanFile().

Также обратите внимание, что вы фактически не устанавливаете cursor на значение в getRealPathFromURI_API19(). Я бы ожидал, что код не будет компилироваться, поэтому я предполагаю, что это проблема с копией/вставкой в ​​вашем вопросе.

Какой конечный способ никогда не получить нулевой курсор?

Остановить запрос для него в первую очередь.

+0

Да, вставить вопрос. Исправлена! – sandalone

+0

Я не сказал, что мы используем Retrofit для запроса файла, чтобы мы могли загрузить его на удаленный сервер. До 10 файлов, которые одновременно загружаются на сервер. И когда я нажимаю «Загрузить изображения через Retrofit», приложение разбивается на 'cursor == null'. Означает ли эта дополнительная информация о Дополнении что-либо в вашем ответе? – sandalone

+1

@sandalone: ​​Не совсем. На шаге 2 у вас есть путь к файловой системе для изображения, которое вы выписали в [внешнем хранилище] (https://commonsware.com/blog/2014/04/08/storage-situation-external-storage.html) («Сохраните его в файл в своем собственном каталоге»). Используйте этот путь к файловой системе с помощью Retrofit. В лучшем случае, Шаг № 3 - это круговой, медленный, ненадежный способ получить тот же самый путь к файловой системе, и я не вижу, как это поможет вам или пользователю. – CommonsWare

Смежные вопросы