2015-08-07 4 views
0

Этот код хорошо работал с галереей изображений Nexus 5. С тех пор, как переход на более новое приложение Google Фото, выбрав изображения, разбивает этот код.IllegalStateException при попытке выбрать фотографию из приложения Google Фото

Ошибка:

08-07 10:10:10.792 25086-25086/com.app.app E/CursorWindow﹕ Failed to read row 0, column -1 from a CursorWindow which has 1 rows, 7 columns. 08-07 10:10:10.795 25086-25086/com.app.app D/AndroidRuntime﹕ Shutting down VM 08-07 10:10:10.801 25086-25086/com.app.app E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: com.app.app, PID: 25086 java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=2, result=-1, data=Intent { dat=content://com.google.android.apps.photos.contentprovider/-1/1/content://media/external/images/media/17870/ACTUAL/1285012603 flg=0x1 (has clip) }} to activity {com.app.app/com.app.app.PhotoActivity}: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it. at android.app.ActivityThread.deliverResults(ActivityThread.java:3574) at android.app.ActivityThread.handleSendResult(ActivityThread.java:3617) at android.app.ActivityThread.access$1300(ActivityThread.java:151) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1352) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5254) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) Caused by: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it. at android.database.CursorWindow.nativeGetString(Native Method) at android.database.CursorWindow.getString(CursorWindow.java:438) at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51) at android.database.CursorWrapper.getString(CursorWrapper.java:114) at com.app.app.PhotoActivity.getRealPathFromURI(PhotoActivity.java:456) at com.app.app.PhotoActivity.onActivityResult(PhotoActivity.java:436) at android.app.Activity.dispatchActivityResult(Activity.java:6192) at android.app.ActivityThread.deliverResults(ActivityThread.java:3570)             at android.app.ActivityThread.handleSendResult(ActivityThread.java:3617)             at android.app.ActivityThread.access$1300(ActivityThread.java:151)             at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1352)             at android.os.Handler.dispatchMessage(Handler.java:102)             at android.os.Looper.loop(Looper.java:135)             at android.app.ActivityThread.main(ActivityThread.java:5254)             at java.lang.reflect.Method.invoke(Native Method)             at java.lang.reflect.Method.invoke(Method.java:372)             at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

ONACTIVITYRESULT:

case ACTION_SELECT_PHOTO: { 
    if (resultCode == RESULT_OK) { 
     Uri selectedImageURI = data.getData(); 
     File imageFile = new File(getRealPathFromURI(selectedImageURI)); // LINE 436 
     mCurrentPhotoPath = imageFile.toString(); 
     if (mCurrentPhotoPath != null) { 
      setPic(); 
      mCurrentPhotoPath = null; 
     } 
    } 
    break; 
} 

GETREALPATHFROMURI:

private String getRealPathFromURI(Uri contentURI) { 
    String result; 
    Cursor cursor = getContentResolver().query(contentURI, null, null, null, null); 
    if (cursor == null) { 
     result = contentURI.getPath(); 
    } else { 
     cursor.moveToFirst(); 
     int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); 
     result = cursor.getString(idx); // HERE IS THE ERROR: LINE 456 
     cursor.close(); 
    } 
    return result; 
} 

Я предположил бы, что мой выпуск находится в одном из двух мест, либо getContentResolver().query должен использовать некоторый новый метод. ИЛИ getColumnIndex(MediaStore.Images.ImageColumns.DATA) MediaStore - это неправильный способ работы с более новыми облачными приложениями для фотографий.

ответ

1

URI не средний есть файл. Приложение может предоставлять содержимое через любой механизм, который он хочет (локальный файл, локальный файл в частной директории, которую вы не можете читать, транслироваться через Интернет, динамически создаваться «на лету»).

Вместо этого вы должны использовать ContentResolver.openInputStream(contentUri), чтобы получить содержимое из URI. Затем вы можете преобразовать это в растровое изображение с помощью BitmapFactory.decodeStream()

+0

Должен ли я использовать 'ContentResolver.openInputStream (contentUri)' в моем 'onActivityResult'? – canigetabreak

+0

Да, вы можете использовать его сразу после строки 'Uri selectedImageURI = data.getData()'. – ianhanniballake

+0

Это случайный случай, но знаете ли вы, как создать новое растровое изображение из существующего при настройке параметров? Перед обновлением этого кода я использовал «Bitmap bitmap = BitmapFactory.decodeFile (f, bmOptions)», причем основной параметр отправлен 'inSampleSize' для масштабирования. Я просмотрел 'createScaledBitmap', но просто использует высоту и ширину. – canigetabreak

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