Intereting Posts
Динамически устанавливать цвет темы Android Animation: Подождите, пока не закончите? Android WebView удаляет файлы cookie из определенного домена WebView, похоже, не разрушается после ухода из бизнеса? Как добавить гиперссылку на экран настроек (PreferenceActivity) Каков атрибут «Игнорирование InnerClasses» во время компиляции? Получаю ли я бонус за производительность, если я попытаюсь использовать команды ассемблера для математических команд вместо c Как изменить цвет панели заголовка и адресной строки в новейшей версии Android Chrome на Lollipop? Android Catch Events on Notification (Long Press) Поиск AR с библиотекой распознавания изображений Android SDK не удается установить Как центрировать выравнивание элемента шаблона в PdfPCell Использование Build Flavors – структурирование исходных папок и build.gradle правильно Андроидный горизонтальный прокрутка Как программно отключить датчик приближения

Выбрано фото с использованием нового приложения 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();