web-dev-qa-db-fra.com

Android: Comment obtenir une photo de profil plus grande de Facebook avec FirebaseAuth?

J'utilise FirebaseAuth pour me connecter via FB. Voici le 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());
        }
    };
}

Le problème est que la photo que je reçois en utilisant user.getPhotoUrl() est très petite. J'ai besoin d'une image plus grande et je ne trouve pas le moyen de le faire. Toute aide serait très appréciée. J'ai déjà essayé ceci Obtenez une image plus grande de Facebook par le biais de la connexion firebase Mais cela ne fonctionne pas bien qu'ils soient pour Swift. Je ne pense pas que l'API devrait différer.

14
Gaurav Sarma

Il n’est pas possible d’obtenir une image de profil de Firebase plus grande que celle fournie par getPhotoUrl(). Cependant, le graphique de Facebook simplifie l'obtention de la photo de profil d'un utilisateur dans la taille de votre choix, à condition que vous disposiez de son identifiant Facebook.

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);
28
Mathias Brandt

Si quelqu'un cherche cela mais pour un compte Google en utilisant FirebaseAuth. J'ai trouvé une solution de contournement pour cela. Si vous détaillez l'URL de l'image:

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

Le/s96-c/spécifie la taille de l'image (96x96 dans ce cas), il vous suffit donc de remplacer cette valeur par la taille souhaitée.

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

Vous pouvez analyser l'URL de votre photo pour voir s'il existe un autre moyen de changer sa taille.

Comme je l'ai dit au début, cela ne fonctionne que pour les comptes Google. Vérifiez la réponse de @Mathias Brandt pour obtenir une taille d'image de profil facebook personnalisée.

9
Sebastian Duque
photoUrl = "https://graph.facebook.com/" + facebookId+ "/picture?height=500"

Vous pouvez stocker ce lien dans la base de données firebase avec l'utilisateur facebookId et l'utiliser dans l'application. Vous pouvez également modifier la hauteur en tant que paramètre

3
Omelchenko Anatolii

Pas pour Android, mais pour iOS, mais j'ai pensé que cela pourrait être utile pour d'autres personnes (je n'ai pas trouvé de version iOS de cette question).

Sur la base des réponses fournies, j'ai créé une extension Swift 4.0 qui ajoute une fonction urlForProfileImageFor(imageResolution:) à l'objet Firebase User. Vous pouvez demander la vignette standard, une résolution élevée (1024px mais facilement modifiée) ou une image de résolution personnalisée. Prendre plaisir:

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

}
1
HixField