Android and Facebook: How to get picture of logged in User

22,747

Solution 1

request("me/picture") throws an error because the server returns a 302 (redirect to the image url) and the facebook sdk does not handle this.

Solution 2

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

where ID is ur profile ID...

Solution 3

I also had that problem some time ago. What I did was download the picture using an async task, and then set an ImageView with the image just downloaded. I will paste the code snippet:

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

This code works for me. I hope it works for you too.

Solution 4

You can request a direct URl which contains your Access token:

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

Then get a decoded BitMap and assign it to image view:

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

MyProfilePicImageView.setImageBitmap(mIcon1);

Solution 5

For displaying profile pic in your app, use ProfilePictureView from Facebook SDK.

Refer This

Just call setProfileId(String profileId) on it.

It will take care of displaying the image.

Share:
22,747
Pascal Klein
Author by

Pascal Klein

I learned coding in university and founded three startups, in all three of them i was responsible for Frontend Development and Online Marketing. Currently I am working on an online marketplace for short term work: InStaff - Book Hostesses &amp; Eventstaff online I know PHP, Javascript, Java and some Objective-C. I also got to know a little bit of Scala, Python and Octave in my free time. Most of my developer time I worked on web- and mobile applications with Kohana, jQuery Mobile and Android.

Updated on March 20, 2020

Comments

  • Pascal Klein
    Pascal Klein about 4 years

    I use the official Facebook SDK in my Android Application. After the user logs in, I can get the uid and the name of the facebook user like so:

    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");
    

    I also know that the I can access the profile picture with those links:

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

    I would love to use this code to geht the profile picture:

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

    But it just wont work. I always get the following error:

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

    And I cant solve this issue. It seems to be rather complicated(look here or here). So what other options are there to get the picture of a facebook user that successfully logged into my application?

  • MKJParekh
    MKJParekh over 12 years
    nice and straight way but i would say id even can be name of the user like "parag.chauhan"
  • Chirag_CID
    Chirag_CID over 12 years
    thts true..but this cant be use for each user, as thr could be so many user of same name...
  • Idolon
    Idolon over 12 years
    This code just couldn't work for you because it didn't compiled. AsyncTask takes 3 parameters and not 1 (so you can't use AsyncTask<Bitmap>, but AsyncTask<Void, Void, Bitmap>). Also it doesn't have taskComplete method, but have onPostExecute instead. I edited your code to make it compilable.
  • Antonio
    Antonio over 12 years
    I use my own AsyncTask with only one parameter, so yes, it was working. Anyway, thanks for editing...
  • AndroidHacker
    AndroidHacker about 10 years
    Not working for higher version ...This works like charm in lower version but not in higher version. What should I do for that?
  • Olavz
    Olavz almost 10 years
    The current URL is a 302 redirect, get the 302 location and a second request to get the image. This helped me out link