FirebaseAuthを使用してFB経由でユーザーにログインしています。これがコードです:
_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());
}
};
}
_
問題は、user.getPhotoUrl()
を使用して取得した写真が非常に小さいことです。より大きな画像が必要ですが、それを行う方法が見つかりません。任意の助けをいただければ幸いです。私はすでにこれを試しました firebaseログインを通じてより大きなFacebookの画像を取得する ですが、Swiftの場合は機能しますが、APIが異なるとは思えません。
getPhotoUrl()
で提供されるものよりも大きいプロフィール画像をFirebaseから取得することはできません。ただし、Facebookグラフを使用すると、ユーザーの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);
2行のコード。 FirebaseUser user = firebaseAuth.getCurrentUser();
String photoUrl = user.getPhotoUrl().toString();
photoUrl = photoUrl + "?height=500";
末尾に"?height=500"
を追加するだけです
誰かがこれを探しているが、FirebaseAuthを使用するGoogleアカウントを探している場合。これの回避策を見つけました。画像のURLを詳しく説明する場合:
https://lh4.googleusercontent.com/../.../.../.../s96-c/photo.jpg
/ s96-c /は画像サイズ(この場合は96x96)を指定するので、その値を目的のサイズに置き換えるだけです。
String url= FirebaseAuth.getInstance().getCurrentUser().getPhotoUrl();
url = url.replace("/s96-c/","/s300-c/");
写真のURLを分析して、サイズを変更する方法が他にあるかどうかを確認できます。
最初に述べたように、これはGoogleアカウントでのみ機能します。 @Mathias Brandtの回答をチェックして、カスタムFacebookプロフィール写真のサイズを取得してください。
photoUrl = "https://graph.facebook.com/" + facebookId+ "/picture?height=500"
このリンクをユーザーfacebookIdを使用してfirebaseデータベースに保存し、アプリで使用できます。また、パラメータとして高さを変更できます
AndroidではなくiOSですが、他の人にも役立つと思いました(この質問のiOSバージョンは見つかりませんでした)。
提供された回答に基づいて、Swift 4.0拡張機能を作成し、Firebase User
オブジェクトに関数urlForProfileImageFor(imageResolution:)
を追加します。標準のサムネイルを要求するか、高解像度(これを1024pxに設定しましたが、簡単に変更できます)またはカスタム解像度の画像。
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
}
}
}
}