简体   繁体   English

在单个活动中将Facebook,Twitter和Google连接起来android onActivityResult错误

[英]connect facebook, twitter and google in a single activity android onActivityResult Error

Hello Every One I am building an android app for my project and I have error in Facebook login and Twitter Login is not working 大家好,我正在为我的项目构建一个android应用程序,但是我在Facebook登录中出错并且Twitter登录无法正常工作

Here is my code for mainActivity.java 这是我的mainActivity.java代码

package com.example.creative.fbtest;

import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.facebook.CallbackManager;
import com.facebook.FacebookCallback;
import com.facebook.FacebookException;
import com.facebook.GraphRequest;
import com.facebook.GraphResponse;
import com.facebook.login.LoginManager;
import com.facebook.login.LoginResult;
import com.facebook.login.widget.LoginButton;
import com.google.android.gms.auth.api.Auth;
import com.google.android.gms.auth.api.signin.GoogleSignInAccount;
import com.google.android.gms.auth.api.signin.GoogleSignInOptions;
import com.google.android.gms.auth.api.signin.GoogleSignInResult;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.SignInButton;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.ResultCallback;
import com.google.android.gms.common.api.Status;
import com.twitter.sdk.android.core.Callback;
import com.twitter.sdk.android.core.Result;
import com.twitter.sdk.android.core.TwitterAuthConfig;
import com.twitter.sdk.android.core.TwitterException;
import com.twitter.sdk.android.core.TwitterSession;
import com.twitter.sdk.android.core.identity.TwitterLoginButton;

import org.json.JSONException;
import org.json.JSONObject;

import java.util.Arrays;

public class MainActivity extends AppCompatActivity implements android.view.View.OnClickListener,GoogleApiClient.OnConnectionFailedListener {
    //initialization
    private LoginButton loginButtonFb;
    private TextView textViewStatus;
    private CallbackManager FBcallbackManager;
    private LoginManager loginManager;
    private SignInButton signInButtonGoogle;
    private Button signOutButtonGoogle;
    private GoogleApiClient googleApiClient;
    private TextView txtEmail,txtName;
    private static final int request_code = 10;
    private LinearLayout profile_google;
    private ImageView prof_pic;
    private TwitterLoginButton signInButtonTwitter;






    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //initializing Facebook Sdk
       // FacebookSdk.sdkInitialize(getApplicationContext());
        setContentView(R.layout.activity_main);
        loginButtonFb = (LoginButton) findViewById(R.id.fb_login_button);
        textViewStatus = (TextView) findViewById(R.id.txt_login_status);

        //initialize
        profile_google = (LinearLayout) findViewById(R.id.profile_google_layout);
        signOutButtonGoogle = (Button) findViewById(R.id.gmail_logout_btn);
        signInButtonGoogle = (SignInButton) findViewById(R.id.google_sign_in_button);
        txtEmail = (TextView) findViewById(R.id.txt_gmail_email);
        txtName=(TextView)findViewById(R.id.txt_gmail_name);
        prof_pic=(ImageView)findViewById(R.id.google_prof_pic);

        //for twitter Login
        signInButtonTwitter=(TwitterLoginButton) findViewById(R.id.twitter_login_button);
        signInButtonTwitter.setCallback(new Callback<TwitterSession>() {
            @Override
            public void success(Result<TwitterSession> result) {

                textViewStatus.setText("Login Successfull Twitter");
            }

            @Override
            public void failure(TwitterException e) {
                textViewStatus.setText("Login Failed  Twitter!");
            }
        });



        //set on click listener
        signInButtonGoogle.setOnClickListener(this);
        signOutButtonGoogle.setOnClickListener(this);
        //display profile after login
        profile_google.setVisibility(View.GONE);

        //initializing sign in options to fetch user
        GoogleSignInOptions signInOptions = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN).requestEmail().build();
        // ATTENTION: This "addApi(AppIndex.API)"was auto-generated to implement the App Indexing API.
        // See https://g.co/AppIndexing/AndroidStudio for more information.
        googleApiClient = new GoogleApiClient.Builder(this).enableAutoManage(this, this).addApi(Auth.GOOGLE_SIGN_IN_API, signInOptions).build();


        //for accessing user information
        loginButtonFb.setReadPermissions(Arrays.asList("public_profile", "email", "user_birthday", "user_friends"));
        //initialize Callback Manger
        FBcallbackManager= CallbackManager.Factory.create();


        loginButtonFb.registerCallback(FBcallbackManager, new FacebookCallback<LoginResult>() {
            //on success
            @Override
            public void onSuccess(final LoginResult loginResult) {

                //TODO: use the profile class to get information
                //app
                GraphRequest request=GraphRequest.newMeRequest(
                        loginResult.getAccessToken(),
                        new GraphRequest.GraphJSONObjectCallback() {
                            @Override
                            public void onCompleted(JSONObject object, GraphResponse response) {
                                try {
                                    //application code
                                    String name=object.getString("name");
                                    String email=object.getString("email");
                                    Log.e("Name=",""+name);
                                    Toast.makeText(MainActivity.this, "Email"+email, Toast.LENGTH_SHORT).show();
                                }
                                catch (JSONException e)
                                {
                                    Log.e("MYAPP", "unexpected JSON exception", e);
                                }



                            }

                        });
                Bundle parameters = new Bundle();
                parameters.putString("fields", "id,name,email,gender,birthday");
                request.setParameters(parameters);
                request.executeAsync();
                Toast.makeText(MainActivity.this, "Login Successful", Toast.LENGTH_SHORT).show();

                textViewStatus.setText("Login Successful" + loginResult.getAccessToken().getUserId());
                signInButtonGoogle.setVisibility(View.GONE);
                profile_google.setVisibility(View.GONE);

            }

            @Override
            public void onCancel()

            {
                Toast.makeText(MainActivity.this, "Login Cancel", Toast.LENGTH_SHORT).show();
                loginManager.getInstance().logOut();

                textViewStatus.setText("Login Cancel");
            }

            @Override
            public void onError(FacebookException error) {
                textViewStatus.setText("Some Error Occured"+"/n"+"Error"+error.toString());
                signInButtonGoogle.setVisibility(View.GONE);
                signInButtonTwitter.setVisibility(View.GONE);
                Log.e("Error","Facebook Error",error);

                Toast.makeText(MainActivity.this, error.toString(), Toast.LENGTH_SHORT).show();

            }
            //to get username



        });



    }
    @Override
    protected void onActivityResult(int requestCode,int resultCode,Intent data)
    {
        super.onActivityResult(requestCode,resultCode,data);

//TO DO:Error occurs of facebook and Twitter is not working

            if (requestCode == request_code)
            {
                GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
                handleResult(result);
            }
            else if(requestCode==TwitterAuthConfig.DEFAULT_AUTH_REQUEST_CODE)
        {
            // Pass the activity result to the login button.
            signInButtonTwitter.onActivityResult(requestCode, resultCode, data);
        }
        else
            {
                FBcallbackManager.onActivityResult(requestCode,requestCode,data);

            }
        }





//which button is clicked by user
    @Override
    public void onClick(View v) {
        switch (v.getId())
        {
            case R.id.google_sign_in_button:
                signIn();
                break;
            case  R.id.gmail_logout_btn:
                signOut();;
                break;
        }


    }

    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

    }
    private void signIn()
    {
        try {
            //creating intent variable
            Intent intentGoogleSignIn = Auth.GoogleSignInApi.getSignInIntent(googleApiClient);
            startActivityForResult(intentGoogleSignIn, request_code);
        }
        catch (Exception ex)
        {
            Toast.makeText(getApplicationContext(),ex.getMessage(),Toast.LENGTH_SHORT).show();
        }

    }

    private void signOut()
    {
Auth.GoogleSignInApi.signOut(googleApiClient).setResultCallback(new ResultCallback<Status>() {
    @Override
    public void onResult(@NonNull Status status) {
        updateUI(false);
    }
});
    }
    private void handleResult(GoogleSignInResult result)
    {
        //on login success
        if(result.isSuccess())
        {
            //fetching the user information
            GoogleSignInAccount account=result.getSignInAccount();
            String name=account.getDisplayName();
            String email=account.getEmail();
            //String image_url=account.getPhotoUrl().toString();
            //setting the user information
            txtName.setText(name);
            txtEmail.setText(email);
            //Glide.with(this).load(image_url).into(prof_pic);
            updateUI(true);

        }
        else
        {
            updateUI(false);
        }

    }
    private void updateUI(Boolean isLogin)
    {
        if(isLogin)
        {

            profile_google.setVisibility(View.VISIBLE);
            signInButtonGoogle.setVisibility(View.GONE);

        }
        else
        {
            profile_google.setVisibility(View.GONE);
            signInButtonGoogle.setVisibility(View.VISIBLE);


        }

    }

}

Google Login is perfectly working there are 2 errors Google登录正常运行,有2个错误

  1. I got error "Unhandled Exception LoginManager.onResultActivity" and code is directly jump to on error block after the login part and authorize part in facebook login. 我收到错误“未处理的异常LoginManager.onResultActivity”,并且在登录部分并在Facebook登录中授权部分后,代码直接跳转到错误块。

2.I have written code for twitter but none of the click event is fired although I have written in the above code. 2.我已经为twitter编写了代码,但是尽管我已经编写了上面的代码,但是没有触发click事件。

I guess that these two errors is in the below code but not sure 我猜这两个错误在下面的代码中,但不确定

 @Override
    protected void onActivityResult(int requestCode,int resultCode,Intent data)
    {
        super.onActivityResult(requestCode,resultCode,data);

//TO DO:Error occurs of facebook and Twitter is not working

            if (requestCode == request_code)
            {
                GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
                handleResult(result);
            }
            else if(requestCode==TwitterAuthConfig.DEFAULT_AUTH_REQUEST_CODE)
        {
            // Pass the activity result to the login button.
            signInButtonTwitter.onActivityResult(requestCode, resultCode, data);
        }
        else
            {
                FBcallbackManager.onActivityResult(requestCode,requestCode,data);

            }
        }

I got stucked in my project please someone help me Thank You 我被卡在我的项目中,请有人帮我谢谢

Try this way.. 尝试这种方式..

    @Override
    protected void onActivityResult(int requestCode,int resultCode,Intent data)
        {
                    super.onActivityResult(requestCode,resultCode,data);
                    FBcallbackManager.onActivityResult(requestCode,requestCode,data);
                    signInButtonTwitter.onActivityResult(requestCode, resultCode, data);


                        if (requestCode == request_code)
                        {
                            GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
                            handleResult(result);
                        }
        }

I was able to achieve with this implementation. 我能够通过此实现来实现。 Please try this: 请尝试以下方法:

 @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    // Result returned from launching the Intent from
    //   GoogleSignInApi.getSignInIntent(...);
    if (requestCode == RC_SIGN_IN) {
        //Google44
        GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
        if (result.isSuccess()) {
            GoogleSignInAccount acct = result.getSignInAccount();
            // Get account information
            String mFullName = acct.getDisplayName();
            String mEmail = acct.getEmail();
            String googlePlusToken = acct.getIdToken().trim();
            googlePlusDetails = mFullName + ", " + mEmail + ", id: " + acct.getId() + ", photoUrl: " + acct.getPhotoUrl();
            Log.d(TAG, mFullName + "," + mEmail + "," + acct.toString());
            Log.d(TAG, googlePlusDetails);
            /**
             * google Token
             */

        } else {
            Log.e(TAG, "Result: " + result.getStatus());
            Log.e(TAG, "Result: " + result.getStatus().getStatusMessage());
            Log.e(TAG, "Google plus sign-in failed");
            showToast("Google plus sign-in failed");
        }
    } else if (requestCode == TwitterAuthConfig.DEFAULT_AUTH_REQUEST_CODE) {
        // TWITTER
        loginButton.onActivityResult(requestCode, resultCode, data);

    } else {
        //FACEBOOK
        callbackManager.onActivityResult(requestCode, resultCode, data);
    }


}

I have Solved the problem There are some changes I made 我已解决问题我做了一些更改

//Initialized Twitter Sdk fabric //初始化的Twitter Sdk结构

TwitterAuthConfig autoConfig=new TwitterAuthConfig(TwKey,TwSecreteKey);
        Fabric.with(this,new TwitterCore(autoConfig));

//Here was mistake I made FBcallbackManager.onActivityResult(requestCode, requestCode, data); //这是我做的FBcallbackManager.onActivityResult(requestCode,requestCode,data);的错误;

//correct is //正确的是

FBcallbackManager.onActivityResult(requestCode, resultCode, data);
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.facebook.CallbackManager;
import com.facebook.FacebookCallback;
import com.facebook.FacebookException;
import com.facebook.FacebookSdk;
import com.facebook.GraphRequest;
import com.facebook.GraphResponse;
import com.facebook.login.LoginResult;
import com.facebook.login.widget.LoginButton;
import com.facebook.login.widget.ProfilePictureView;

import org.json.JSONException;
import org.json.JSONObject;

import java.util.Arrays;

public class MainActivity extends AppCompatActivity {

    CallbackManager callbackManager;
    LoginButton loginButton;
    ProfilePictureView profilePictureView;
    RelativeLayout relativeLayout;
    TextView tv_email,tv_name,tv_gender,tv_dob;

    @Override
    protected void onCreate( Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        FacebookSdk.sdkInitialize(getApplicationContext());
        setContentView(R.layout.activity_main);

         tv_dob=(TextView)findViewById(R.id.tv_dob);
        tv_email=(TextView)findViewById(R.id.tv_email);//1
        tv_name=(TextView)findViewById(R.id.tv_name);//2
        tv_gender=(TextView)findViewById(R.id.tv_gender);//3
        loginButton=(LoginButton)findViewById(R.id.loginButton);//4
        relativeLayout=(RelativeLayout)findViewById(R.id.relative_layout);//5
        profilePictureView=(ProfilePictureView)findViewById(R.id.ppv_dp);//6

        loginButton.setReadPermissions(Arrays.asList("public_profile, email, user_birthday"));

        callbackManager = CallbackManager.Factory.create();

        loginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
            @Override
            public void onSuccess(LoginResult loginResult) {
                GraphRequest graphRequest=GraphRequest.newMeRequest(
                        loginResult.getAccessToken(),
                        new GraphRequest.GraphJSONObjectCallback(){

                    @Override
                    public void onCompleted(JSONObject object, GraphResponse response) {
                        Log.e("RESPONSE",response.toString());
                        setProfileToView(object);
                    }
                });

                Bundle bundle=new Bundle();
                bundle.putString("fields", "id,name,email,gender, birthday");
                graphRequest.setParameters(bundle);
                graphRequest.executeAsync();

                Log.e("LOGIN_RESULT",loginResult.toString());
            }

            @Override
            public void onCancel() {

            }

            @Override
            public void onError(FacebookException error) {
                Log.e("ERROR_LOGIN_TO_Fb",error.toString());
            }
        });


    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode,resultCode,data);
        callbackManager.onActivityResult(requestCode, resultCode, data);
    }
    private void setProfileToView(JSONObject jsonObject) {
        try {
            tv_email.setText(jsonObject.getString("email"));
            tv_gender.setText(jsonObject.getString("gender"));
            tv_name.setText(jsonObject.getString("name"));
            tv_dob.setText(jsonObject.getString("birthday"));
            Log.e("dob",tv_dob.toString());

            profilePictureView.setPresetSize(ProfilePictureView.NORMAL);
            profilePictureView.setProfileId(jsonObject.getString("id"));
            relativeLayout.setVisibility(View.VISIBLE);
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
}

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM