簡體   English   中英

Android-Facebook和Google登錄

[英]Android - facebook and google log in

我正在嘗試將Facebook和Google登錄到一個活動中

Google登錄有效,但Facebook登錄未顯示請求權限對話框。 當我單擊“使用Facebook登錄”按鈕時,我希望看到公開個人資料和電子郵件的權限對話框。 盡管沒有出現該對話框,但似乎我以Facebook登錄身份登錄更改為注銷。 有什么更好的方法嗎?

public class LoginActivity extends AppCompatActivity {

    private static final String TAG = LoginActivity.class.getSimpleName();
    private static final int RC_SIGN_IN = 1;
    private GoogleApiClient googleClient;
    private CallbackManager callbackManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        FacebookSdk.sdkInitialize(getApplicationContext());
        setContentView(R.layout.activity_login);


        callbackManager = CallbackManager.Factory.create();

        SignInButton googleButton = (SignInButton)findViewById(R.id.google_button);
        LoginButton facebookBtn = (LoginButton)findViewById(R.id.fb_login_button);
        Button emailButton = (Button)findViewById(R.id.email_button);
        googleButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(googleClient);
                startActivityForResult(signInIntent, RC_SIGN_IN);
            }
        });

        initGoogleSignIn();
        initFacebookSignIn(facebookBtn);
    }

    private boolean isLoggedInByFacebook(){
        AccessToken accessToken = AccessToken.getCurrentAccessToken();
        return accessToken != null;
    }

    private void initGoogleSignIn(){
        GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestIdToken(getString(R.string.default_web_client_id))
                .requestEmail()
                .build();

        googleClient = new GoogleApiClient.Builder(this)
                .enableAutoManage(this, new GoogleApiClient.OnConnectionFailedListener() {
                    @Override
                    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
                    }
                })
                .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
                .build();
        OptionalPendingResult<GoogleSignInResult> opr = Auth.GoogleSignInApi.silentSignIn(googleClient);
        if (opr.isDone()) {
            // If the user's cached credentials are valid, the OptionalPendingResult will be "done" and the GoogleSignInResult will be available instantly.
            Log.d("TAG", "Got cached sign-in");
            GoogleSignInResult result = opr.get();
            finish();
        }

    }

    private void initFacebookSignIn(LoginButton facebookBtn){
        if(isLoggedInByFacebook()) {
            finish();
        }else{
            callbackManager = CallbackManager.Factory.create();
            facebookBtn.setReadPermissions(Arrays.asList(
                     "public_profile","email"));
            // Callback registration
            facebookBtn.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
                @Override
                public void onSuccess(LoginResult loginResult) {
                    loginResult.getAccessToken().getUserId();
                    // App code
                    GraphRequest request = GraphRequest.newMeRequest(
                            loginResult.getAccessToken(),
                            new GraphRequest.GraphJSONObjectCallback() {
                                @Override
                                public void onCompleted(JSONObject object, GraphResponse response) {
                                    try {
                                        Log.i("Response",response.toString());
                                        String email = response.getJSONObject().getString("email");
                                        String name = response.getJSONObject().getString("name");
                                        finish();
                                    }catch (JSONException e){
                                        Log.e(TAG,"Error getting facebook email", e);
                                    }
                                }
                            });
                    Bundle parameters = new Bundle();
                    parameters.putString("fields", "name,email");
                    request.setParameters(parameters);
                    request.executeAsync();
                }

                @Override
                public void onCancel() {
                    // App code
                }
                @Override
                public void onError(FacebookException exception) {
                    Log.e(TAG,"Error in facebook sign in", exception);
                }
            });
        }
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == RC_SIGN_IN) {
            GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
            if (result.isSuccess()) {
                // Signed in successfully, show authenticated UI.
                GoogleSignInAccount acct = result.getSignInAccount();
                api.loginGoogle(acct.getIdToken()).subscribe(new Action1<User>() {
                    @Override
                    public void call(User user) {
                        api.getWeather(-31.0, 115.0).subscribe(new Action1<WeatherResponse>() {
                            @Override
                            public void call(WeatherResponse weatherResponse) {
                            }
                        });
                    }
                }, new Action1<Throwable>() {
                    @Override
                    public void call(Throwable throwable) {
                        System.out.println(throwable);
                    }
                });
            } else {
                System.out.println(result.getStatus());
            }
        }else { //facebook 
            callbackManager.onActivityResult(requestCode, resultCode, data);
        }
    }

}

試試這個:聲明變量:

  private CallbackManager callbackManager;
  private AccessTokenTracker accessTokenTracker;
  com.facebook.Profile profile;
  private ProfileTracker mProfileTracker;

在您的onCreate()方法中。

    FacebookSdk.sdkInitialize(getApplicationContext());
    callbackManager = CallbackManager.Factory.create();
    updateWithToken(AccessToken.getCurrentAccessToken());
    accessTokenTracker = new AccessTokenTracker() {
        @Override
        protected void onCurrentAccessTokenChanged(AccessToken oldToken, AccessToken newToken) {
            updateWithToken(newToken);
        }
    };
    accessTokenTracker.startTracking();

現在在updateWithToken()方法中

 private void updateWithToken(AccessToken currentAccessToken) {

    if (currentAccessToken != null) {
        LoginManager.getInstance().logOut();
    } else {
    }
}

現在,在回調管理器中,您必須跟蹤用戶的當前配置文件

List<String> permissionNeeds = Arrays.asList(
            "public_profile", "email", "user_birthday", "user_friends");
    loginButton.setReadPermissions(permissionNeeds);

    loginButton.registerCallback(callbackManager,
            new FacebookCallback<LoginResult>() {
                @Override
                public void onSuccess(LoginResult loginResult) {
                    Log.d("Success", "Login");
                    try {
                        if (Profile.getCurrentProfile() == null) {
                            mProfileTracker = new ProfileTracker() {
                                @Override
                                protected void onCurrentProfileChanged(Profile profile_old, Profile profile_new) {
                                    // profile2 is the new profile
                                    profile = profile_new;
                                    if (profile_new != null)
                                        Log.v("facebook - profile", profile_new.getFirstName());
                                    mProfileTracker.stopTracking();
                                }
                            };
                            mProfileTracker.startTracking();

                        } else {
                            profile = Profile.getCurrentProfile();
                            if (profile != null)
                                Log.v("facebook - profile", profile.getFirstName());
                        }

                        GraphRequest request = GraphRequest.newMeRequest(
                                loginResult.getAccessToken(),
                                new GraphRequest.GraphJSONObjectCallback() {
                                    @Override
                                    public void onCompleted(JSONObject object, GraphResponse response) {
                                        // Application code
                                        try {
                                            Log.v("FACEBOOK LOGIN", response.toString());
                                            fb_id = object.getString("id");
                                            fb_name = object.getString("name");
                                            fb_gender = object.getString("gender");
                                            fb_email = object.getString("email");
                                            fb_birthday = object.getString("birthday");
                                        } catch (Exception e) {
                                            e.printStackTrace();
                                            Log.d("Error", e.toString());
                                    }
                                });
                        Bundle parameters = new Bundle();
                        parameters.putString("fields", "id,name,email,gender,birthday,picture.type(small)");
                        request.setParameters(parameters);
                        request.executeAsync();

                    } catch (Exception e) {
                        Log.d("ERROR", e.toString());
                    }
                }

                @Override
                public void onCancel() {
                    Log.d("FACEBOOK ERRROR", "cancelled");
                }

                @Override
                public void onError(FacebookException exception) {
                    Log.d("FACEBOOK ERRROR", exception.toString());
            });

如果您不介意使用WebView,請嘗試使用CloudRail進行社交登錄,它的使用非常簡單。 https://github.com/CloudRail/cloudrail-si-android-sdk

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM