Подтвердить что ты не робот

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

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

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 в конец в моем браузере, ничего не возникает. Не уверен, как получить полезную информацию от этого.

4b9b3361

Ответ 1

При получении намерений данных вы должны использовать 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);
}

Ответ 2

Я столкнулся с проблемами выбора изображений из нового приложения 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);
}

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

Ответ 3

Вы должны использовать проекцию, чтобы получить 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);
}