PersianBlue PersianBlue - 4 months ago 54
Android Question

Storing Google login details using shared preference in android studio

I have implemented Google login in my app. I am trying to save the user login details using shared preference but i am getting the following errors:

1) java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=0, result=-1, data=Intent { (has extras) }} to activity

2) java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.String.toString()' on a null object reference

SocialLogin.java

package com.studypal.khadija.studypal;

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
import com.facebook.CallbackManager;
import com.facebook.FacebookCallback;
import com.facebook.FacebookException;
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 java.util.Arrays;

public class SocialLogin extends AppCompatActivity implements GoogleApiClient.OnConnectionFailedListener, View.OnClickListener {
private static final String TAG = SocialLogin.class.getSimpleName();
private GoogleApiClient mGoogleApiClient;
private SignInButton mSignInButton;
private static final int RC_SIGN_IN = 0;
private CallbackManager mCallbackManager;
private LoginButton mFbLoginButton;
private LoginManager mLoginManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_social_login);

// [START configure_signin]
// Configure sign-in to request the user's ID, email address, and basic profile. ID and basic profile are included in DEFAULT_SIGN_IN.
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.build();
// [END configure_signin]

//[START build_client]
// Build a GoogleApiClient with access to the Google Sign-In API and the options specified by gso.
mGoogleApiClient = new GoogleApiClient.Builder(this)
.enableAutoManage(this, this)
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
.build();
// [END build_client]

// [START customize_button]
// Customize sign-in button. The sign-in button can be displayed in
// multiple sizes and color schemes. It can also be contextually
// rendered based on the requested scopes. For example. a red button may
// be displayed when Google+ scopes are requested, but a white button
// may be displayed when only basic profile is requested.
mSignInButton = (SignInButton) findViewById(R.id.sign_in_button);
mSignInButton.setSize(SignInButton.SIZE_STANDARD);
mSignInButton.setScopes(gso.getScopeArray());
mSignInButton.setOnClickListener(this); //Register button's OnClickListener to sign in the user when clicked
// [END customize_button]

//Facebook Login
mFbLoginButton = (LoginButton) findViewById(R.id.login_button);
mLoginManager = LoginManager.getInstance();
mCallbackManager = CallbackManager.Factory.create();
mFbLoginButton.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
mLoginManager.logInWithReadPermissions(SocialLogin.this, Arrays.asList("public_profile", "email"));
mLoginManager.registerCallback(mCallbackManager,
new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
Toast.makeText(SocialLogin.this, "Fb Login Success", Toast.LENGTH_SHORT).show();
redirectToHome();
}

@Override
public void onCancel() {
Toast.makeText(SocialLogin.this, "Fb Login Cancel", Toast.LENGTH_SHORT).show();
}

@Override
public void onError(FacebookException exception) {
Toast.makeText(SocialLogin.this, "Fb Login Error", Toast.LENGTH_SHORT).show();

}
});
}
});
}

// [START onActivityResult]
@Override
public 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) {
GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
handleSignInResult(result);
}

mCallbackManager.onActivityResult(requestCode, resultCode, data);
}
// [END onActivityResult]

/**
* Handle Sign In Result
* @param result
*/

// [START handleSignInResult]
private void handleSignInResult(GoogleSignInResult result) {
Log.d(TAG, "handleSignInResult:" + result.isSuccess());
if (result.isSuccess()) {
// Signed in successfully, show authenticated UI.
GoogleSignInAccount acct = result.getSignInAccount();

String personName = acct.getDisplayName();
String personEmail = acct.getEmail();
String personId = acct.getId();
/* Uri personPhoto = acct.getPhotoUrl();
String idToken = acct.getIdToken();
mIdTokenTextView.setText("ID Token: " + idToken);
*/
SharedPreferences sharedPref = getSharedPreferences("userInfo", Context.MODE_PRIVATE);
SharedPreferences.Editor editor =sharedPref.edit();
editor.putString("username",personName.toString());
editor.putString("email", personEmail.toString());
editor.putString("id",personId.toString());
editor.apply();


Toast.makeText(this, personName+""+personEmail, Toast.LENGTH_SHORT).show();
Toast.makeText(this, "Sign In", Toast.LENGTH_SHORT).show();
redirectToHome();
} else {
// Signed out, show unauthenticated UI.
Toast.makeText(this, "Sign Out", Toast.LENGTH_SHORT).show();
//mIdTokenTextView.setText("ID Token: null");
}
}
// [END handleSignInResult]

//[START signIn]
private void signIn() {
//Starting the intent prompts the user to select a Google account to sign in with.
Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
startActivityForResult(signInIntent, RC_SIGN_IN);
}
//[END signIn]

@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onPause() {
super.onPause();
}

//Handle sign-in button taps by creating a sign-in intent with the getSignInIntent method,
//and starting the intent with startActivityForResult.
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.sign_in_button:
signIn();
break;
}
}


@Override
public void onConnectionFailed(ConnectionResult connectionResult) {

}

/**
*
*/
private void redirectToHome() {
startActivity(new Intent(SocialLogin.this, NavBaseActivity.class));
finish();
}
}


Please can someone help me with my code

Answer

First check that personName, personEmail and personId values are not null, because sometimes google api doesn't give any value(means it returns null value).

Then apply personName.toString method for change into String.(BTW Google already return all values in String then why you are changing all values in to String).

Here is the code for One time SignIn(Until user doesn't logout) ---

First make a SharedPref class like...

public class SharedPrefApp {

SharedPreferences sharepreferences;

 public static SharedPrefApp instance = null;

public static SharedPrefApp getInstance()
{

if (instance == null) {
       synchronized (SharedPrefApp.class) {
           instance = new SharedPrefApp();
       }
   }
   return instance;
  }
public void saveISLogged_IN(Context context, Boolean isLoggedin) {
    sharepreferences = PreferenceManager
            .getDefaultSharedPreferences(context);
    SharedPreferences.Editor editor = sharepreferences.edit();
    editor.putBoolean("IS_LOGIN", isLoggedin);
    editor.commit();
}

public boolean getISLogged_IN(Context context) {
    sharepreferences = PreferenceManager
            .getDefaultSharedPreferences(context);
    return sharepreferences.getBoolean("IS_LOGIN", false);
}

}

On successful login add this in login class ---

 SharedPrefApp sharedPref;
 sharedPref = SharedPrefApp.getInstance();

  sharedPref.saveISLogged_IN(this, true);//add this on user sucessful login

Now check the user is already login or not on app's splash page or first page like -----

SharedPrefApp sharedPref;
 sharedPref = SharedPrefApp.getInstance();

////

if (sharedPref.getISLogged_IN(SplashActivity.this)) {
               Intent NextScreen = new Intent(getApplicationContext(),
                        LandingActivity.class);
                startActivity(NextScreen);
                finish();
            }
            else{
                intent = new Intent(SplashActivity.this, LoginActivity.class);
                intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(intent);
                finish();

            }

One more thing Don't forget change the value for this when user logout ----

sharedPref.saveISLogged_IN(LandingActivity.this, false);

Hope this will help you...