Получить изображение профиля Google+ из Uri в Bitmap на Android

Я использую Google+ Sign In, чтобы получить экземпляр GoogleSignInAccount, и я могу правильно загрузить имя пользователя и адрес электронной почты без проблем, поэтому я знаю, что он правильно настроен. Затем я получаю Uri изображения профиля пользователя и пытаюсь установить его в качестве значка для ImageButton.

Переменная userPhoto — это android.net.Uri, полученный из GoogleSignInAccount. Фото, чтобы было понятно, на устройстве нет.

Это код, который я использую прямо сейчас безрезультатно:

profileButton = (ImageButton) navHeaderView.findViewById(R.id.navHeaderMainImageButton);

    try {
        Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), userPhoto);
        profileButton.setImageBitmap(bitmap);
    } catch (IOException e) {
        e.printStackTrace();
    }

Это ошибка, которую я получаю:

    W/System.err: java.io.FileNotFoundException: No content provider: https://lh5.googleusercontent.com/-s7XGuonbDRk/AAAAAAAAAAI/AAAAAAAAFv8/htGjmtY1xD8/photo.jpg
    W/System.err:     at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1117)
    W/System.err:     at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:970)
    W/System.err:     at android.content.ContentResolver.openInputStream(ContentResolver.java:695)
    W/System.err:     at android.provider.MediaStore$Images$Media.getBitmap(MediaStore.java:859)
    W/System.err:     at com.seranth.sertutor.MainActivity.onCreate(MainActivity.java:136)
    W/System.err:     at android.app.Activity.performCreate(Activity.java:6500)
    W/System.err:     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1120)
    W/System.err:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3072)
    W/System.err:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3218)
    W/System.err:     at android.app.ActivityThread.access$1000(ActivityThread.java:198)
    W/System.err:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1676)
    W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:102)
    W/System.err:     at android.os.Looper.loop(Looper.java:145)
    W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:6837)
    W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
    W/System.err:     at java.lang.reflect.Method.invoke(Method.java:372)
    W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
    W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)
    W/Resources: Converting to string: TypedValue{t=0x5/d=0x3801 a=1 r=0x10500d1}
    W/OpenGLRenderer: Program(5ea33b00) : invalid binary - source difference(vs(201:201)/fs(94:36705)-b0000000800000000)

Если я перейду по ссылке, выданной как ошибка для файла, который не найден, я найду фотографию (кстати, это я): https://lh5.googleusercontent.com/-s7XGuonbDRk/AAAAAAAAAAAI/AAAAAAAAAFv8/htGjmtY1xD8/photo.jpg

Итак, вопрос теперь действительно в том, почему приведенный выше код не работает и есть ли другой способ получить растровое изображение из Uri?

Конечно, я могу получить URL-адрес фотографии из Uri, а затем загрузить ее на устройство, но я надеюсь, что мне не придется этого делать. Если это единственное известное вам решение, предоставьте образцы рабочего кода, как загрузить файл URL-адреса И как преобразовать загруженный URL-адрес в растровое изображение.


person Simon Hyll    schedule 21.04.2016    source источник


Ответы (2)


Я предлагаю другой способ, используя вместо этого ImageView, тогда вы можете вызвать setOnClickListener на этом ImageView.

private void handleSignInResult(GoogleSignInResult result) {    
    if (result.isSuccess()) {
        // Signed in successfully, show authenticated UI.
        GoogleSignInAccount acct = result.getSignInAccount();
        ...
        Uri uri = acct.getPhotoUrl();
        Picasso.with(mContext)
                .load(uri)
                .placeholder(android.R.drawable.sym_def_app_icon)
                .error(android.R.drawable.sym_def_app_icon)
                .into(mProfileImageView);
        // then call mProfileImageView.setOnClickListener();...

        updateUI(true);
    } else {
        // Signed out, show unauthenticated UI.
        updateUI(false);
    }
}
person BNK    schedule 23.04.2016
comment
Спасибо Спасибо спасибо! Работал отлично! :D Даже не нужно было делать ImageView, Picasso также работает непосредственно с ImageButtons. :) - person Simon Hyll; 24.04.2016
comment
Это не ответ, а альтернативный способ пропустить преобразование в растровое изображение. Но таким образом нельзя сохранить изображение в память устройства. - person Sandeep; 04.07.2020
comment
@Sandeep, пожалуйста, прочитайте еще раз идею ОП. Я, конечно, могу получить URL-адрес фотографии из Uri, а затем загрузить ее на устройство, но я надеюсь, что мне не придется этого делать. - person BNK; 05.07.2020

MediaStore.Images.Media.getBitmap(this.getContentResolver(), userPhoto);

Это загружает URI из файловой системы. Он не загружает URL-адрес из сети.

Вам нужно использовать сетевую библиотеку, чтобы получить поток байтов (в потоке) и преобразовать его в растровое изображение.

Вы можете использовать сторонние сетевые библиотеки, а также сторонние сетевые ImageViews для этого. В любом случае, вы должны добавить код самостоятельно.

person CQM    schedule 21.04.2016