web-dev-qa-db-ja.com

AndroidアプリケーションでGoogleおよびFacebookからログアウトします

GoogleとFacebookのサインアップをそれぞれの方法で統合しました。しかし、署名に成功した後、私はさまざまなアクティビティを開きたいと思います。同様に、ユーザーはさまざまなさまざまなアクティビティに行くことができます。アクションバーを使用して、ユーザーがログインしているアカウントのいずれかからサインアウトするオプションを提供しています。別のアクティビティとメインアクティビティでユーザーをサインアウトするにはどうすればよいですか。例外が発生し、apiclient参照(googleの場合)およびセッション参照(facebookの場合)を別のアクティビティに渡すことができません。助けてください。前もって感謝します。

12
Jarvis

グーグルからログアウト:

これを新しいアクティビティに追加するだけで、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);
                  }
              });
  }
});
15
sommesh

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

ガイドのドキュメント

4
Miki Franko

ログインおよびログアウトイベントの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ドキュメントを参照 ここ

3
Prashant Arvind

Facebookの場合

LoginManager.getInstance().logOut();

Googleの場合

GoogleSignInOptions gso = new GoogleSignInOptions.
                    Builder(GoogleSignInOptions.DEFAULT_SIGN_IN).
                    build();

            GoogleSignInClient googleSignInClient=GoogleSignIn.getClient(context,gso);
            googleSignInClient.signOut();
3
Rehan Sarwar

新しいアクティビティを追加してください:

 @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();
3
Andrey

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

次に、ログアウトボタンイベントでそのメソッドを呼び出すだけです。

2
kulbhushan jain

まず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のオブジェクトです。

1
Hani Ramani

Googleアカウントの場合

Auth.GoogleSignInApi.signOut(mGoogleApiClient);

そして、Facebookアカウントの場合

LoginManager.getInstance().logOut();
1
tej shah
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) {

        }
    }
0
Mohsinali

これも、ログインとは異なる別のアクティビティで、[ログイン]ボタンをどこに配置すればよいですか。

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();
0

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()などのコードをベースアクティビティに実装し、ログインアクティビティでこれらをオーバーライドして、ログインロジックを実装するだけです。 (ログアウトアクティビティについても同様です。これらはオーバーライドされ、ログアウトコードを処理します)

0
VipulKumar