2016-04-21 24 views
1

Ich benutze Google+ Anmelden, um eine Instanz von GoogleSignInAccount zu erhalten und den Namen und die E-Mail-Adresse des Nutzers problemlos zu laden, damit ich weiß, dass er korrekt eingerichtet ist. Dann bekomme ich das Uri des Benutzerprofilbildes und versuche das als Icon für einen ImageButton einzustellen.Google+ Profilbild von Uri nach Bitmap auf Android importieren

Die Variable userPhoto ist ein android.net.Uri von GoogleSignInAccount gegriffen. Das Foto, um klar zu sein, ist nicht auf dem Gerät vorhanden.

Dies ist der Code, den ich ohne Erfolg gerade jetzt bin:

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(); 
    } 

Dies ist der Fehler, den ich bekommen:

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) 

Wenn ich Sie auf den Link als Fehler für Datei geworfen nicht gefunden Ich finde das Foto (das bin ich übrigens): https://lh5.googleusercontent.com/-s7XGuonbDRk/AAAAAAAAAAI/AAAAAAAAFv8/htGjmtY1xD8/photo.jpg

Also die Frage ist jetzt wirklich, warum funktioniert der obige Code nicht und gibt es eine andere Möglichkeit, eine Bitmap von einem Uri zu bekommen?

Ich kann natürlich die URL des Fotos von der Uri bekommen und dann auf das Gerät herunterladen, aber ich hoffe, dass ich das nicht machen muss. Wenn das die einzige Lösung ist, die Sie kennen, dann liefern Sie bitte Arbeitscode-Beispiele, wie Sie eine URL-Datei herunterladen UND wie Sie die heruntergeladene URL in eine Bitmap konvertieren.

Antwort

1

Ich schlage einen anderen Weg, mit ImageView statt, dann können Sie setOnClickListener auf diesem ImageView anrufen.

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

Danke danke danke! Arbeitete perfekt! : D Musste es nicht einmal zu einem ImageView machen, Picasso arbeitet auch direkt auf ImageButtons. :) –

1

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

Dies lädt eine URI aus dem Dateisystem. Es lädt keine URL aus dem Netzwerk.

Sie müssen eine Netzwerkbibliothek verwenden, um den Byte-Stream (in einem Thread) zu erhalten und diesen in eine Bitmap umzuwandeln.

Sie können Netzwerkbibliotheken von Drittanbietern verwenden, und dazu gibt es auch netzwerkfähige ImageViews von Drittanbietern. In jedem Fall müssen Sie den Code selbst hinzufügen.