2010-12-16 4 views
10

Ich benutze das offizielle Facebook SDK in meiner Android-Anwendung. Nachdem der Benutzer anmeldet, kann ich wie so die uid und den Namen der Facebook-Nutzer erhalten:Android und Facebook: Wie bekomme ich ein Bild von eingeloggt Benutzer

Facebook mFacebook = new Facebook(APP_ID); 
// ... user logs in ... 
//String jsonUser = mFacebook.request("me/picture"); // throws error 
String jsonUser = mFacebook.request("me"); 
JSONObject obj = Util.parseJson(jsonUser); 
String facebookId = obj.optString("id"); 
String name = obj.optString("name"); 

Ich weiß auch, dass das ich das Profilbild mit diesen Links erreichen:

https://graph.facebook.com/<facebookId>/picture 
https://graph.facebook.com/<facebookId>/picture?type=large 

Ich würde gerne diesen Code verwenden, um das Profilbild zu gehen:

public static Drawable getPictureForFacebookId(String facebookId) { 

    Drawable picture = null; 
    InputStream inputStream = null; 

    try { 
     inputStream = new URL("https://graph.facebook.com/" + facebookId + "/picture").openStream(); 
    } catch (Exception e) {   
    e.printStackTrace(); 
    return null; 

    } 
    picture = Drawable.createFromStream(inputStream, "facebook-pictures"); 

    return picture; 
} 

Aber es wird einfach nicht funktionieren. Ich bekomme immer folgenden Fehler:

SSL handshake failure: Failure in SSL library, usually a protocol error 

Und ich kann dieses Problem nicht lösen. Es scheint ziemlich kompliziert zu sein (siehe here oder here). Welche anderen Möglichkeiten gibt es, um das Bild eines Facebook-Nutzers zu erhalten, der sich erfolgreich in meiner Anwendung angemeldet hat?

Antwort

4

Anfrage ("me/picture") gibt einen Fehler aus, da der Server eine 302 (Weiterleitung an die Bild-URL) zurückgibt und die Facebook-SDK nicht damit umgeht.

+0

angegebenen Link ist jetzt tot! – prometheuspk

9

Ich hatte auch dieses Problem vor einiger Zeit. Ich habe das Bild mit einer asynchronen Aufgabe heruntergeladen und dann eine ImageView mit dem gerade heruntergeladenen Bild erstellt. Ich werde das Code-Snippet einfügen:

ImageView fbUserAvatar = (ImageView) findViewById(R.id.fb_user_avatar); 

private synchronized void downloadAvatar() { 
    AsyncTask<Void, Void, Bitmap> task = new AsyncTask<Void, Void, Bitmap>() { 

     @Override 
     public Bitmap doInBackground(Void... params) { 
      URL fbAvatarUrl = null; 
      Bitmap fbAvatarBitmap = null; 
      try { 
       fbAvatarUrl = new URL("http://graph.facebook.com/"+USER_ID+"/picture"); 
       fbAvatarBitmap = BitmapFactory.decodeStream(fbAvatarUrl.openConnection().getInputStream()); 
      } catch (MalformedURLException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      return fbAvatarBitmap; 
     } 

     @Override 
     protected void onPostExecute(Bitmap result) { 
      fbUserAvatar.setImageBitmap(result); 
     } 

    }; 
    task.execute(); 
} 

Dieser Code funktioniert für mich. Ich hoffe es funktioniert auch für dich.

+1

Dieser Code konnte einfach nicht für Sie arbeiten, weil es nicht kompiliert hat. 'AsyncTask' benötigt 3 Parameter und nicht 1 (Sie können also' AsyncTask 'nicht verwenden, aber' AsyncTask ').Außerdem hat es keine 'taskComplete'-Methode, sondern stattdessen' onPostExecute'. Ich habe Ihren Code bearbeitet, um ihn kompilierbar zu machen. – Idolon

+0

Ich verwende meine eigene AsyncTask mit nur einem Parameter, also ja, es hat funktioniert. Wie auch immer, danke für die Bearbeitung ... – Antonio

5

können Sie eine direkte URL-Anforderung, die Ihre Access-Token enthält:

URL MyProfilePicURL = new URL("https://graph.facebook.com/me/picture?type=normal&method=GET&access_token="+ Access_token); 

Dann ein decodiertes BitMap erhalten und weisen Sie auf die Bildansicht:

Bitmap MyprofPicBitMap = null; 
try { 
    MyprofPicBitMap = BitmapFactory.decodeStream(MyProfilePicURL.openConnection().getInputStream()); 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

MyProfilePicImageView.setImageBitmap(mIcon1); 
22
ImageView user_picture; 
userpicture=(ImageView)findViewById(R.id.userpicture); 
URL img_value = null; 
img_value = new URL("http://graph.facebook.com/"+id+"/picture?type=large"); 
Bitmap mIcon1 = BitmapFactory.decodeStream(img_value.openConnection().getInputStream()); 
userpicture.setImageBitmap(mIcon1); 

wobei ID ur Profil ID ...

+0

nett und gerade Weg, aber ich würde sagen, ID kann sogar Name des Benutzers sein wie "parag.chauhan" – MKJParekh

+1

thts wahr..aber das kann nicht für jeden Benutzer, wie thr könnte so viele Benutzer mit dem gleichen Namen sein ... –

+1

Nicht für höhere Version funktioniert ... Dies funktioniert wie Charme in niedrigeren Version, aber nicht in höheren Version. Was soll ich dafür tun? – AndroidHacker

1

Fügen Sie eine Codezeile hinzu, die aufgelöst wird.

HttpURLConnection.setFollowRedirects(true); 
2

Zum Anzeigen von Profilbild in Ihrer App verwenden Sie ProfilePictureView von Facebook SDK.

Siehe Diese

Gerade setProfileId(String profileId) auf es nennen.

Es wird darauf geachtet, das Bild anzuzeigen.

0

verwenden, (usuario ist ein GraphUser):

ProfilePictureView p; 
p = (ProfilePictureView) rootView.findViewById(R.id.fotoPerfil); 
p.setProfileId(usuario.getId()); 

und XML-Markup:

<com.facebook.widget.ProfilePictureView 
    android:id="@+id/profilePicture" 
    android:layout_height="wrap_content" 
    android:layout_width="wrap_content" 
    android:gravity="center_horizontal" 
    android:layout_marginBottom="10dp" 
    facebook:preset_size="normal"/> 
Verwandte Themen