簡體   English   中英

保存Google的用戶憑據並使用Android登錄嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM