Android - get facebook profile picture

AndroidFacebookProfile

Android Problem Overview


I don't know why, but I am always getting null when I try to get the profile picture of the user. Do I need to set some specific permissions to get access?

Below is my method:

public static Bitmap getFacebookProfilePicture(String userID) throws SocketException, SocketTimeoutException, MalformedURLException, IOException, Exception
{
   String imageURL;
		
   Bitmap bitmap = null;
   imageURL = "http://graph.facebook.com/"+userID+"/picture?type=large";
   InputStream in = (InputStream) new URL(imageURL).getContent();
   bitmap = BitmapFactory.decodeStream(in);
	    
   return bitmap;
}

Bitmap bitmap = getFacebookProfilePicture(userId);

I am getting null. I don't know the reason why? Any help is appreciable.

Android Solutions


Solution 1 - Android

This should work:

public static Bitmap getFacebookProfilePicture(String userID){
    URL imageURL = new URL("https://graph.facebook.com/" + userID + "/picture?type=large");
    Bitmap bitmap = BitmapFactory.decodeStream(imageURL.openConnection().getInputStream());

    return bitmap;
}

Bitmap bitmap = getFacebookProfilePicture(userId);

Edit:

As suggested by @dvpublic in the comments, the problem of image not being downloaded is fixed using by "https" in favour of "http".

Solution 2 - Android

use the facebook ProfilePictureView instead of an Imageview

<com.facebook.login.widget.ProfilePictureView
    android:id="@+id/friendProfilePicture"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    facebook:preset_size="small"/>

After that you can set facebook id like this in code

ProfilePictureView profilePictureView;

profilePictureView = (ProfilePictureView) findViewById(R.id.friendProfilePicture);

profilePictureView.setProfileId(userId);

it works.. also You can set the size to small/normal/large/custom for ProfilePictureView

Solution 3 - Android

Simply use Picasso. Add Picasso Library and then use this simple line code:

userpicture = (ImageView) row.findViewById(R.id.postuserid);
			
Picasso.with(context)
       .load("https://graph.facebook.com/" + userID+ "/picture?type=large")
       .into(userpicture);

Solution 4 - Android

Best way to Get Profile Picture URL

int dimensionPixelSize = getResources().getDimensionPixelSize(com.facebook.R.dimen.com_facebook_profilepictureview_preset_size_large);
Uri profilePictureUri= Profile.getCurrentProfile().getProfilePictureUri(dimensionPixelSize , dimensionPixelSize);

or

Uri profilePictureUri = ImageRequest.getProfilePictureUri(Profile.getCurrentProfile().getId(), dimensionPixelSize , dimensionPixelSize );

Use Glide to show Image

Glide.with(this).load(profilePictureUri)
                .diskCacheStrategy(DiskCacheStrategy.SOURCE)
                .into(profilePictureView);

No more hard-coded string

Solution 5 - Android

You have to call GraphRequest API for getting URL of current Profile Picture.

Bundle params = new Bundle();
params.putString("fields", "id,email,picture.type(large)");
new GraphRequest(AccessToken.getCurrentAccessToken(), "me", params, HttpMethod.GET,
	    new GraphRequest.Callback() {
	        @Override
			public void onCompleted(GraphResponse response) {
				if (response != null) {
					try {
						JSONObject data = response.getJSONObject();
						if (data.has("picture")) {
							String profilePicUrl = data.getJSONObject("picture").getJSONObject("data").getString("url");
                            Bitmap profilePic = BitmapFactory.decodeStream(profilePicUrl.openConnection().getInputStream());
                            // set profilePic bitmap to imageview
						}
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			}
}).executeAsync();

I hope it helps!

Solution 6 - Android

NOTE: From 26 Mar 2018, all solutions related to manual link don't work anymore

You should follow the official guide here

private static String FACEBOOK_FIELD_PROFILE_IMAGE = "picture.type(large)";
    private static String FACEBOOK_FIELDS = "fields";

    private void getFacebookData() {
        GraphRequest request = GraphRequest.newMeRequest(
                AccessToken.getCurrentAccessToken(),
                (object, response) -> {
                    updateAvatar(getImageUrl(response));
                });
        Bundle parameters = new Bundle();
        parameters.putString(FACEBOOK_FIELDS, FACEBOOK_FIELD_PROFILE_IMAGE);
        request.setParameters(parameters);
        request.executeAsync();
    }

    private static String FACEBOOK_FIELD_PICTURE = "picture";
    private static String FACEBOOK_FIELD_DATA = "data";
    private static String FACEBOOK_FIELD_URL = "url";
    private String getImageUrl(GraphResponse response) {
        String url = null;
        try {
            url = response.getJSONObject()
                    .getJSONObject(FACEBOOK_FIELD_PICTURE)
                    .getJSONObject(FACEBOOK_FIELD_DATA)
                    .getString(FACEBOOK_FIELD_URL);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return url;
    }

Solution 7 - Android

> check the user Id use this url

imgurl="https://graph.facebook.com/"+user.getId()+"/picture";

Solution 8 - Android

I always received a response stating a FACEBOOK_NON_JSON_RESULT. So looking back in Facebook’s graph API explorer I noted a little checkbox with the label redirect checked. Some googling showed me that I needed to provide a parameter to my GraphRequest that disallows the redirect. Hence the correct request must be:

 Bundle params = new Bundle();
 params.putBoolean("redirect", false);

     new GraphRequest(
     AccessToken.getCurrentAccessToken(),
     "me/picture",
     params,
     HttpMethod.GET,
     new GraphRequest.Callback() {
        public void onCompleted(GraphResponse response) {
            try {
                String picUrlString = (String) response.getJSONObject().getJSONObject("data").get("url");   
                //Load picture url in imageView
                Glide.with(this).load(picUrlString).diskCacheStrategy(DiskCacheStrategy.SOURCE).into(profilePictureView);
            } catch (JSONException | IOException e) {
                e.printStackTrace();
            }
        }
    }
 ).executeAsync();                                      

Solution 9 - Android

imgUrl = "https://graph.facebook.com/" + user_id + "/picture?type=large";

try this

Solution 10 - Android

new AsyncTask<String, Void, Bitmap>() {
        @Override
        protected Bitmap doInBackground(String... params) {
            Bitmap bitmap = null;
            try {
                String imageURL = "https://graph.facebook.com/" + mFbUserId +"/picture?width=150&width=150";
                URL imageURI = new URL(imageURL);
                bitmap = BitmapFactory.decodeStream(imageURI.openConnection().getInputStream());

            } catch (Exception e) {
                e.printStackTrace();
            }
            return bitmap;
        }

        @Override
        protected void onPostExecute(Bitmap bitmap) {
            super.onPostExecute(bitmap);
           
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }
    }.execute();

Solution 11 - Android

imgUrl = "https://graph.facebook.com/" + user_id + "/picture?type=large";

then Picasso.with(getApplicationContext()).load(imgUrl).into(imageView);

Solution 12 - Android

I think problem is in the

imageURL = "**http**://graph.facebook.com/"+userID+"/picture?type=large";

Use https insted of http

Solution 13 - Android

Bundle bundle = new Bundle();

bundle.putString ("fields", "full_picture,message");

new GraphRequest(
                AccessToken.getCurrentAccessToken(),
                "{page-id}/feed",
                bundle,
                HttpMethod.GET,
                new GraphRequest.Callback() {
                    public void onCompleted(GraphResponse response) {
            /* handle the result */
                        Log.e("TAG", response.toString());
                    }
                }
        ).executeAsync();

Solution 14 - Android

With Glide:

userId = loginResult.getAccessToken().getUserId();

then;

Glide.with(this)
        .load("https://graph.facebook.com/" + userId+ "/picture?type=large")
        .into(imgProfile);

Solution 15 - Android

Facebook API Graph Version 3.2

I've made this implementation:

First make shure you have this permissions added in "onStart" or "onCreate" (This avoids the NetworkOnMainThreadException).

StrictMode.ThreadPolicy policy = new 
StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);

After that you can use the next function:

//Next lines are Strings used as params
public static String FACEBOOK_FIELD_PROFILE_IMAGE = "picture.type(large)";
public static String FACEBOOK_FIELDS = "fields";

//A function that can be accessed from OnCreate (Or a similar function)
private void setImageProfileFacebook(){

        AccessToken accessToken = AccessToken.getCurrentAccessToken();
        boolean isLoggedIn = accessToken != null && !accessToken.isExpired();            

        if(isLoggedIn) {
        //If the user is LoggedIn then continue
            Bundle parameters = new Bundle();
            parameters.putString(Util.FACEBOOK_FIELDS, Util.FACEBOOK_FIELD_PROFILE_IMAGE);
            /* make the API call */
            new GraphRequest(
                    AccessToken.getCurrentAccessToken(),
                    "me",
                    parameters,
                    HttpMethod.GET,
                    new GraphRequest.Callback() {
                        public void onCompleted(GraphResponse response) {
                            /* handle the result */
                            if (response != null) {
                                try {
                                    JSONObject data = response.getJSONObject();
                                    //Log.w(TAG, "Data: " + response.toString());

                                    if (data.has("picture")) {
                                        boolean is_silhouette = data.getJSONObject("picture").getJSONObject("data").getBoolean("is_silhouette");
                                        if (!is_silhouette) {
                                        //Silhouette is used when the FB user has no upload any profile image
                                            URL profilePicUrl = new URL(data.getJSONObject("picture").getJSONObject("data").getString("url"));
                                            InputStream in = (InputStream) profilePicUrl.getContent();
                                            Bitmap bitmap = BitmapFactory.decodeStream(in);
                                            imageViewProfileFisio.setImageBitmap(bitmap);
                                        }
                                    }

                                } catch (Exception e) {
                                    e.printStackTrace();
                                }
                            } else {
                                Log.w(TAG, "Response null");
                            }
                        }
                    }
            ).executeAsync();
        }
    }

My example was created using the official documentation: https://developers.facebook.com/docs/graph-api/reference/profile-picture-source/?locale=es_LA

Solution 16 - Android

This should solve it. but be sure to access setfollowredirects statically i.e HttpURLConnection.setFollowRedirects(HttpURLConnection.getFollowRedirects());

url = new URL("https://graph.facebook.com/ID/picture?type=small");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();							               HttpURLConnection.setFollowRedirects(HttpURLConnection.getFollowRedirects());
connection.setDoInput(true);
connection.connect();
input = connection.getInputStream();
					
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeStream(input, null, options);
							
// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, 300, 300);
			
 // Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
options.inPreferredConfig = Config.RGB_565;
myBitmap= BitmapFactory.decodeStream(input, null, options);

or

url = new URL("https://graph.facebook.com/ID/picture?type=small");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();							                    HttpURLConnection.setFollowRedirects(HttpURLConnection.getFollowRedirects());
connection.setDoInput(true);
connection.connect();
input = connection.getInputStream();
myBitmap= BitmapFactory.decodeStream(input);

Hope this helps

Solution 17 - Android

I have done this way:

Get Bitmap from Image Url of Facebook:

String imageUrl = "http://graph.facebook.com/103407310026838/picture?type=large&width=1000&height=1000";

Bitmap bitmap = getFacebookProfilePicture(imageUrl);

Function for Bitmap:

private Bitmap getFacebookProfilePicture(String url){
	Bitmap bitmap = null;
	HttpGet httpRequest = new HttpGet(URI.create(url));
	HttpClient httpclient = new DefaultHttpClient();
	HttpResponse mResponse;
	try {
	mResponse = (HttpResponse) httpclient.execute(httpRequest);
	HttpEntity entity = mResponse.getEntity();
		BufferedHttpEntity bufHttpEntity = new BufferedHttpEntity(entity);
		bitmap = BitmapFactory.decodeStream(bufHttpEntity.getContent());
		httpRequest.abort();
	}
	catch(Exception e){
		e.printStackTrace();
	}
   return bitmap;
 }

It's Done.

Solution 18 - Android

private void importFbProfilePhoto() {

    if (AccessToken.getCurrentAccessToken() != null) {

        GraphRequest request = GraphRequest.newMeRequest(
                AccessToken.getCurrentAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
                    @Override
                    public void onCompleted(JSONObject me, GraphResponse response) {

                        if (AccessToken.getCurrentAccessToken() != null) {

                            if (me != null) {

                                String profileImageUrl = ImageRequest.getProfilePictureUri(me.optString("id"), 500, 500).toString();
                                Log.i(LOG_TAG, profileImageUrl);

                            }
                        }
                    }
                });
        GraphRequest.executeBatchAsync(request);
    }
}

Solution 19 - Android

When you make request like this:

http://graph.facebook.com/103407310026838/picture?type=square&type=large

it makes a redirect to other url..

You need to add an extra param on Get request

redirect=false

Like this

http://graph.facebook.com/103407310026838/picture?type=square&type=large&redirect=false

and you will get the a Json with Real Image url..

Like this :

{
   "data": {
      "is_silhouette": true,
      "url": "https://scontent.xx.fbcdn.net/v/t1.0-1/s200x200/1379841_10150004552801901_469209496895221757_n.jpg?oh=4234dcdfc832a58b9ef7a31c7896c73c&oe=57DD01F8"
   }
}

finally make new request to get the image that you found in data->url

Solution 20 - Android

Url seems OK.

So problem is with your connection. Does URL.getContent() really return stream? Because if BitmapFactory gets null it also returns null.

Try this:

Bitmap bitmap = null;
URL url = new URL(http://graph.facebook.com/"+userID+"/picture?type=large);
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
try {
   InputStream in = new BufferedInputStream(urlConnection.getInputStream());
   bitmap = BitmapFactory.decodeStream(in);
}
finally {
      urlConnection.disconnect();
}

Solution 21 - Android

This is probably you are run your methods in main thread use

if( android.os.Build.VERSION.SDK_INT > 9 )
{
  try
  {
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy( policy );
  }
}

Solution 22 - Android

   public static Bitmap getFacebookProfilePicture(String userID)
    			throws SocketException, SocketTimeoutException,
    			MalformedURLException, IOException, Exception {
    		String imageURL;
    		Bitmap bitmap = null;
    		imageURL = "http://graph.facebook.com/" + userID
    				+ "/picture?type=large";
    		
    		 URL url1 = new URL(imageURL);
    		    HttpURLConnection ucon1 = (HttpURLConnection) url1.openConnection();
    		    ucon1.setInstanceFollowRedirects(false);
    		    URL secondURL1 = new URL(ucon1.getHeaderField("Location"));
    		InputStream in = (InputStream) new URL(imageURL).getContent();
    		bitmap = BitmapFactory.decodeStream(in);
    		return bitmap;
    	}

use this code.....

Solution 23 - Android

You are getting null because the call to URL.openConnection() (or any other mechanism to fetch the image) is asynchronous. It returns after your line: return bitmap;. Therefore bitmap is always null.

I suggest using a callback instead.

This is what i did:

final AQuery androidQuery = new AQuery(this);

        AjaxCallback<byte[]> imageCallback = new AjaxCallback<byte[]>() {

            @Override
            public void callback(String url, byte[] avatar, AjaxStatus status) {

                if (avatar != null) {
                    save(avatar);
                } else {
                    Log.e(TAG, "Cannot fetch third party image. AjaxStatus: " + status.getError());
                }
            }

        };

        androidQuery.ajax(imageUrl, byte[].class, imageCallback);

Android query allows you to get the image in different formats (e.g. byte array, Bitmap, etc.). There are other libraries out there, but the idea is the same.

Solution 24 - Android

A complete solution which worked for me!

import android.app.Dialog;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Html;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
 
import com.facebook.AccessToken;
import com.facebook.CallbackManager;
import com.facebook.FacebookCallback;
import com.facebook.FacebookException;
import com.facebook.FacebookSdk;
import com.facebook.GraphRequest;
import com.facebook.GraphResponse;
import com.facebook.login.LoginResult;
import com.facebook.login.widget.LoginButton;
import com.facebook.login.widget.ProfilePictureView;
import com.facebook.share.model.ShareLinkContent;
import com.facebook.share.widget.ShareDialog;
 
import org.json.JSONException;
import org.json.JSONObject;
 
public class MainActivity extends AppCompatActivity {
    CallbackManager callbackManager;
    Button share,details;
    ShareDialog shareDialog;
    LoginButton login;
    ProfilePictureView profile;
    Dialog details_dialog;
    TextView details_txt;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        FacebookSdk.sdkInitialize(getApplicationContext());
        setContentView(R.layout.activity_main);
 
        callbackManager = CallbackManager.Factory.create();
        login = (LoginButton)findViewById(R.id.login_button);
        profile = (ProfilePictureView)findViewById(R.id.picture);
        shareDialog = new ShareDialog(this);
        share = (Button)findViewById(R.id.share);
        details = (Button)findViewById(R.id.details);
        login.setReadPermissions("public_profile email");
        share.setVisibility(View.INVISIBLE);
        details.setVisibility(View.INVISIBLE);
        details_dialog = new Dialog(this);
        details_dialog.setContentView(R.layout.dialog_details);
        details_dialog.setTitle("Details");
        details_txt = (TextView)details_dialog.findViewById(R.id.details);
        details.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                details_dialog.show();
            }
        });
 
        if(AccessToken.getCurrentAccessToken() != null){
            RequestData();
            share.setVisibility(View.VISIBLE);
            details.setVisibility(View.VISIBLE);
        }
        login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(AccessToken.getCurrentAccessToken() != null) {
                    share.setVisibility(View.INVISIBLE);
                    details.setVisibility(View.INVISIBLE);
                    profile.setProfileId(null);
                }
            }
        });
        share.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ShareLinkContent content = new ShareLinkContent.Builder().build();
                shareDialog.show(content);
 
            }
        });
        login.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
            @Override
            public void onSuccess(LoginResult loginResult) {
 
                if(AccessToken.getCurrentAccessToken() != null){
                    RequestData();
                    share.setVisibility(View.VISIBLE);
                    details.setVisibility(View.VISIBLE);
                }
            }
 
            @Override
            public void onCancel() {
 
            }
 
            @Override
            public void onError(FacebookException exception) {
            }
        });
 
    }
    public void RequestData(){
        GraphRequest request = GraphRequest.newMeRequest(AccessToken.getCurrentAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
            @Override
            public void onCompleted(JSONObject object,GraphResponse response) {
 
                JSONObject json = response.getJSONObject();
                try {
                    if(json != null){
                        String text = "<b>Name :</b> "+json.getString("name")+"<br><br><b>Email :</b> "+json.getString("email")+"<br><br><b>Profile link :</b> "+json.getString("link");
                        details_txt.setText(Html.fromHtml(text));
                        profile.setProfileId(json.getString("id"));
                    }
 
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        });
        Bundle parameters = new Bundle();
        parameters.putString("fields", "id,name,link,email,picture");
        request.setParameters(parameters);
        request.executeAsync();
    }
 
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        callbackManager.onActivityResult(requestCode, resultCode, data);
    }
 
}

Solution 25 - Android

I search all modes to make this on API 15 only this method work for me whith Volley:

String url = "https://graph.facebook.com/"+ fid +"/picture?type=square";
                ImageRequest request = new ImageRequest(url,
                        new Response.Listener<Bitmap>() {
                            @Override
                            public void onResponse(Bitmap bitmap) {
                                imageView.setImageBitmap(bitmap);
                            }
                        }, 0, 0, null,
                        new Response.ErrorListener() {
                            public void onErrorResponse(VolleyError error) {
                                Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_LONG).show();
                            }
                        });
                AppController.getInstance().addToRequestQueue(request);

Solution 26 - Android

On my graph api was not working because of the question mark

If you are using 1 pram after picture it would be

picture&type=large

for two params we would use the question mark

picture?type=large&redirect=false

Hope it Helps!

Solution 27 - Android

I used this code and i got the profile picture,

fbUsrPicURL = "http://graph.facebook.com" + File.separator
					+ String.valueOf(fbUID) + File.separator + "picture?type=large";

Solution 28 - Android

Download the source code from here

Add this dependency:

compile 'com.facebook.android:facebook-android-sdk:4.0.1'

activity_main.xml

<LinearLayout android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    xmlns:android="http://schemas.android.com/apk/res/android">


    <ImageView
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:id="@+id/iv_image"
        android:layout_marginTop="10dp"
        android:layout_marginBottom="10dp"
        android:layout_gravity="center_horizontal"
        android:src="@drawable/profile"/>


    <LinearLayout
        android:layout_width="match_parent"
        android:orientation="horizontal"
        android:layout_height="wrap_content">
        <TextView
            android:layout_width="100dp"
            android:layout_height="40dp"
            android:text="Name"
            android:gravity="center_vertical"
            android:textSize="15dp"
            android:textColor="#000000"

            android:layout_marginLeft="10dp"
            android:layout_marginTop="10dp"/>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="40dp"
            android:text="Name"
            android:textSize="15dp"
            android:id="@+id/tv_name"
            android:gravity="center_vertical"
            android:textColor="#000000"
            android:layout_marginLeft="10dp"
            android:layout_marginTop="10dp"/>

    </LinearLayout>


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

    <TextView
        android:layout_width="100dp"
        android:layout_height="40dp"
        android:text="Email"
        android:gravity="center_vertical"
        android:textSize="15dp"
        android:layout_below="@+id/tv_name"
        android:textColor="#000000"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="10dp"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="40dp"
        android:layout_below="@+id/tv_name"
        android:text="Email"
        android:gravity="center_vertical"
        android:textSize="15dp"
        android:id="@+id/tv_email"
        android:textColor="#000000"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="10dp"/>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <TextView
            android:layout_width="100dp"
            android:layout_height="40dp"
            android:text="DOB"
            android:gravity="center_vertical"
            android:textSize="15dp"
            android:textColor="#000000"
            android:layout_marginLeft="10dp"
            android:layout_marginTop="10dp"/>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="40dp"
            android:layout_below="@+id/tv_name"
            android:text="DOB"
            android:gravity="center_vertical"
            android:textSize="15dp"
            android:id="@+id/tv_dob"
            android:layout_toRightOf="@+id/tv_email"
            android:textColor="#000000"
            android:layout_marginLeft="10dp"
            android:layout_marginTop="10dp"/>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <TextView
            android:layout_width="100dp"
            android:layout_height="40dp"
            android:text="Location"
            android:gravity="center_vertical"
            android:textSize="15dp"
            android:textColor="#000000"
            android:layout_marginLeft="10dp"
            android:layout_marginTop="10dp"/>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="40dp"
            android:layout_below="@+id/tv_name"
            android:text="location"
            android:gravity="center_vertical"
            android:textSize="15dp"
            android:id="@+id/tv_location"
            android:textColor="#000000"
            android:layout_marginLeft="10dp"
            android:layout_marginTop="10dp"/>
    </LinearLayout>


    <LinearLayout
        android:layout_width="match_parent"
        android:background="#6585C8"
        android:id="@+id/ll_facebook"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:layout_marginTop="40dp"
        android:layout_height="50dp">

        <ImageView
            android:layout_width="50dp"
            android:src="@drawable/facebook"
            android:id="@+id/iv_facebook"
            android:layout_height="50dp" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Login with Facebook"
            android:textSize="20dp"
            android:textColor="#FFFFFF"
            android:textStyle="bold"
            android:id="@+id/tv_facebook"
            android:layout_marginLeft="20dp"
            android:gravity="center"
            android:layout_gravity="center"

            />

    </LinearLayout>

    </LinearLayout>

MainActivity.java

package facebooklocation.facebooklocation;

import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.Signature;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Base64;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import com.facebook.AccessToken;
import com.facebook.CallbackManager;
import com.facebook.FacebookCallback;
import com.facebook.FacebookException;
import com.facebook.FacebookSdk;
import com.facebook.GraphRequest;
import com.facebook.GraphResponse;
import com.facebook.HttpMethod;
import com.facebook.login.LoginManager;
import com.facebook.login.LoginResult;
import org.json.JSONObject;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    CallbackManager callbackManager;
    ImageView iv_image, iv_facebook;
    TextView tv_name, tv_email, tv_dob, tv_location, tv_facebook;
    LinearLayout ll_facebook;
    String str_facebookname, str_facebookemail, str_facebookid, str_birthday, str_location;
    boolean boolean_login;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        init();
        getKeyHash();
        listener();
    }


    private void init() {
        iv_image = (ImageView) findViewById(R.id.iv_image);
        iv_facebook = (ImageView) findViewById(R.id.iv_facebook);
        tv_name = (TextView) findViewById(R.id.tv_name);
        tv_email = (TextView) findViewById(R.id.tv_email);
        tv_dob = (TextView) findViewById(R.id.tv_dob);
        tv_location = (TextView) findViewById(R.id.tv_location);
        tv_facebook = (TextView) findViewById(R.id.tv_facebook);
        ll_facebook = (LinearLayout) findViewById(R.id.ll_facebook);
        FacebookSdk.sdkInitialize(this.getApplicationContext());
    }

    private void listener() {
        tv_facebook.setOnClickListener(this);
        ll_facebook.setOnClickListener(this);
        iv_facebook.setOnClickListener(this);

    }

    private void facebookLogin() {
        callbackManager = CallbackManager.Factory.create();
        LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
            @Override
            public void onSuccess(LoginResult loginResult) {
                Log.e("ONSUCCESS", "User ID: " + loginResult.getAccessToken().getUserId()
                        + "\n" + "Auth Token: " + loginResult.getAccessToken().getToken()
                );
                GraphRequest request = GraphRequest.newMeRequest(loginResult.getAccessToken(),
                        new GraphRequest.GraphJSONObjectCallback() {
                            @Override
                            public void onCompleted(JSONObject object, GraphResponse response) {
                                try {

                                    boolean_login = true;
                                    tv_facebook.setText("Logout from Facebook");

                                    Log.e("object", object.toString());
                                    str_facebookname = object.getString("name");

                                    try {
                                        str_facebookemail = object.getString("email");
                                    } catch (Exception e) {
                                        str_facebookemail = "";
                                        e.printStackTrace();
                                    }

                                    try {
                                        str_facebookid = object.getString("id");
                                    } catch (Exception e) {
                                        str_facebookid = "";
                                        e.printStackTrace();

                                    }


                                    try {
                                        str_birthday = object.getString("birthday");
                                    } catch (Exception e) {
                                        str_birthday = "";
                                        e.printStackTrace();
                                    }

                                    try {
                                        JSONObject jsonobject_location = object.getJSONObject("location");
                                        str_location = jsonobject_location.getString("name");

                                    } catch (Exception e) {
                                        str_location = "";
                                        e.printStackTrace();
                                    }

                                    fn_profilepic();

                                } catch (Exception e) {

                                }
                            }
                        });
                Bundle parameters = new Bundle();
                parameters.putString("fields", "id, name, email,gender,birthday,location");

                request.setParameters(parameters);
                request.executeAsync();
            }

            @Override
            public void onCancel() {
                if (AccessToken.getCurrentAccessToken() == null) {
                    return; // already logged out
                }
                new GraphRequest(AccessToken.getCurrentAccessToken(), "/me/permissions/", null, HttpMethod.DELETE, new GraphRequest
                        .Callback() {
                    @Override
                    public void onCompleted(GraphResponse graphResponse) {
                        LoginManager.getInstance().logOut();
                        LoginManager.getInstance().logInWithReadPermissions(MainActivity.this, Arrays.asList("public_profile,email"));
                        facebookLogin();

                    }
                }).executeAsync();


            }

            @Override
            public void onError(FacebookException e) {
                Log.e("ON ERROR", "Login attempt failed.");


                AccessToken.setCurrentAccessToken(null);
                LoginManager.getInstance().logInWithReadPermissions(MainActivity.this, Arrays.asList("public_profile,email,user_birthday"));
            }
        });
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        try {
            callbackManager.onActivityResult(requestCode, resultCode, data);
        } catch (Exception e) {

        }

    }

    private void getKeyHash() {
        // Add code to print out the key hash
        try {
            PackageInfo info = getPackageManager().getPackageInfo("facebooklocation.facebooklocation", PackageManager.GET_SIGNATURES);
            for (Signature signature : info.signatures) {
                MessageDigest md = MessageDigest.getInstance("SHA");
                md.update(signature.toByteArray());
                Log.d("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT));
            }
        } catch (PackageManager.NameNotFoundException e) {

        } catch (NoSuchAlgorithmException e) {

        }
    }

    private void fn_profilepic() {

        Bundle params = new Bundle();
        params.putBoolean("redirect", false);
        params.putString("type", "large");
        new GraphRequest(
                AccessToken.getCurrentAccessToken(),
                "me/picture",
                params,
                HttpMethod.GET,
                new GraphRequest.Callback() {
                    public void onCompleted(GraphResponse response) {

                        Log.e("Response 2", response + "");

                        try {
                            String str_facebookimage = (String) response.getJSONObject().getJSONObject("data").get("url");
                            Log.e("Picture", str_facebookimage);

                            Glide.with(MainActivity.this).load(str_facebookimage).skipMemoryCache(true).into(iv_image);

                        } catch (Exception e) {
                            e.printStackTrace();
                        }

                        tv_name.setText(str_facebookname);
                        tv_email.setText(str_facebookemail);
                        tv_dob.setText(str_birthday);
                        tv_location.setText(str_location);

                    }
                }
        ).executeAsync();
    }


    @Override
    public void onClick(View view) {

        if (boolean_login) {
            boolean_login = false;
            LoginManager.getInstance().logOut();
            tv_location.setText("");
            tv_dob.setText("");
            tv_email.setText("");
            tv_name.setText("");
            Glide.with(MainActivity.this).load(R.drawable.profile).into(iv_image);
            tv_facebook.setText("Login with Facebook");
        } else {
            LoginManager.getInstance().logInWithReadPermissions(MainActivity.this, Arrays.asList("public_profile,email,user_birthday,user_location"));
            facebookLogin();
        }


    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
        LoginManager.getInstance().logOut();
    }
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionZbarcea ChristianView Question on Stackoverflow
Solution 1 - AndroidJeffrey KlardieView Answer on Stackoverflow
Solution 2 - AndroidNikhil BoradView Answer on Stackoverflow
Solution 3 - AndroidJesmeen HoqueView Answer on Stackoverflow
Solution 4 - AndroidOM PRAKASH SEERVIView Answer on Stackoverflow
Solution 5 - AndroidRajeshView Answer on Stackoverflow
Solution 6 - Androidthanhbinh84View Answer on Stackoverflow
Solution 7 - AndroidAmit kumarView Answer on Stackoverflow
Solution 8 - AndroidRavi VaghelaView Answer on Stackoverflow
Solution 9 - AndroidanonymousView Answer on Stackoverflow
Solution 10 - AndroidMonir KhlafView Answer on Stackoverflow
Solution 11 - AndroidMisho ZhghentiView Answer on Stackoverflow
Solution 12 - AndroidArpit PatelView Answer on Stackoverflow
Solution 13 - AndroidRohan MistryView Answer on Stackoverflow
Solution 14 - AndroidEge KuzubasiogluView Answer on Stackoverflow
Solution 15 - AndroidHerbert RomeroView Answer on Stackoverflow
Solution 16 - AndroidUche DimView Answer on Stackoverflow
Solution 17 - AndroidHiren PatelView Answer on Stackoverflow
Solution 18 - AndroidTigran SarkisianView Answer on Stackoverflow
Solution 19 - AndroidCliffView Answer on Stackoverflow
Solution 20 - Androiduser123View Answer on Stackoverflow
Solution 21 - AndroidTaras MatolinetsView Answer on Stackoverflow
Solution 22 - AndroidBhavishya PrajapatiView Answer on Stackoverflow
Solution 23 - AndroidianView Answer on Stackoverflow
Solution 24 - AndroidAshishView Answer on Stackoverflow
Solution 25 - AndroidjamaglianView Answer on Stackoverflow
Solution 26 - AndroidAMunimView Answer on Stackoverflow
Solution 27 - AndroidAerrowView Answer on Stackoverflow
Solution 28 - AndroidDeepshikha PuriView Answer on Stackoverflow