2016-04-21 3 views
1

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

Переменная 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/AAAAAAAAAAI/AAAAAAAAFv8/htGjmtY1xD8/photo.jpg

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

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

ответ

1

Я предлагаю другой способ, используя вместо этого 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); 
    } 
} 
+1

Благодарю вас поблагодарить! Отлично! : D Даже не нужно было делать это ImageView, Picasso работает непосредственно и с ImageButtons. :) –

1

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

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

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

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

Смежные вопросы