skip to Main Content

I am using FirebaseAuth to login user through FB. Here is the code:

private FirebaseAuth mAuth;
private FirebaseAuth.AuthStateListener mAuthListener;
private CallbackManager mCallbackManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    FacebookSdk.sdkInitialize(getApplicationContext());

    // Initialize Firebase Auth
    mAuth = FirebaseAuth.getInstance();

    mAuthListener = firebaseAuth -> {
        FirebaseUser user = firebaseAuth.getCurrentUser();
        if (user != null) {
            // User is signed in
            Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid());
        } else {
            // User is signed out
            Log.d(TAG, "onAuthStateChanged:signed_out");
        }

        if (user != null) {
            Log.d(TAG, "User details : " + user.getDisplayName() + user.getEmail() + "n" + user.getPhotoUrl() + "n"
                    + user.getUid() + "n" + user.getToken(true) + "n" + user.getProviderId());
        }
    };
}

The issue is that the photo in I get from using user.getPhotoUrl() is very small. I need a larger image and can’t find a way to do that. Any help would be highly appreciated.
I have already tried this
Get larger facebook image through firebase login
but it’s not working although they are for swift I don’t think the API should differ.

8

Answers


  1. It is not possible to obtain a profile picture from Firebase that is larger than the one provided by getPhotoUrl(). However, the Facebook graph makes it pretty simple to get a user’s profile picture in any size you want, as long as you have the user’s Facebook ID.

    String facebookUserId = "";
    FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
    ImageView profilePicture = (ImageView) findViewById(R.id.image_profile_picture);
    
    // find the Facebook profile and get the user's id
    for(UserInfo profile : user.getProviderData()) {
        // check if the provider id matches "facebook.com"    
        if(FacebookAuthProvider.PROVIDER_ID.equals(profile.getProviderId())) {
            facebookUserId = profile.getUid();
        }
    }
    
    // construct the URL to the profile picture, with a custom height
    // alternatively, use '?type=small|medium|large' instead of ?height=
    String photoUrl = "https://graph.facebook.com/" + facebookUserId + "/picture?height=500";
    
    // (optional) use Picasso to download and show to image
    Picasso.with(this).load(photoUrl).into(profilePicture);
    
    Login or Signup to reply.
  2. If someone is looking for this but for Google account using FirebaseAuth. I have found a workaround for this. If you detail the picture URL:

    https://lh4.googleusercontent.com/../…/…/…/s96-c/photo.jpg

    The /s96-c/ specifies the image size (96×96 in this case)so you just need to replace that value with the desired size.

    String url= FirebaseAuth.getInstance().getCurrentUser().getPhotoUrl();
    url = url.replace("/s96-c/","/s300-c/");
    

    You can analyze your photo URL to see if there is any other way to change its size.

    As I said in the begining, this only works for Google accounts. Check @Mathias Brandt ‘s answer to get a custom facebook profile picture size.

    EDIT 2020:

    Thanks to Andres SK and @alextouzel for pointing this out. Photo URLs format have changed and now you can pass URL params to get different sizes of the picture. Check https://developers.google.com/people/image-sizing.

    Login or Signup to reply.
  3. photoUrl = "https://graph.facebook.com/" + facebookId+ "/picture?height=500"
    

    You can store this link to firebase database with user facebookId and use this in app.
    Also you can change height as a parameter

    Login or Signup to reply.
  4. Not for Android, but for iOS, but I thought it could be helpful for other people (I didn’t find a iOS version of this question).

    Based the provided answers I created a Swift 4.0 extension that adds a function urlForProfileImageFor(imageResolution:) to the Firebase User object. You can either ask for the standard thumbnail, a high resolution (I put this to 1024px but easily changed) or a custom resolution image. Enjoy:

    extension User {
    
        enum LoginType {
            case anonymous
            case email
            case facebook
            case google
            case unknown
        }
    
        var loginType: LoginType {
            if isAnonymous { return .anonymous }
            for userInfo in providerData {
                switch userInfo.providerID {
                case FacebookAuthProviderID: return .facebook
                case GoogleAuthProviderID  : return .google
                case EmailAuthProviderID   : return .email
                default                    : break
                }
            }
            return .unknown
        }
    
        enum ImageResolution {
            case thumbnail
            case highres
            case custom(size: UInt)
        }
    
        var facebookUserId : String? {
            for userInfo in providerData {
                switch userInfo.providerID {
                case FacebookAuthProviderID: return userInfo.uid
                default                    : break
                }
            }
            return nil
        }
    
    
        func urlForProfileImageFor(imageResolution: ImageResolution) -> URL? {
            switch imageResolution {
            //for thumnail we just return the std photoUrl
            case .thumbnail         : return photoURL
            //for high res we use a hardcoded value of 1024 pixels
            case .highres           : return urlForProfileImageFor(imageResolution:.custom(size: 1024))
            //custom size is where the user specified its own value
            case .custom(let size)  :
                switch loginType {
                //for facebook we assemble the photoUrl based on the facebookUserId via the graph API
                case .facebook :
                    guard let facebookUserId = facebookUserId else { return photoURL }
                    return URL(string: "https://graph.facebook.com/(facebookUserId)/picture?height=(size)")
                //for google the trick is to replace the s96-c with our own requested size...
                case .google   :
                    guard var url = photoURL?.absoluteString else { return photoURL }
                    url = url.replacingOccurrences(of: "/s96-c/", with: "/s(size)-c/")
                    return URL(string:url)
                //all other providers we do not support anything special (yet) so return the standard photoURL
                default        : return photoURL
                }
            }
        }
    
    }
    
    Login or Signup to reply.
  5. Two lines of code. FirebaseUser user = firebaseAuth.getCurrentUser();

    String photoUrl = user.getPhotoUrl().toString();
            photoUrl = photoUrl + "?height=500";
    

    simply append "?height=500" at the end

    Login or Signup to reply.
  6. Note: From Graph API v8.0 you must provide the access token for every UserID request you do.

    Hitting the graph API:

    https://graph.facebook.com/<user_id>/picture?height=1000&access_token=<any_of_above_token>
    

    With firebase:

    FirebaseUser user = mAuth.getCurrentUser();
    String photoUrl = user.getPhotoUrl() + "/picture?height=1000&access_token=" +
      loginResult.getAccessToken().getToken();
    

    You get the token from registerCallback just like this

           LoginManager.getInstance().registerCallback(mCallbackManager, new FacebookCallback<LoginResult>() {
            @Override
            public void onSuccess(LoginResult loginResult) {
                FirebaseUser user = mAuth.getCurrentUser();
                String photoUrl = user.getPhotoUrl() + "/picture?height=1000&access_token=" + loginResult.getAccessToken().getToken();
            }
    
            @Override
            public void onCancel() {
                Log.d("Fb on Login", "facebook:onCancel");
            }
    
            @Override
            public void onError(FacebookException error) {
                Log.e("Fb on Login", "facebook:onError", error);
            }
        });
    

    This is what documentation says:

    Beginning October 24, 2020, an access token will be required for all
    UID-based queries. If you query a UID and thus must include a token:

    • use a User access token for Facebook Login authenticated requests
    • use a Page access token for page-scoped requests
    • use an App access token for server-side requests
    • use a Client access token for mobile or web client-side requests

    We recommend that you only use a Client token if you are unable to use
    one of the other token types.

    Login or Signup to reply.
  7. I use this code in a Second Activity, after having already logged in, for me the Token that is obtained in loginResult.getAccessToken().getToken(); It expires after a while, so researching I found this and it has served me

    final String img = mAuthProvider.imgUsuario().toString(); // is = mAuth.getCurrentUser().getPhotoUrl().toString;
            
    final String newToken = "?height=1000&access_token=" + AccessToken.getCurrentAccessToken().getToken();
            
    Picasso.get().load(img + newToken).into("Image reference");
    
    Login or Signup to reply.
  8. Check below response

    final graphResponse = await http.get(
    'https://graph.facebook.com/v2.12/me?fields=name,picture.width(800).height(800),first_name,last_name,email&access_token=${fbToken}');
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search