Android KitKat Изображение, не возвращающее ничего

Я пытаюсь получить абсолютный путь изображения изображения, выбранного в галерее KitKat, но, похоже, он не работает. Моя переменная IMAGE_FILEPATH всегда "" после того, что я делаю. Вот код для моего onActivityResult()

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode != Activity.RESULT_OK) return; if (null == data) return; Uri originalUri = null; if (requestCode == 1) { //JB!!! Uri uri = data.getData(); if (uri != null) { try { // User had pick an image. String[] filePathColumn = { MediaStore.Images.Media.DATA }; Cursor cursor = getContentResolver() .query(uri, filePathColumn, null, null, null); cursor.moveToFirst(); IMAGE_FILEPATH = cursor.getString(0); cursor.close(); } catch (Exception e) { Crouton.makeText(this, "Failed to get image", Style.ALERT).show(); } } } else if (requestCode == 2) { //KK!!! Uri uri = data.getData(); if (uri != null) { try { if( uri == null ) { IMAGE_FILEPATH = uri.getPath(); } else { String[] projection = { MediaStore.Images.Media.DATA }; Cursor cursor = managedQuery(uri, projection, null, null, null); if( cursor != null ){ int column_index = cursor .getColumnIndexOrThrow(MediaStore.Images.Media.DATA); cursor.moveToFirst(); IMAGE_FILEPATH = cursor.getString(column_index); } else { IMAGE_FILEPATH = uri.getPath(); } } } catch (Exception e) { Crouton.makeText(this, "Failed to get image", Style.ALERT).show(); } } } Resource.toast(IMAGE_FILEPATH); super.onActivityResult(requestCode, resultCode, data); } 

Что случилось? Я пробовал несколько решений и ничего не работает.

В KitKat Галерея возвращает URI следующим образом: content://com.android.providers.media.documents/document/image:1

вместо :

 content://media/external/images/media/1 

Итак, вот что вы можете написать под KK, чтобы он работал:

 if (uri != null) { try { if( uri == null ) { IMAGE_FILEPATH = uri.getPath(); } else { // get the id of the image selected by the user String wholeID = DocumentsContract.getDocumentId(data.getData()); String id = wholeID.split(":")[1]; String[] projection = { MediaStore.Images.Media.DATA }; String whereClause = MediaStore.Images.Media._ID + "=?"; Cursor cursor = getContentResolver().query(getUri(), projection, whereClause, new String[]{id}, null); if( cursor != null ){ int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); if (cursor.moveToFirst()) { IMAGE_FILEPATH = cursor.getString(column_index); } cursor.close(); } else { IMAGE_FILEPATH = uri.getPath(); } } } catch (Exception e) { Crouton.makeText(this, "Failed to get image", Style.ALERT).show(); } } 

И функция, которую я использовал:

 private Uri getUri() { String state = Environment.getExternalStorageState(); if(!state.equalsIgnoreCase(Environment.MEDIA_MOUNTED)) { return MediaStore.Images.Media.INTERNAL_CONTENT_URI; } return MediaStore.Images.Media.EXTERNAL_CONTENT_URI; } 

Эти сообщения помогли мне: получить абсолютный путь при выборе изображения из андроид галереи kitkat и получить реальный путь от URI, новую платформу доступа к хранилищу Android KitKat

MoveToFirst возвращает логическое значение, указывающее, перемещается ли в эту позицию данные.

 boolean haveData; haveData = cursor.moveToFirst(); if (haveData) { cursor.getString(..... 

Это то, что вы должны делать, это просто хорошее, защитное программирование. Теперь, почему ваш курсор пуст, вам потребуется больше копать в contentResolver.