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.
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);
Zwei Codezeilen. FirebaseUser user = firebaseAuth.getCurrentUser();
String photoUrl = user.getPhotoUrl().toString();
photoUrl = photoUrl + "?height=500";
fügen Sie am Ende einfach "?height=500"
hinzu
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.
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
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
}
}
}
}