Выбрано фото с использованием нового приложения Google Фото

Мое приложение имеет возможность выбирать фотографию из библиотеки. Точно я хочу путь к файлу из этого выбора.

Это код для создания цели для выбора фотографии:

Intent photoPickerIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); photoPickerIntent.setType("image/*"); startActivityForResult(photoPickerIntent, INTENT_REQUEST_CODE_SELECT_PHOTO); 

Это код, который получает путь к файлу из URI:

  Cursor cursor = null; String path = null; try { String[] projection = { MediaStore.Images.Media.DATA }; cursor = context.getContentResolver().query(contentUri, projection, null, null, null); int columnIndex = cursor.getColumnIndexOrThrow(projection[0]); cursor.moveToFirst(); path = cursor.getString(columnIndex); } finally { if (cursor != null) { cursor.close(); } } return path; 

До вчерашнего обновления приложения Google Фото все работало отлично. Теперь path равен NULL после разбора URI.

URI аналогичен этому: content://com.google.android.apps.photos.contentprovider/0/1/content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F75209/ACTUAL

Я также пытался создать намерение с действием Intent.ACTION_GET_CONTENT – не повезло.

Ниже код работает для меня, чтобы получить URI контента в последних Google Фото. Я попытался написать временный файл и вернуть URI временного изображения, если он обладает полномочиями в URI контента.

Вы можете попробовать такие же:

 public static String getImageUrlWithAuthority(Context context, Uri uri) { InputStream is = null; if (uri.getAuthority() != null) { try { is = context.getContentResolver().openInputStream(uri); Bitmap bmp = BitmapFactory.decodeStream(is); return writeToTempImageAndGetPathUri(context, bmp).toString(); } catch (FileNotFoundException e) { e.printStackTrace(); }finally { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } } return null; } public static Uri writeToTempImageAndGetPathUri(Context inContext, Bitmap inImage) { ByteArrayOutputStream bytes = new ByteArrayOutputStream(); inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes); String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null); return Uri.parse(path); } 

Это, безусловно, обходное решение, но вы можете извлечь реальный URI контента, который по какой-то причине, по-видимому, был встроен: content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F75209

Я смог создать новый URI с authority=media and path=external/images/media/xxx , а контент-резольвер вернул реальный URL-адрес.

Пример кода:

 String unusablePath = contentUri.getPath(); int startIndex = unusablePath.indexOf("external/"); int endIndex = unusablePath.indexOf("/ACTUAL"); String embeddedPath = unusablePath.substring(startIndex, endIndex); Uri.Builder builder = contentUri.buildUpon(); builder.path(embeddedPath); builder.authority("media"); Uri newUri = builder.build();