Загрузить изображение из нового приложения Google+ (плюс)

Недавно Google добавила приложение «Фото» для Google+ (плюс), и оно появляется, когда вы запускаете намерение, чтобы выбрать изображение. Однако, если я выбираю изображение из Google+ Фото и пытаюсь использовать его в своем приложении, ни одна из моих текущих логических схем не может вернуть полезный URI или URL-адрес, чтобы фактически получить изображение, которое я могу загрузить и манипулировать. В настоящее время я использую «общие» методы, чтобы попытаться манипулировать URI, который можно найти здесь, в Stack Overflow и в других местах. Я могу предоставить код, если это необходимо, но на данный момент я считаю, что это не имеет никакого отношения, поскольку он хорошо работает для всего остального, кроме этого нового приложения. Любые идеи о том, как получить полезный образ?

URI выглядит примерно так:

content://com.google.android.apps.photos.content/0/https%3A%2F%2Flh5.googleusercontent.com%<a bunch of letters and numbers here> 

Информация MediaColumns.DATA всегда возвращает null, а MediaColumns.DISPLAY_NAME всегда возвращает image.jpg независимо от того, что я выбираю из приложения Google Фото. Если я попытаюсь вставить все от https до конца в моем браузере, ничего не возникает. Не знаете, как получить полезную информацию.

Solutions Collecting From Web of "Загрузить изображение из нового приложения Google+ (плюс)"

При получении намерений данных вы должны использовать contentResolver для получения фотографий. Вот что вы должны сделать:

 String url = intent.getData().toString(); Bitmap bitmap = null; InputStream is = null; if (url.startsWith("content://com.google.android.apps.photos.content")){ is = getContentResolver().openInputStream(Uri.parse(url)); bitmap = BitmapFactory.decodeStream(is); } 

Я столкнулся с проблемами выбора изображений из нового приложения Google Фото. Я смог разрешить это по нижнему коду.

Это работает для меня, в основном, что я сделал, я проверяю, есть ли какие-либо полномочия в 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); } 

PS: Я ответил на аналогичный вопрос здесь

Вы должны использовать проекцию, чтобы получить ImageColumns.DATA (или MediaColumns.DATA ):

 private String getRealPathFromURI(Uri contentURI) { // Projection makes ContentResolver to get needed columns only String[] medData = { MediaStore.Images.Media.DATA }; Cursor cursor = getContentResolver().query(contentURI, medData, null, null, null); // this is how you can simply get Bitmap Bitmap bmp = MediaStore.Images.Media.getBitmap(getContentResolver(), contentURI); // After using projection cursor will have needed DATA column cursor.moveToFirst(); final int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); return cursor.getString(idx); }