[英]Saving user credentials from google sign in with Android?
好。 我在我的Android應用程序中集成了Google登錄功能。 這是我的登錄活動
public class LoginActivity extends AppCompatActivity implements GoogleApiClient.OnConnectionFailedListener {
//button
private SignInButton signInButton;
//options
private GoogleSignInOptions gso;
//client api
private GoogleApiClient mGoogleApiClient;
private static final int LCD = 4;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_google_login);
gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.build();
mGoogleApiClient = new GoogleApiClient.Builder(this)
.enableAutoManage(this,this)
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
.build();
signInButton = (SignInButton) findViewById(R.id.sign_in_button);
signInButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
startActivityForResult(intent,LCD);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == LCD){
GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
handleSignInResult(result);
}
}
private void handleSignInResult(GoogleSignInResult result) {
//check if the operation is successful
if(result.isSuccess()){
goMainScreen();
}else {
Toast.makeText(this,"Something went wrong",Toast.LENGTH_SHORT).show();
}
}
private void goMainScreen() {
Intent secondActivity = new Intent(this, ProfileActivity.class);
secondActivity.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK
| Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(secondActivity);
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
}
}
登錄成功后,我打開Profile活動,並獲取用戶圖像和名稱ProfileActivity
public class ProfileActivity extends AppCompatActivity implements GoogleApiClient.OnConnectionFailedListener {
private ImageView photo;
private TextView name;
private GoogleApiClient googleApiClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_profile);
photo = (ImageView) findViewById(R.id.profileImage);
name = (TextView) findViewById(R.id.theName);
GoogleSignInOptions gsp = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.build();
googleApiClient = new GoogleApiClient.Builder(this)
.enableAutoManage(this,this)
.addApi(Auth.GOOGLE_SIGN_IN_API, gsp)
.build();
}
@Override
protected void onStart() {
super.onStart();
OptionalPendingResult<GoogleSignInResult> optionalPendingResult = Auth.GoogleSignInApi.silentSignIn(googleApiClient);
if(optionalPendingResult.isDone()){
GoogleSignInResult sig = optionalPendingResult.get();
handleSigninResult(sig);
}else {
optionalPendingResult.setResultCallback(new ResultCallback<GoogleSignInResult>() {
@Override
public void onResult(@NonNull GoogleSignInResult googleSignInResult) {
handleSigninResult(googleSignInResult);
}
});
}
}
private void handleSigninResult(GoogleSignInResult sig) {
if(sig.isSuccess()){
GoogleSignInAccount acc = sig.getSignInAccount();
//accessing the data
name.setText(acc.getDisplayName());
//image with glide
Glide.with(this).load(acc.getPhotoUrl()).into(photo);
}else {
//in case is not successful
//send the user to the Login Screen
goLoginInScree();
}
}
private void goLoginInScree() {
Intent goUser = new Intent(this, LoginActivity.class);
goUser.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(goUser);
}
@Override
public void onConnectionFailed( ConnectionResult connectionResult) {
}
我的下一個問題是,如果用戶已經登錄到活動中,該如何實現自動登錄功能? 我不希望每次打開應用程序時都單擊“登錄”按鈕,而是直接轉到個人資料活動。
在Google身份驗證中成功登錄后,將結果存儲在共享首選項中。
private void handleSigninResult(GoogleSignInResult sig) {
if(sig.isSuccess()){
GoogleSignInAccount acc = sig.getSignInAccount();
//accessing the data
name.setText(acc.getDisplayName());
SharedPreferences prefs = getSharedPreferences("shared_pref_name", MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putString("email", acc.getEmail());
editor.putInt("name", acc.getDisplayName());
editor.putBoolean("hasLogin",true);
editor.apply();
//image with glide
Glide.with(this).load(acc.getPhotoUrl()).into(photo);
}else {
//in case is not successful
//send the user to the Login Screen
goLoginInScree();
}
}
注意:用戶注銷時清除共享首選項
最簡單的方法是使用SharedPreferences
SharedPreferences prefs = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE);
使用Google+成功登錄后,將憑據詳細信息保存在Sharedpreferences中
SharedPreferences.Editor editor = prefs.edit();
editor.putString("email", acc.getEmail());
editor.putInt("name", acc.getDisplayName());
editor.putBoolean("hasLogin",true); // set the prefs true after success login
editor.apply();
然后,您可以檢查用戶是否是首次登錄
if(prefs.getBoolean("hasLogin")){
//no need to sigin again.. proceeed to your activity
}
else{
//need to sign in
}
如果用戶要注銷,只需撤銷Access google登錄即可,包括將首選項“ hasLogin”設置為“ false”
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.