GoogleとFacebookのサインアップをそれぞれの方法で統合しました。しかし、署名に成功した後、私はさまざまなアクティビティを開きたいと思います。同様に、ユーザーはさまざまなさまざまなアクティビティに行くことができます。アクションバーを使用して、ユーザーがログインしているアカウントのいずれかからサインアウトするオプションを提供しています。別のアクティビティとメインアクティビティでユーザーをサインアウトするにはどうすればよいですか。例外が発生し、apiclient参照(googleの場合)およびセッション参照(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);
}
});
}
});
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();
}
}
}
ログインおよびログアウトイベントの2017年11月7日の最新コードから更新
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.build();
GoogleSignInClient mGoogleSignInClient = GoogleSignIn.getClient(this, gso);
Googleログアウト
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コードを参照 ここ
Facebookログアウト
LoginManager.getInstance().logOut();
Facebookドキュメントを参照 ここ
Facebookの場合
LoginManager.getInstance().logOut();
Googleの場合
GoogleSignInOptions gso = new GoogleSignInOptions.
Builder(GoogleSignInOptions.DEFAULT_SIGN_IN).
build();
GoogleSignInClient googleSignInClient=GoogleSignIn.getClient(context,gso);
googleSignInClient.signOut();
新しいアクティビティを追加してください:
@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();
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 logoutのセカンダリ:
まず、Googleクライアントが接続されているかどうかを確認する必要があります。接続されている場合は、ログアウトコードを呼び出します。
if (mGoogleApiClient.isConnected())
Auth.GoogleSignInApi.signOut(mGoogleApiClient);
ここで、mGoogleApiClientはGoogleApiClientのオブジェクトです。
Googleアカウントの場合
Auth.GoogleSignInApi.signOut(mGoogleApiClient);
そして、Facebookアカウントの場合
LoginManager.getInstance().logOut();
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) {
}
}
これも、ログインとは異なる別のアクティビティで、[ログイン]ボタンをどこに配置すればよいですか。
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 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()
などのコードをベースアクティビティに実装し、ログインアクティビティでこれらをオーバーライドして、ログインロジックを実装するだけです。 (ログアウトアクティビティについても同様です。これらはオーバーライドされ、ログアウトコードを処理します)