web-dev-qa-db-ja.com

Google+は別のアクティビティからログアウトします

AndroidのGoogle+ APIの使用を開始し、このチュートリアルに従ってサインインアプリケーションを作成しました。

https://developers.google.com/+/mobile/Android/sign-in

問題は、別のActivityからサインアウトボタンを作成したいのですが、私がやろうとしてもうまくいかなかったことです。

私のGPlusLoginコード(Google+ログインのアクティビティ):

import Android.app.Activity;
import Android.app.ProgressDialog;
import Android.content.Intent;
import Android.content.IntentSender.SendIntentException;
import Android.os.Bundle;
import Android.util.Log;
import Android.view.View;
import Android.view.View.OnClickListener;
import com.google.Android.gms.common.*;
import com.google.Android.gms.common.GooglePlayServicesClient.ConnectionCallbacks;
import com.google.Android.gms.common.GooglePlayServicesClient.OnConnectionFailedListener;
import com.google.Android.gms.plus.PlusClient;

public class GPlusLogin extends Activity implements ConnectionCallbacks, OnConnectionFailedListener{

    private static final int REQUEST_CODE_RESOLVE_ERR = 9000;
    private static final String TAG = "GPlusLogin";

    private ProgressDialog mConnectionProgressDialog;
    private PlusClient mPlusClient;
    private ConnectionResult mConnectionResult;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.gplus_layout);
        mPlusClient = new PlusClient.Builder(this, this, this).setVisibleActivities("http://schemas.google.com/AddActivity", "http://schemas.google.com/BuyActivity").build();
        Bundle extras = getIntent().getExtras();
        mConnectionProgressDialog = new ProgressDialog(this);
        mConnectionProgressDialog.setMessage("Signing in...");

        if(extras!=null){
            if(extras.getString("signout")!=null){
                if (mPlusClient.isConnected()) {
                    mPlusClient.clearDefaultAccount();
                    mPlusClient.disconnect();
                    mPlusClient.connect();
                    finish();
                    startActivity(getIntent());
                }
            }
        }else{

            findViewById(R.id.sign_in_button).setOnClickListener(new OnClickListener() {

                public void onClick(View view) {
                    // TODO Auto-generated method stub
                    if (view.getId() == R.id.sign_in_button && !mPlusClient.isConnected()) {
                        if (mConnectionResult == null) {
                            mConnectionProgressDialog.show();
                        } else {
                            try {
                                mConnectionResult.startResolutionForResult(GPlusLogin.this, REQUEST_CODE_RESOLVE_ERR);
                            } catch (SendIntentException e) {
                                // Try connecting again.
                                mConnectionResult = null;
                                mPlusClient.connect();
                            }
                        }
                    }
                }
            });
        }
    }

    @Override
    protected void onStart() {
        // TODO Auto-generated method stub
        super.onStart();
        mPlusClient.connect();
    }

    @Override
    protected void onStop() {
        // TODO Auto-generated method stub
        super.onStop();
        mPlusClient.disconnect();
    }

    @Override
    public void onConnectionFailed(ConnectionResult result) {
        // TODO Auto-generated method stub
        if (mConnectionProgressDialog.isShowing()) {
            // The user clicked the sign-in button already. Start to resolve
            // connection errors. Wait until onConnected() to dismiss the
            // connection dialog.
            if (result.hasResolution()) {
                try {
                    result.startResolutionForResult(this, REQUEST_CODE_RESOLVE_ERR);
                } catch (SendIntentException e) {
                    mPlusClient.connect();
                }
            }
        }

        mConnectionResult = result;
    }

    @Override
    protected void onActivityResult(int requestCode, int responseCode, Intent intent) {
        if (requestCode == REQUEST_CODE_RESOLVE_ERR && responseCode == RESULT_OK) {
            mConnectionResult = null;
            mPlusClient.connect();
        }
    }

    @Override
    public void onConnected() {
        // TODO Auto-generated method stub
        mConnectionProgressDialog.dismiss();
        Intent main = new Intent(GPlusLogin.this, MainActivity.class);
        main.putExtra("result", true);
        startActivity(main);
    }

    @Override
    public void onDisconnected() {
        // TODO Auto-generated method stub
        Log.d(TAG, "disconnected");
    }

}

MainActivityの切断コード:

import Android.os.Bundle;
import Android.app.Activity;
import Android.content.Intent;
import Android.view.Menu;
import Android.view.View;
import Android.view.View.OnClickListener;
import Android.widget.Button;
import Android.widget.TextView;


public class MainActivity extends Activity{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Bundle extras = getIntent().getExtras();
        if(extras==null){
            Intent intent = new Intent(this, GPlusLogin.class);
            startActivity(intent);
        }
        TextView text1 = (TextView) findViewById(R.id.text1);
        text1.setText("You Are Connected :D");

        Button SignOut = (Button) findViewById(R.id.sign_out_gplus);
        SignOut.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View view) {
                // TODO Auto-generated method stub
                Intent intent = new Intent(MainActivity.this, GPlusLogin.class);
                intent.putExtra("signout", true);
                startActivity(intent);
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }


}
31
arielschon12

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

そして次:

 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);
                      }
                  });
      }
  });
26
sommesh

ちょっと私はこの問題を自分で解決し、魅力のように働いています

問題:Googleプラスサインインが1つのアクティビティにありますが、別のアクティビティからログアウトする必要があります

解決:

私のGoogle-plusログアウトアクティビティは次のとおりです。

public class MainActivity extends Activity implements OnClickListener,
    ConnectionCallbacks, OnConnectionFailedListener,
    ResultCallback<People.LoadPeopleResult> {

   GoogleApiClient mGoogleApiClient;
   boolean mSignInClicked;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this).addApi(Plus.API)
            .addScope(Plus.SCOPE_PLUS_LOGIN).build();

     //copy this code on "Logout" Onclick
  logout.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
             if (mGoogleApiClient.isConnected()) {
            Plus.AccountApi.clearDefaultAccount(mGoogleApiClient);
            mGoogleApiClient.disconnect();
            mGoogleApiClient.connect();
            // updateUI(false);
            System.err.println("LOG OUT ^^^^^^^^^^^^^^^^^^^^ SUCESS");
        } 

        }
    });

}
@Override
public void onConnected(Bundle arg0) {
    // TODO Auto-generated method stub
    mSignInClicked = false;

    // updateUI(true);
    Plus.PeopleApi.loadVisible(mGoogleApiClient, null).setResultCallback(
            this);
}

@Override
public void onConnectionSuspended(int arg0) {
    // TODO Auto-generated method stub
    mGoogleApiClient.connect();
    // updateUI(false);
}

@Override
public void onConnectionFailed(ConnectionResult arg0) {
    // TODO Auto-generated method stub

}

protected void onStart() {
    super.onStart();
    mGoogleApiClient.connect();
}

protected void onStop() {
    super.onStop();
    if (mGoogleApiClient.isConnected()) {
        mGoogleApiClient.disconnect();
    }
}

@Override
public void onResult(LoadPeopleResult arg0) {
    // TODO Auto-generated method stub

}

ソリューションに関する説明:

シングルパッケージの場合、google plus APIは1つのトークンとセッションを生成します。ここでは、ログアウトページでもう1つのセッションを作成するだけです。セッションから簡単にログアウトできます。

私はこの問題について多くのことを試しましたが、現在のセッションからログアウトするには、これを試してください。それは間違いなく動作します。疑問があれば教えてください

18
madhu sudhan

おそらく、基本クラスを作成し、connect/disconnectメソッドを継承する方が簡単でしょう。完全なサンプルであるPhotohuntは、この設計を詳細に文書化しています。

ドキュメントコード

6
jonathanberi

答えを見つけるために一週間以上苦労した後。サインイン後、boolean isSignedInをsharedpreferencesにtrueとして保存しました。

private SharedPreferences.Editor editor;
private SharedPreferences prefs;

editor = getSharedPreferences(getString(R.string.userDetails), MODE_PRIVATE).edit();
editor.putBoolean(getString(R.string.isSignedIn), true);
editor.apply();`

ユーザーがログアウトをクリックしたときのアクティビティから、ブール値をfalseに変更します。

googleApiClientがビルドされるログインアクティビティで。 onStartメソッドで。 isSignedInがfalseかどうかを確認します。

@Override
public void onStart() {
super.onStart();
if (!prefs.getBoolean(getString(R.string.isSignedIn), false)) {
    signOut();
    }     
}

onConnectedでも同じことをします

@Override
public void onConnected(Bundle connectionHint) {
    if (mGoogleApiClient.isConnected()) {
        Log.i(TAG, "onConnected: " + "yes it is connected");
        if (!prefs.getBoolean(getString(R.string.isSignedIn), false)) {
            signOut();
        }
    }
}

これはログアウトし、Accessを失効させます。

public void signOut() {
    if (mGoogleApiClient != null) {
        Log.e(TAG, "signOut: " + mGoogleApiClient + mGoogleApiClient.isConnected());
        Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback(
        if (mGoogleApiClient.isConnected()) {
                    new ResultCallback<Status>() {
                        @Override
                        public void onResult(Status status) {
                            // ...
                            Log.i(TAG, "onResult: " + mGoogleApiClient);
                        }
                    });
         Auth.GoogleSignInApi.revokeAccess(mGoogleApiClient).setResultCallback(
                    new ResultCallback<Status>() {
                        @Override
                        public void onResult(Status status) {
                            Log.i(TAG, "onResult: Revoke Access status:" + status.getStatus());
                        }
                    });
        }
    }
}

ジョナサンは、基本クラスまたはフラグメントがあなたの人生を楽にするだろうということは正しいです。とはいえ、ここのコードは機能する可能性があります。問題は、PlusClientがonCreate()で接続されているかどうかを確認していることですが、onStart()まで接続しません。おそらくonConnected()メソッドでインテントを確認し、そこでサインアウトを実行する必要があるでしょう。

1
Ian Barber

FirebaseAuthはシングルトンクラスであるため、アプリのどこからでもFirebaseAuthのインスタンスを取得できます。

 mAuth = FirebaseAuth.getInstance();
 mAuth.signOut();
1
Joyal

別のアクティビティからログアウトをクリックしたら、追加のインテントを送信して、ログアウトボタンがクリックされたことを示します。その後、ログインアクティビティで

if (Intent.Extras != null && Intent.Extras.ContainsKey("LogoutAction")) {
    _logoutRequest = Intent.Extras.GetBoolean("LogoutAction");
}
if (_logoutRequest) {
    await PlusClass.AccountApi.RevokeAccessAndDisconnect(_apiClient);
    _apiClient.Disconnect();
    _apiClient.Connect ();
    _logoutRequest = false;
}

その他の活動

var intent = new Intent(this.Activity,typeof(LoginActivity));
intent.PutExtra("LogoutAction",true);
1
Lee Yeong Guang

これが私の解決策です。 Utilsシングルトンクラス を作成しました。 LoginActivityには、GoogleSignInClientオブジェクトがあります。したがって、ログイン後にDashboardActivityを開始する直前に、Utils.getInstance().setGoogleSignInClient(googleSignInClient)を呼び出してgoogleSignInClientオブジェクトのインスタンスを保存します。今、どこでも、ログアウトしたい場合、Utils準備ができてこのメソッドがあります:

public void signOut() {
    googleSignInClient.signOut();
    FirebaseAuth.getInstance().signOut();
}

だから今、私は他のアクティビティからこれを行うことができます:

else if (id == R.id.action_logout) {
    Utils.getInstance().signOut();
    Intent intent = new Intent(this, LoginActivity.class);
    startActivity(intent);
}

はい。両方からログアウトする必要があります。そうしないと、次回ログインボタンをタップしたときにAccount Chooserが表示されない場合があります。

0
Reeshabh Ranjan

sommesh の答えは完璧ですが、コードが少ない場合は、次のように「パブリック静的メソッド」を使用できます。

public static GoogleApiClient mGoogleApiClient;
...
...
public static void signOutFromGoogle() {
    Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback(
            new ResultCallback<Status>() {
                @Override
                public void onResult(Status status) {
                    //...
                }
            });
}

そして、他のアクティビティでそれを呼び出します:

Your_Google_Activity.mGoogleApiClient.connect();
btnSignOut.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {            
        Your_Google_Activity.signOutFromGoogle();
    }
});
0
Ali_dev