wake-up-neo.com

Android: Wie erhält man mit FirebaseAuth ein größeres Profilbild von Facebook?

Ich benutze FirebaseAuth, um den Benutzer über den FB anzumelden. Hier ist der 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());
        }
    };
}

Das Problem ist, dass das Foto, das ich von user.getPhotoUrl() bekomme, sehr klein ist. Ich brauche ein größeres Bild und finde keinen Weg, das zu tun. Jede Hilfe wäre sehr dankbar. Ich habe es bereits ausprobiert Größere Facebook-Image durch Firebase-Login Aber es funktioniert nicht, obwohl sie für Swift sind. Ich denke nicht, dass sich die API unterscheiden sollte.

14
Gaurav Sarma

Es ist nicht möglich, ein Profilbild von Firebase zu erhalten, das größer ist als das von getPhotoUrl() bereitgestellte. Die Facebook-Grafik macht es jedoch ziemlich einfach, ein Profilbild eines Benutzers in jeder gewünschten Größe zu erhalten, solange Sie die Facebook-ID des Benutzers besitzen.

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

Zwei Codezeilen. FirebaseUser user = firebaseAuth.getCurrentUser();

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

fügen Sie am Ende einfach "?height=500" hinzu

19
Soropromo

Wenn jemand nach einem Google-Konto sucht, das FirebaseAuth verwendet. Ich habe dafür eine Problemumgehung gefunden. Wenn Sie die Bild-URL detailliert angeben:

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

Das/s96-c/gibt die Bildgröße an (in diesem Fall 96x96). Sie müssen diesen Wert nur durch die gewünschte Größe ersetzen.

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

Sie können Ihre Foto-URL analysieren, um festzustellen, ob die Größe auf andere Weise geändert werden kann.

Wie ich anfangs sagte, funktioniert das nur für Google-Konten. Überprüfen Sie die Antwort von @Mathias Brandt, um eine benutzerdefinierte Bildgröße des Facebook-Profils zu erhalten.

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

Sie können diesen Link in der Firebase-Datenbank mit Benutzer facebookId speichern und in der App verwenden. Sie können auch die Höhe als Parameter ändern

3

Nicht für Android, aber für iOS, aber ich dachte, es könnte für andere Leute hilfreich sein (ich habe keine iOS-Version dieser Frage gefunden).

Basierend auf den Antworten habe ich eine Swift 4.0-Erweiterung erstellt, die dem Firebase-Objekt User eine Funktion urlForProfileImageFor(imageResolution:) hinzufügt. Sie können entweder nach dem Standardminiaturbild, einer hohen Auflösung (ich kann dies auf 1024px setzen, aber leicht ändern) oder einem benutzerdefinierten Auflösungsbild fragen. Genießen:

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