我已经使用各自的方法集成了谷歌和Facebook注册。但是在成功签名之后,我想打开不同的活动,同样用户可以去各种不同的活动。我使用了操作栏,我可以选择从用户登录的任一帐户中退出。如果我处于不同的活动,那么我可以在主要活动中退出用户。我得到一个例外,我无法将apiclient引用(对于谷歌)和会话引用(对于Facebook)传递给另一个活动。请帮忙。提前致谢。
从谷歌退出:
只需在您的新活动中添加此项,您希望google +的注销按钮位于此处:
@Override
protected void onStart() {
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.build();
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
.build();
mGoogleApiClient.connect();
super.onStart();
}
接下来你可以在按钮上设置setOnClickListener:
signout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback(
new ResultCallback<Status>() {
@Override
public void onResult(Status status) {
// ...
Toast.makeText(getApplicationContext(),"Logged Out",Toast.LENGTH_SHORT).show();
Intent i=new Intent(getApplicationContext(),MainActivity.class);
startActivity(i);
}
});
}
});
public class LogOutActivity extends AppCompatActivity implements GoogleApiClient.OnConnectionFailedListener {
GoogleApiClient mGoogleApiClient;
Button btnLogout;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
btnLogut = (Button) findViewBy(R.id.btnLogout);
GoogleSignInOptions 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();
btnLogout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback(new ResultCallback<Status>() {
@Override
public void onResult(@NonNull Status status) {
}
Intent intent = new Intent(mContext, LoginActivity.class);
});
}
});
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
}
}
这也是在另一个不同于Login的活动中你应该在哪里登录按钮。
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(fromActivity.getString(R.string.default_web_client_id))
.requestEmail()
.requestProfile()
.build();
// Build a GoogleSignInClient with the options specified by gso.
GoogleSignInClient mGoogleSignInClient = GoogleSignIn.getClient(fromActivity, gso);
mGoogleSignInClient.signOut();
从facebook退出:
public static void callFacebookLogout(Context context) {
Session session = Session.getActiveSession();
if (session != null) {
if (!session.isClosed()) {
session.closeAndClearTokenInformation();
//clear your preferences if saved
}
} else {
session = new Session(context);
Session.setActiveSession(session);
session.closeAndClearTokenInformation();
//clear your preferences if saved
}
}
从谷歌退出:
@Override
public void onClick(View view) {
if (view.getId() == R.id.sign_out_button) {
if (mGoogleApiClient.isConnected()) {
Plus.AccountApi.clearDefaultAccount(mGoogleApiClient);
mGoogleApiClient.disconnect();
mGoogleApiClient.connect();
}
}
}
只需添加您的新活动:
@Override
protected void onStart() {
mGoogleApiClient.connect();
super.onStart();
}
然后
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.sign_out_button2:
Plus.AccountApi.clearDefaultAccount(mGoogleApiClient);
mGoogleApiClient.disconnect();
mGoogleApiClient.connect();
自2017年11月7日起更新最新登录和退出活动代码
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.build();
GoogleSignInClient mGoogleSignInClient = GoogleSignIn.getClient(this, gso);
Google Logout
mGoogleSignInClient.signOut()
.addOnCompleteListener(this, new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
// [START_EXCLUDE]
updateUI(null);
// [END_EXCLUDE]
}
});
Google RevokeAccess
mGoogleSignInClient.revokeAccess()
.addOnCompleteListener(this, new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
// [START_EXCLUDE]
updateUI(null);
// [END_EXCLUDE]
}
});
请参阅Google Code Here
Facebook退出
LoginManager.getInstance().logOut();
请参阅Facebook Doc Here
从facebook退出很容易
只需添加以下代码即可
LoginManager.getInstance().logOut();
然后,您可以通过进一步添加以下代码将用户重定向到登录活动
LoginManager.getInstance().logOut();
Intent intent = new Intent(CurrentActivity.this, LoginActivity.class);
startActivity(intent);
finish();
所以你的logoutFromFacebook的最终代码是
public void logoutFromFacebook(){
LoginManager.getInstance().logOut();
Intent intent = new Intent(CurrentActivity.this, LoginActivity.class);
startActivity(intent);
finish();
}
现在只需在您的注销按钮事件上调用该方法。
首先是Facebook注销:
LoginManager.getInstance().logOut();
如果您尝试从其他活动或片段注销,则会出现Facebook sdk未初始化的错误。那么首先你必须初始化facebook sdk,如:
FacebookSdk.sdkInitialize(your context here);
然后从经理退出。
Google注销的辅助功能:
首先,您必须检查谷歌客户端是否已连接,如果已连接,则请求注销代码:
if (mGoogleApiClient.isConnected())
Auth.GoogleSignInApi.signOut(mGoogleApiClient);
这里mGoogleApiClient是GoogleApiClient的对象。
对于谷歌帐户
Auth.GoogleSignInApi.signOut(mGoogleApiClient);
和Facebook帐户
LoginManager.getInstance().logOut();
对于Facebook
LoginManager.getInstance().logOut();
对于谷歌
GoogleSignInOptions gso = new GoogleSignInOptions.
Builder(GoogleSignInOptions.DEFAULT_SIGN_IN).
build();
GoogleSignInClient googleSignInClient=GoogleSignIn.getClient(context,gso);
googleSignInClient.signOut();
从Facebook退出。
public void logoutFromFacebook() {
Session session = Session.getActiveSession();
session.closeAndClearTokenInformation();
// Clear Preferences and other data and go back to login activty
}
从Google+退出。请注意,Google+注销比Facebook更复杂。您必须管理布尔值以在单击注销时跟踪事件(与登录时相同)。
public void logoutFromGooglePlus() {
mGooglePlusLogoutClicked = true; // Keep track when you click logout
if (mGoogleApiClient.isConnected()) {
Plus.AccountApi.clearDefaultAccount(mGoogleApiClient);
revokeAccess();
} else {
mGoogleApiClient.connect(); // It can send user to onConnected(), call logout again from there
}
}
// revoke access (if needed)
protected void revokeAccess() {
Plus.AccountApi.revokeAccessAndDisconnect(mGoogleApiClient)
.setResultCallback(new ResultCallback<Status>() {
@Override
public void onResult(Status status) {
mGoogleApiClient.disconnect();
mGoogleApiClient.connect();
// Clear data and go to login activity
}
});
}
要回答评论中的问题:GoogleApiClient
可以在应用程序中多次实例化,它仍然采用与第一次初始化时相同的实例。因此,不要担心如何在活动中“传递”GoogleApiClient
。它是一个轻量级客户端,旨在初始化为每个活动中的新实例。只需建立一个新的GoogleAPiClient
,打电话给.connect()
并开始工作。但是,您必须实现它所需的接口,但如果您不打算在那里进行任何工作,则可以将这些方法保留为空。
就mLogoutClicked
布尔值而言,您可以根据需要拥有自己的实现。基本上它只是一种告诉onConnected()
方法你来注销的方法。 (看看代码,我们也在注销时调用.connect()
。因此它可能会进入onConnected()
并与您的登录代码冲突)。你可以在你的onconnected()
上做这样的事情
public void onConnected(Bundle connectionHint) {
if (mGooglePlusLogoutClicked) {
logoutFromGooglePlus();
mGooglePlusLogoutClicked = false;
}
}
作为对您的实现流程的建议,让基类执行所有GoogleApiClient
初始化,并让Login活动和其他活动扩展它。因此,它将隐式处理在每个活动中初始化客户端的问题。只需在基本活动中实现常见的onConnected()
,onConnectionFailed()
等代码,并让登录活动覆盖这些代码以实现登录逻辑。 (对于注销活动也一样。它将覆盖这些并处理注销代码)