使用Android Studio中的共享首选项存储Google登录详细信息 [英] Storing Google login details using shared preference in android studio

查看:99
本文介绍了使用Android Studio中的共享首选项存储Google登录详细信息的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经在我的应用中实现了Google登录.我正在尝试使用共享首选项保存用户登录详细信息,但出现以下错误:

1)java.lang.RuntimeException:无法将结果ResultInfo {who = null,request = 0,result = -1,data = Intent {(有附加项)}}传递给活动

2)java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'java.lang.String java.lang.String.toString()'

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

请有人帮我提供我的代码

解决方案

首先检查personName,personEmail和personId值是否不为空,因为有时google api不提供任何值(意味着它返回空值).

然后应用personName.toString方法将其更改为String.(顺便说一句,Google已经返回了String中的所有值,然后为什么要将其中的所有值都更改为String).

这是一次登录的代码(直到用户未注销)---

首先创建一个SharedPref类,例如...

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

}

成功登录后,将其添加到登录类---

 SharedPrefApp sharedPref;
 sharedPref = SharedPrefApp.getInstance();

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

现在检查用户是否已经登录,或者是否不在应用程序的初始页面或类似-----

的首页上

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

            }

还有一件事,请不要忘记在用户注销时更改其值----

sharedPref.saveISLogged_IN(LandingActivity.this, false);

希望这对您有帮助...

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

解决方案

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...

这篇关于使用Android Studio中的共享首选项存储Google登录详细信息的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆