2017-05-08 65 views
0

Okey。我在我的android應用中集成了谷歌登錄功能。 這是我的登錄活動從谷歌保存用戶憑據登錄Android? Okey。

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) { 

} 

}

一次,登錄成功後,我打開檔案活動,並得到用戶的圖像和名稱 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) { 

} 

我的下一個問題是,如果用戶已經登錄到活動,我如何實現自動登錄功能?我不希望每次打開應用時點擊登錄按鈕,而是直接轉到配置文件活動。

+0

應該因爲你已經使用GoogleApiClient.Builder工作共享偏好(這) .enableAutoManage(這一點,這一點);它自動管理會話。 – Avi

回答

2

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

注:清除在用戶註銷

+0

讓我看看它的工作 – Lwq

+0

@Lqq是否正常工作..? – Keerthivasan

+0

試圖去上班... – Lwq

0

最簡單的方法是使用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 
} 

如果用戶想註銷,只需撤銷訪問權限google si gn在包括將首選項「hasLogin」設置爲「false」

+0

謝謝,我不知道我應該把這段代碼放在哪裏。 – Lwq