简体   繁体   English

Android-Facebook和Google登录

[英]Android - facebook and google log in

I am trying to handle Facebook and Google login into a single activity 我正在尝试将Facebook和Google登录到一个活动中

The google login works but Facebook login is not showing the request permission dialog. Google登录有效,但Facebook登录未显示请求权限对话框。 When I click login with Facebook button I expect to see permissions dialog for public profile and email. 当我单击“使用Facebook登录”按钮时,我希望看到公开个人资料和电子邮件的权限对话框。 Although the dialog does not appear it seems that I am signed in as Login with Facebook changes to Logout. 尽管没有出现该对话框,但似乎我以Facebook登录身份登录更改为注销。 Is there any better way of doing this? 有什么更好的方法吗?

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

}

try this: Declare the variables: 试试这个:声明变量:

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

in your onCreate() method.. 在您的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();

Now in updateWithToken() method 现在在updateWithToken()方法中

 private void updateWithToken(AccessToken currentAccessToken) {

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

Now in the callback manager you have to track user's current profile 现在,在回调管理器中,您必须跟踪用户的当前配置文件

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

If you don't mind using a WebView then try CloudRail for social login, it's very simple to use. 如果您不介意使用WebView,请尝试使用CloudRail进行社交登录,它的使用非常简单。 https://github.com/CloudRail/cloudrail-si-android-sdk https://github.com/CloudRail/cloudrail-si-android-sdk

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何判断是否先登录Facebook-Android - How to tell if first Facebook log in - Android 如何从Android中的谷歌帐户注销? - How to log out from google account in android ? Android上的Facebook登录按钮和Google服务错误 - Facebook login button and google services error on Android Android-Facebook使用您自己的按钮在活动之外登录 - Android - Facebook log in outside of an Activity with your own button 使用 httpurlconnection 登录 Facebook - Log in to facebook using httpurlconnection Android上的Google登录-由于未登录而无法登录 - Google SignIn on Android - Log out does not work since not logged in 链接以在Android或iOS上启动Facebook或Google+应用 - Link to start Facebook or Google+ app on Android or iOS 在单个活动中将Facebook,Twitter和Google连接起来android onActivityResult错误 - connect facebook, twitter and google in a single activity android onActivityResult Error 使用 Google 和 Facebook 等身份提供商在 Keycloak 上进行 Android 身份验证 - Android authentication on Keycloak with identity providers like Google and Facebook Android应用程序中的Google,Facebook,Yahoo oauth / oauth2 - Google, Facebook, Yahoo oauth/oauth2 in Android application
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM