在 Android 应用程序中注销 GoogleApiClient
Logout for GoogleApiClient in Android application
使用这样的代码可以link我的应用程序并使用帐户。
if (mGoogleApiClient == null) {
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addApi(Plus.API)
.addApi(Drive.API)
.addScope(Drive.SCOPE_FILE)
.addScope(Drive.SCOPE_APPFOLDER)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
}
mGoogleApiClient.connect();
但是一旦激活或切换到新帐户,有什么方法可以从这个帐户'logout'?
编辑
此方法已弃用
像这样使用
if (mGoogleApiClient != null)
{
if (mGoogleApiClient.isConnected())
{
Plus.AccountApi.clearDefaultAccount(mGoogleApiClient);
mGoogleApiClient.disconnect();
}
}
我找到了这个 up-to-date 解决方案:
if (mGoogleApiClient != null && mGoogleApiClient.isConnected()) {
mGoogleApiClient.clearDefaultAccountAndReconnect().setResultCallback(new ResultCallback<Status>() {
@Override
public void onResult(Status status) {
mGoogleApiClient.disconnect();
}
});
}
的用法
Plus.AccountApi.clearDefaultAccount(mGoogleApiClient);
已弃用
https://developers.google.com/android/reference/com/google/android/gms/plus/Account
clearDefaultAccount()
不起作用。要退出并清除所选帐户,请使用 Auth.GoogleSignInApi.signOut()
,如下所示:
private GoogleApiClient mGoogleApiClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Build a GoogleApiClient with access to the Google Sign-In API and the
// options specified by gso.
mGoogleApiClient = new GoogleApiClient.Builder(getApplicationContext()) //Use app context to prevent leaks using activity
//.enableAutoManage(this /* FragmentActivity */, connectionFailedListener)
.addApi(Auth.GOOGLE_SIGN_IN_API)
.build();
}
@Override
protected void onStart() {
super.onStart();
mGoogleApiClient.connect();
}
@Override
protected void onStop() {
super.onStop();
if (mGoogleApiClient.isConnected()) {
mGoogleApiClient.disconnect();
}
}
private void signOut() {
if (mGoogleApiClient.isConnected()) {
Auth.GoogleSignInApi.signOut(mGoogleApiClient);
mGoogleApiClient.disconnect();
mGoogleApiClient.connect();
}
}
我修改了 android 文档中的代码片段。这是一个完整的登录和退出代码片段;显示用户名、电子邮件和个人资料图像。此代码片段已经过测试。原始文档可以在这里找到:https://developers.google.com/identity/sign-in/android/sign-in
有关依赖项,请参阅此文档。
public class MainActivity extends AppCompatActivity implements View.OnClickListener, GoogleApiClient.OnConnectionFailedListener {
private ImageView imgUserAvatar;
private TextView lblName;
private TextView lblEmailID;
private SignInButton btnSignIn;
private Button btnSignOut;
private GoogleSignInOptions gso;
private GoogleSignInClient googleSignInClient;
private GoogleSignInAccount account;
private GoogleApiClient googleApiClient;
private static final int RC_SIGN_IN = 58;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
imgUserAvatar = findViewById(R.id.imgUserAvatar);
lblName = findViewById(R.id.lblName);
lblEmailID = findViewById(R.id.lblEmailID);
btnSignIn = findViewById(R.id.btnSignIn);
btnSignOut = findViewById(R.id.btnSignOut);
btnSignIn.setOnClickListener(this);
btnSignOut.setOnClickListener(this);
btnSignIn.setSize(SignInButton.SIZE_STANDARD);
imgUserAvatar.setVisibility(View.GONE);
lblName.setVisibility(View.GONE);
lblEmailID.setVisibility(View.GONE);
btnSignOut.setVisibility(View.GONE);
btnSignIn.setVisibility(View.VISIBLE);
gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
//.requestIdToken(RT_GOOGLE_SIGN_ID_ID)
.requestEmail()
.build();
googleSignInClient = GoogleSignIn.getClient(this, gso);
googleApiClient = new GoogleApiClient.Builder(this).enableAutoManage(this, this).addApi(Auth.GOOGLE_SIGN_IN_API, gso).build();
account = GoogleSignIn.getLastSignedInAccount(this);
updateUI(account);
}
@Override
public void onClick(View view) {
switch(view.getId()) {
case R.id.btnSignIn:
signIn();
break;
case R.id.btnSignOut:
signOut();
break;
}
}
private void signIn() {
Intent signInIntent = googleSignInClient.getSignInIntent();
startActivityForResult(signInIntent, RC_SIGN_IN);
}
private void signOut() {
Auth.GoogleSignInApi.signOut(googleApiClient).setResultCallback(new ResultCallback<Status>() {
@Override
public void onResult(@NonNull Status status) {
imgUserAvatar.setVisibility(View.GONE);
lblName.setVisibility(View.GONE);
lblEmailID.setVisibility(View.GONE);
btnSignOut.setVisibility(View.GONE);
btnSignIn.setVisibility(View.VISIBLE);
}
});
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//Result returned from launching the Intent from GoogleSignInClient.getSignInIntent(...);
if(requestCode == RC_SIGN_IN) {
//The Task returned from this call is always completed, no need to attach
//a listener.
Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
handleSignInResult(task);
}
}
private void handleSignInResult(Task<GoogleSignInAccount> completedTask) {
try {
GoogleSignInAccount account = completedTask.getResult(ApiException.class);
//Signed in successfully, show authenticated UI.
updateUI(account);
}
catch(ApiException e) {
updateUI(null);
}
}
private void updateUI(final GoogleSignInAccount account) {
if(account != null) {
lblName.setText(account.getDisplayName());
lblEmailID.setText(account.getEmail());
lblName.setVisibility(View.VISIBLE);
lblEmailID.setVisibility(View.VISIBLE);
btnSignOut.setVisibility(View.VISIBLE);
btnSignIn.setVisibility(View.GONE);
final Bitmap[] bitmap = new Bitmap[1];
final Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message message) {
imgUserAvatar.setImageBitmap(bitmap[0]);
imgUserAvatar.setVisibility(View.VISIBLE);
return true;
}
});
new Thread(new Runnable() {
@Override
public void run() {
InputStream in;
try {
in = new java.net.URL(account.getPhotoUrl().toString()).openStream();
bitmap[0] = BitmapFactory.decodeStream(in);
handler.sendEmptyMessage(0);
}
catch(IOException e) {
e.printStackTrace();
}
}
}).start();
}
else if(account == null) {
imgUserAvatar.setVisibility(View.GONE);
lblName.setVisibility(View.GONE);
lblEmailID.setVisibility(View.GONE);
btnSignOut.setVisibility(View.GONE);
btnSignIn.setVisibility(View.VISIBLE);
}//End if(account != null)
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
//ToDo in context only used for signout.
}
}
您可能还会发现此视频很有用:https://www.youtube.com/watch?v=2PIaGpJMCNs&t=
使用这样的代码可以link我的应用程序并使用帐户。
if (mGoogleApiClient == null) {
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addApi(Plus.API)
.addApi(Drive.API)
.addScope(Drive.SCOPE_FILE)
.addScope(Drive.SCOPE_APPFOLDER)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
}
mGoogleApiClient.connect();
但是一旦激活或切换到新帐户,有什么方法可以从这个帐户'logout'?
编辑
此方法已弃用
像这样使用
if (mGoogleApiClient != null)
{
if (mGoogleApiClient.isConnected())
{
Plus.AccountApi.clearDefaultAccount(mGoogleApiClient);
mGoogleApiClient.disconnect();
}
}
我找到了这个 up-to-date 解决方案:
if (mGoogleApiClient != null && mGoogleApiClient.isConnected()) {
mGoogleApiClient.clearDefaultAccountAndReconnect().setResultCallback(new ResultCallback<Status>() {
@Override
public void onResult(Status status) {
mGoogleApiClient.disconnect();
}
});
}
的用法
Plus.AccountApi.clearDefaultAccount(mGoogleApiClient);
已弃用
https://developers.google.com/android/reference/com/google/android/gms/plus/Account
clearDefaultAccount()
不起作用。要退出并清除所选帐户,请使用 Auth.GoogleSignInApi.signOut()
,如下所示:
private GoogleApiClient mGoogleApiClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Build a GoogleApiClient with access to the Google Sign-In API and the
// options specified by gso.
mGoogleApiClient = new GoogleApiClient.Builder(getApplicationContext()) //Use app context to prevent leaks using activity
//.enableAutoManage(this /* FragmentActivity */, connectionFailedListener)
.addApi(Auth.GOOGLE_SIGN_IN_API)
.build();
}
@Override
protected void onStart() {
super.onStart();
mGoogleApiClient.connect();
}
@Override
protected void onStop() {
super.onStop();
if (mGoogleApiClient.isConnected()) {
mGoogleApiClient.disconnect();
}
}
private void signOut() {
if (mGoogleApiClient.isConnected()) {
Auth.GoogleSignInApi.signOut(mGoogleApiClient);
mGoogleApiClient.disconnect();
mGoogleApiClient.connect();
}
}
我修改了 android 文档中的代码片段。这是一个完整的登录和退出代码片段;显示用户名、电子邮件和个人资料图像。此代码片段已经过测试。原始文档可以在这里找到:https://developers.google.com/identity/sign-in/android/sign-in 有关依赖项,请参阅此文档。
public class MainActivity extends AppCompatActivity implements View.OnClickListener, GoogleApiClient.OnConnectionFailedListener {
private ImageView imgUserAvatar;
private TextView lblName;
private TextView lblEmailID;
private SignInButton btnSignIn;
private Button btnSignOut;
private GoogleSignInOptions gso;
private GoogleSignInClient googleSignInClient;
private GoogleSignInAccount account;
private GoogleApiClient googleApiClient;
private static final int RC_SIGN_IN = 58;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
imgUserAvatar = findViewById(R.id.imgUserAvatar);
lblName = findViewById(R.id.lblName);
lblEmailID = findViewById(R.id.lblEmailID);
btnSignIn = findViewById(R.id.btnSignIn);
btnSignOut = findViewById(R.id.btnSignOut);
btnSignIn.setOnClickListener(this);
btnSignOut.setOnClickListener(this);
btnSignIn.setSize(SignInButton.SIZE_STANDARD);
imgUserAvatar.setVisibility(View.GONE);
lblName.setVisibility(View.GONE);
lblEmailID.setVisibility(View.GONE);
btnSignOut.setVisibility(View.GONE);
btnSignIn.setVisibility(View.VISIBLE);
gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
//.requestIdToken(RT_GOOGLE_SIGN_ID_ID)
.requestEmail()
.build();
googleSignInClient = GoogleSignIn.getClient(this, gso);
googleApiClient = new GoogleApiClient.Builder(this).enableAutoManage(this, this).addApi(Auth.GOOGLE_SIGN_IN_API, gso).build();
account = GoogleSignIn.getLastSignedInAccount(this);
updateUI(account);
}
@Override
public void onClick(View view) {
switch(view.getId()) {
case R.id.btnSignIn:
signIn();
break;
case R.id.btnSignOut:
signOut();
break;
}
}
private void signIn() {
Intent signInIntent = googleSignInClient.getSignInIntent();
startActivityForResult(signInIntent, RC_SIGN_IN);
}
private void signOut() {
Auth.GoogleSignInApi.signOut(googleApiClient).setResultCallback(new ResultCallback<Status>() {
@Override
public void onResult(@NonNull Status status) {
imgUserAvatar.setVisibility(View.GONE);
lblName.setVisibility(View.GONE);
lblEmailID.setVisibility(View.GONE);
btnSignOut.setVisibility(View.GONE);
btnSignIn.setVisibility(View.VISIBLE);
}
});
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//Result returned from launching the Intent from GoogleSignInClient.getSignInIntent(...);
if(requestCode == RC_SIGN_IN) {
//The Task returned from this call is always completed, no need to attach
//a listener.
Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
handleSignInResult(task);
}
}
private void handleSignInResult(Task<GoogleSignInAccount> completedTask) {
try {
GoogleSignInAccount account = completedTask.getResult(ApiException.class);
//Signed in successfully, show authenticated UI.
updateUI(account);
}
catch(ApiException e) {
updateUI(null);
}
}
private void updateUI(final GoogleSignInAccount account) {
if(account != null) {
lblName.setText(account.getDisplayName());
lblEmailID.setText(account.getEmail());
lblName.setVisibility(View.VISIBLE);
lblEmailID.setVisibility(View.VISIBLE);
btnSignOut.setVisibility(View.VISIBLE);
btnSignIn.setVisibility(View.GONE);
final Bitmap[] bitmap = new Bitmap[1];
final Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message message) {
imgUserAvatar.setImageBitmap(bitmap[0]);
imgUserAvatar.setVisibility(View.VISIBLE);
return true;
}
});
new Thread(new Runnable() {
@Override
public void run() {
InputStream in;
try {
in = new java.net.URL(account.getPhotoUrl().toString()).openStream();
bitmap[0] = BitmapFactory.decodeStream(in);
handler.sendEmptyMessage(0);
}
catch(IOException e) {
e.printStackTrace();
}
}
}).start();
}
else if(account == null) {
imgUserAvatar.setVisibility(View.GONE);
lblName.setVisibility(View.GONE);
lblEmailID.setVisibility(View.GONE);
btnSignOut.setVisibility(View.GONE);
btnSignIn.setVisibility(View.VISIBLE);
}//End if(account != null)
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
//ToDo in context only used for signout.
}
}
您可能还会发现此视频很有用:https://www.youtube.com/watch?v=2PIaGpJMCNs&t=