Search code examples
androidandroid-fragmentsfacebook-sdk-4.0google-plus-signin

Error with Google plus and Facebook Sign in from fragment from the app


Actually I am trying to sign in through Facebook and google plus from a fragment(LoginFragment) attached to an activity(LoginActivity) and after clicking sign in i will move to another activity(HomeActivity).Thing is facebook sign in is working just fine but in google plus sign in I am getting some exception like:-

         Caused by: java.lang.NullPointerException
                at archerpenny.valmoref.LoginFragment.onActivityResult(LoginFragment.java:264)
                at archerpenny.valmoref.LogInActivity.onActivityResult(LogInActivity.java:32)
                at android.app.Activity.dispatchActivityResult(Activity.java:5372)
                at android.app.ActivityThread.deliverResults(ActivityThread.java:3215)
                at android.app.ActivityThread.handleSendResult(ActivityThread.java:3262)
                at android.app.ActivityThread.access$1200(ActivityThread.java:140)
                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1286)
                at android.os.Handler.dispatchMessage(Handler.java:99)
                at android.os.Looper.loop(Looper.java:177)
                at android.app.ActivityThread.main(ActivityThread.java:4944)
                at java.lang.reflect.Method.invokeNative(Native Method)
                at java.lang.reflect.Method.invoke(Method.java:511)
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038)
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)
                at dalvik.system.NativeStart.main(Native Method)

I think there is some problem with my OnActivityResult(),but I dont know how to solve it.

Here is my LoginFragment.java--


public class LoginFragment extends Fragment implements View.OnClickListener,GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {
    TextView Fpassword, Signup;
    EditText email, password;
    ImageView Signin, fb_button, gplus_button;
    LogInActivity myContext;
    static String personName;
    private boolean mIntentInProgress;
    FragmentManager fragmentManager;
    private CallbackManager callbackmanager;
    //for G+
    private static final int PROFILE_PIC_SIZE = 30;
    private GoogleApiClient mGoogleApiClient;
    private ConnectionResult mConnectionResult;
    private boolean mSignInClicked;
    static final int RC_SIGN_IN = 0;
    /* Is there a ConnectionResult resolution in progress? */
    private boolean mIsResolving = false;

    /* Should we automatically resolve ConnectionResults when possible? */
    private boolean mShouldResolve = false;

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

    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        myContext = (LogInActivity) activity;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_login, container, false);
        Fpassword = (TextView) view.findViewById(R.id.ForgotPassword);
        Signup = (TextView) view.findViewById(R.id.SignUp);
        email = (EditText) view.findViewById(R.id.Email_Val);
        password = (EditText) view.findViewById(R.id.PasswordVal);
        Signin = (ImageView) view.findViewById(R.id.signin);
        fb_button = (ImageView) view.findViewById(R.id.FB_btn);

        gplus_button = (ImageView) view.findViewById(R.id.Gplus_btn);
        FacebookSdk.sdkInitialize(getActivity().getApplicationContext());
        Fpassword.setPaintFlags(Fpassword.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
        Signup.setPaintFlags(Signup.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
        email.setHintTextColor(Color.parseColor("#727272"));
        password.setHintTextColor(Color.parseColor("#727272"));
        Fpassword.setOnClickListener(this);
        Signup.setOnClickListener(this);
        Signin.setOnClickListener(this);
        fb_button.setOnClickListener(this);
        gplus_button.setOnClickListener(this);
        return view;

    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.ForgotPassword) {
            Fragment forgotpassword = new ForgotPasswordFragment();
            myContext.getSupportFragmentManager().beginTransaction().add(R.id.container_login, forgotpassword).addToBackStack("fragBack1").commit();

        } else if (v.getId() == R.id.SignUp) {
            Fragment signup = new SignUpFragment();
            myContext.getSupportFragmentManager().beginTransaction().add(R.id.container_login, signup).addToBackStack("fragBack1").commit();

        } else if (v.getId() == R.id.signin) {

            Intent intent_signin = new Intent(myContext, HomeActivity.class);
            startActivity(intent_signin);


        } else if (v.getId() == R.id.FB_btn) {

            //Intent intent_signin = new Intent(myContext, HomeActivity.class);
           // startActivity(intent_signin);
            Fblogin();

        } else if (v.getId() == R.id.Gplus_btn)
        {
            mGoogleApiClient = new GoogleApiClient.Builder(getActivity()).addConnectionCallbacks(this).addOnConnectionFailedListener(this).addApi(Plus.API).addScope(new Scope(Scopes.PROFILE)).build();

            //Intent intent_signin = new Intent(myContext, HomeActivity.class);
            // startActivity(intent_signin);
            onSignInClicked();


        }

    }

    private void onSignInClicked() {
        // User clicked the sign-in button, so begin the sign-in process and automatically
        // attempt to resolve any errors that occur.

        mShouldResolve = true;
        mGoogleApiClient.connect();


    }

    @Override
    public void onStart() {
        super.onStart();

    }

    @Override
    public void onStop() {
        super.onStop();

    }
    private void Fblogin()
    {
        callbackmanager = CallbackManager.Factory.create();

        // Set permissions
        LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("public_profile, email, user_birthday,user_friends"));

        LoginManager.getInstance().registerCallback(callbackmanager, new FacebookCallback<LoginResult>() {
            @Override
            public void onSuccess(LoginResult loginResult) {
                // App code
                GraphRequest request = GraphRequest.newMeRequest(
                        loginResult.getAccessToken(),
                        new GraphRequest.GraphJSONObjectCallback() {
                            @Override
                            public void onCompleted(JSONObject object, GraphResponse response) {
                                // Application code
                                Log.d("LoginActivity", response.toString());
                                Log.d("LoginActivity", object.toString());
                                String jsonresult = String.valueOf(object);
                                System.out.println("JSON Result" + jsonresult);
                                String str_firstname=null,str_id=null;


                                try {
                                    str_firstname=object.getString("name");
                                    str_id = object.getString("id");
                                    String str_email = object.getString("email");
                                    Intent login = new Intent(myContext, HomeActivity.class);
                                    login.putExtra("name", str_firstname);
                                    login.putExtra("URL", "https://graph.facebook.com/" + str_id + "/picture?width="+PROFILE_PIC_SIZE+"&height="+PROFILE_PIC_SIZE);
                                    startActivity(login);


                                } catch (JSONException e) {
                                    e.printStackTrace();
                                    Log.d("animesh123","aa");
                                }



                            }
                        });
                Bundle parameters = new Bundle();
                parameters.putString("fields", "id,name,email,gender, birthday");
                request.setParameters(parameters);
                request.executeAsync();


            }

            @Override
            public void onCancel() {
                // App code
                Log.v("LoginActivity", "cancel");
            }

            @Override
            public void onError(FacebookException exception) {
                // App code
                Log.v("LoginActivity", exception.getCause().toString());
            }
        });
    }



    @Override
    public void onConnected(Bundle bundle) {
        mSignInClicked = false;
        Toast.makeText(myContext, "User is connected!", Toast.LENGTH_LONG).show();
        if (Plus.PeopleApi.getCurrentPerson(mGoogleApiClient) != null) {
            Person currentPerson = Plus.PeopleApi
                    .getCurrentPerson(mGoogleApiClient);
            personName = currentPerson.getDisplayName();
            String birthDate=currentPerson.getAboutMe();
            String personPhotoUrl = currentPerson.getImage().getUrl();
            String personGooglePlusProfile = currentPerson.getUrl();
            String email = Plus.AccountApi.getAccountName(mGoogleApiClient);

            Log.d("sachin", "Name: " + personName + " " + currentPerson.getName() + ", plusProfile: "
                    + personGooglePlusProfile + ", email: " + email
                    + ",BirthDay:" + birthDate + ", Image: " + personPhotoUrl);
            personPhotoUrl = personPhotoUrl.substring(0,
                    personPhotoUrl.length() - 2)
                    + PROFILE_PIC_SIZE;

            Intent login=new Intent(myContext,HomeActivity.class);
            login.putExtra("name",personName);
            login.putExtra("URL", personPhotoUrl);
            startActivity(login);

        }


    }

    @Override
    public void onConnectionSuspended(int i) {
        mGoogleApiClient.connect();
    }


    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        callbackmanager.onActivityResult(requestCode,resultCode,data);
        Log.d("ani", "onActivityResult:" + requestCode + ":" + resultCode + ":" + data);

        if (requestCode == RC_SIGN_IN) {
            // If the error resolution was not successful we should not resolve further.
            if (resultCode != getActivity().RESULT_OK) {
                mShouldResolve = false;
            }

            mIsResolving = false;
            mGoogleApiClient.connect();
        }
    }

    @Override
    public void onConnectionFailed(ConnectionResult connectionResult)
    {

        // Could not connect to Google Play Services.  The user needs to select an account,
        // grant permissions or resolve an error in order to sign in. Refer to the javadoc for
        // ConnectionResult to see possible error codes.
        Log.d("ani", "onConnectionFailed:" + connectionResult);

        if (!mIsResolving && mShouldResolve) {
            if (connectionResult.hasResolution()) {
                try {
                    connectionResult.startResolutionForResult(getActivity(), RC_SIGN_IN);
                    mIsResolving = true;
                } catch (IntentSender.SendIntentException e) {
                    Log.e("ani", "Could not resolve ConnectionResult.", e);
                    mIsResolving = false;
                    mGoogleApiClient.connect();
                }
            }
        }

    }
}





Here is My LoginActivity:--

    public class LogInActivity extends AppCompatActivity
{
    FragmentManager fragmentManager;
    Fragment blankFragment=null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_log_in);
        blankFragment=new LoginFragment();
        fragmentManager=getSupportFragmentManager();
        fragmentManager.beginTransaction().add(R.id.container_login, blankFragment).addToBackStack("fragBack1").commit();

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == LoginFragment.RC_SIGN_IN) {
            LoginFragment fragment = (LoginFragment) getSupportFragmentManager()
                    .findFragmentById(R.id.container_login);
            fragment.onActivityResult(requestCode, resultCode, data);
        } else {
            super.onActivityResult(requestCode, resultCode, data);
        }
    }
}

Solution

  • I think error on this -

       callbackmanager.onActivityResult(requestCode,resultCode,data);
    

    your callbackmanager is null,you have initialized it on Fblogin() method and it is for facebook login so its giving exception you can give the condition like -

    if(callbackmanager!=null){
    callbackmanager.onActivityResult(requestCode,resultCode,data);
    }