web-dev-qa-db-ja.com

Android:FirebaseAuthを使用してFacebookからより大きなプロフィール写真を取得する方法?

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が異なるとは思えません。

20
Gaurav Sarma

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

2行のコード。 FirebaseUser user = firebaseAuth.getCurrentUser();

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

末尾に"?height=500"を追加するだけです

19
Soropromo

誰かがこれを探しているが、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プロフィール写真のサイズを取得してください。

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

このリンクをユーザーfacebookIdを使用してfirebaseデータベースに保存し、アプリで使用できます。また、パラメータとして高さを変更できます

3

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

}
1
HixField