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.
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);
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.
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
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
}
}
}
}