谷歌使用g-plus最新API在android中登录和注销

谷歌使用g-plus最新API在android中登录和注销,android,google-plus,google-api-client,google-oauth,google-plus-signin,Android,Google Plus,Google Api Client,Google Oauth,Google Plus Signin,我已经讨论了一些与登录和注销google plus相关的问题。而且大多数都过时了。我无法实现我真正想要的 一旦我注销,下次登录时,我希望用户选择可用的google帐户再次登录 我正在使用自定义登录和注销按钮。对于注销,我有两个案例 如果任何用户已在同一登录活动中登录,请在登录前注销 从不同的活动中注销 以下是我迄今为止实施的内容: public class LoginActivity extends AppCompatActivity implements OnClickListener{

我已经讨论了一些与登录和注销google plus相关的问题。而且大多数都过时了。我无法实现我真正想要的

一旦我注销,下次登录时,我希望用户选择可用的google帐户再次登录

我正在使用自定义登录和注销按钮。对于注销,我有两个案例

  • 如果任何用户已在同一登录活动中登录,请在登录前注销
  • 从不同的活动中注销
  • 以下是我迄今为止实施的内容:

    public class LoginActivity extends AppCompatActivity implements OnClickListener{
    
        private static final int RC_SIGN_IN = 9001;
        private GoogleApiClient mGoogleApiClient;
        private ConnectionResult mGoogleConnectionResult;
        private Button login;
        private ProgressDialog mProgressDialog;
        private Context mContext;
        private String mUri;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            mContext= LoginActivity.this;
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            setContentView(R.layout.login_layout);
    
            login= (Button) findViewById(R.id.lg_login_btn);
            login.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View v) {
            if(isOnline(mContext)){
                if(v.getId()== R.id.lg_login_btn) {
                    if(mGoogleApiClient!=null){
                        mGoogleApiClient.disconnect();
                    }
                GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestScopes(new Scope(Scopes.PLUS_LOGIN))
                .requestEmail()
                .build();
    
        mGoogleApiClient = new GoogleApiClient.Builder(mContext.getApplicationContext())
                .enableAutoManage(this , mGPlusConnectionFailedListener)
                .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
                .addApi(Plus.API)
                .build();
    
            signOutGPlus();
            Intent lSignInIntent= Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
            startActivityForResult(lSignInIntent, RC_SIGN_IN);
    
                }
            } else{
                showAlertDialog(mContext, "Error", "Please check internet connection");
            }
        }
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            logD("&&onActivityResult", "requestCode: "+requestCode);     // first
    
            if (requestCode == RC_SIGN_IN) {
                if(resultCode == RESULT_OK){
                    showProgressDialog();
                    getGPlusUserInfo(data);
                } else {
                    logD("&&onActivityResult", "requestCode: RESULT_ NOT Ok"+requestCode);
                }
            }
        }
    
        GoogleApiClient.OnConnectionFailedListener mGPlusConnectionFailedListener= new GoogleApiClient.OnConnectionFailedListener() {
            @Override
            public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
                logD("&&mGPlusConnectionFailedListener", "onConnectionFailed");
            }
        };
    
        private void getGPlusUserInfo(Intent data){
            GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
            handleSignInResult(result);
        }
    
        private void handleSignInResult(GoogleSignInResult result) {
            Log.d("&&handleSignInResult", "handleSignInResult:" + result.isSuccess());
            if (result.isSuccess()) {
                // Signed in successfully, show authenticated UI.
                String lDisplayName="";
                String lEmail="";
                String lFirstName="";
                String lLastName="";
                String lGender="";
    
                // G+
                if (mGoogleApiClient.hasConnectedApi(Plus.API)) {
                    logD("&&GPlusUserInfo", "&hasConnectedApi--------------------------------");
                    // Deprecated
                    Person person = Plus.PeopleApi.getCurrentPerson(mGoogleApiClient);
                    if(null != person) {
                        logD("&&GPlusUserInfo", "&--------------------------------");
                        logD("&&GPlusUserInfo", "&Display Name: " + person.getDisplayName());
                    lDisplayName= person.getDisplayName();
                        logD("&&GPlusUserInfo", "Gender: " + person.getGender());
                        if(person.getGender()< MyHalConstants.GENDER.length){
                            lGender= MyHalConstants.GENDER[person.getGender()];
                        } else{
                            lGender= "Other";
                        }
                    }
                }
                GoogleSignInAccount acct = result.getSignInAccount();
    
                if(null != acct) {
                    if (null != acct.getDisplayName()) {
                        logD("&&GPlusUserInfo", "&Display Name: " + acct.getDisplayName());
                    }
                    lFirstName= acct.getGivenName();
                    lLastName= acct.getFamilyName();
                    // Views inside NavigationView's header
                    Uri uri = acct.getPhotoUrl();                  
                }
            } else {
                // Signed out, show unauthenticated UI.
                signOutGPlus();
            }
        }
    
    
        // sign - out 
        private void signOutGPlus(){
            logD("&&signOutGPlus", "signOutGPlus");
            if(null != mGoogleApiClient){
                mGoogleApiClient.connect();
                mGoogleApiClient.registerConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() {
    
                    @Override
                    public void onConnected(@Nullable Bundle bundle) {
                        if(mGoogleApiClient.isConnected()) {
                            logD("&&signOutGPlus", "inside");
                        Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback(
                                new ResultCallback<Status>() {
                                        @Override
                                        public void onResult(@NonNull Status status) {
                                            logD("&&signOutGPlus", "onResult");
                                            if(mGoogleApiClient.isConnected()){
                                            mGoogleApiClient.clearDefaultAccountAndReconnect();
                                                mGoogleApiClient.disconnect();
                                        }
                                        // Deprecated
                                        /*Plus.AccountApi.clearDefaultAccount(mGoogleApiClient);
                                        //Plus.AccountApi.revokeAccessAndDisconnect(mGoogleApiClient);
                                        //revokeAccess();*/
                                        }
                                    }
                        );
                        }
                    }
    
                    @Override
                    public void onConnectionSuspended(int i) {
    
                    }
                });
            }
        }
    
    // Not used
        private void revokeAccess() {
        logD("&&revokeAccess", "revokeAccess");
        Auth.GoogleSignInApi.revokeAccess(mGoogleApiClient).setResultCallback(
                new ResultCallback<Status>() {
                        @Override
                        public void onResult(Status status) {
                            // ...
                        }
                    });
        }
    
        private void showProgressDialog() {
            if (mProgressDialog == null) {
                mProgressDialog = new ProgressDialog(this);
                mProgressDialog.setMessage(getString(R.string.loading));
                mProgressDialog.setIndeterminate(true);
            }
    
            mProgressDialog.show();
        }
    
        private void hideProgressDialog() {
            if (mProgressDialog != null && mProgressDialog.isShowing()) {
                mProgressDialog.hide();
            }
        }
    
        private void showAlertDialog(Context pContext, String pTitle, String pMessage){
            AlertDialog.Builder ldialogBuilder= new AlertDialog.Builder(pContext);
            ldialogBuilder.setTitle(pTitle)
                .setMessage(pMessage)
            .setPositiveButton("Ok", null);
            ldialogBuilder.show();
        }
    
        private void dismissDialog(){
            if(null != mProgressDialog){
                mProgressDialog.dismiss();
                mProgressDialog= null;
            }
        }
    }
    
    注意:通过登录活动,我可以从google plus或face book登录

    活动A(从g+或fb登录)

    登录后,用户被定向到活动B,从活动B用户可以从相应的门户(g+或fb)注销

    Facebook部分完成了。剩下的只有g+

    在这两种情况下,请使用更新的谷歌登录注销API帮助正确注销。

    如果要保存任何首选项,请在第二个活动中执行此操作 关于在第一个活动中登录,然后在退出时清除它,单击

    package com.ccc.bbbb;
    导入com.google.android.gms.common.ConnectionResult;
    导入com.google.android.gms.common.api.GoogleAppClient;
    导入com.google.android.gms.common.api.GoogleAppClient.ConnectionCallbacks;
    导入com.google.android.gms.common.api.GoogleAppClient.OnConnectionFailedListener;
    导入com.google.android.gms.common.api.ResultCallback;
    导入com.google.android.gms.plus.People;
    导入com.google.android.gms.plus.People.LoadPeopleResult;
    导入com.google.android.gms.plus.plus;
    //实现ConnectionCallbacks、OnConnectionFailedListener、ResultCallback
    公共类HomeActivity扩展活动实现OnClickListener、ConnectionCallbacks、OnConnectionFailedListener、,
    结果回拨
    {
    公共静态布尔值isLogout=false;
    GoogleapClient MGoogleapClient;
    @凌驾
    创建时受保护的void(Bundle savedInstanceState)
    {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);
    mgoogleapclient=新的Googleapclient.Builder(此)
    .addConnectionCallbacks(此)
    .addOnConnectionFailedListener(this).addApi(Plus.API)
    .addScope(Plus.SCOPE\u Plus\u LOGIN).build();
    //注销按钮单击
    if(networkCheck.isNetworkAvailable(HomeActivity.this))
    {
    日志d(标签“如果条件工作,则注销…”);
    isLogout=true;
    if(mgoogleapClient.isConnected())
    {
    Plus.AccountApi.clearDefaultAccount(mgoogleapClient);
    mGoogleApiClient.disconnect();
    mGoogleApiClient.connect();
    }
    Toast.makeText(HomeActivity.this,“您已注销”,Toast.LENGTH_SHORT.show();
    意向意向=新意向(HomeActivity.this、MainActivity.class);
    星触觉(意向);
    完成();
    }
    //重写以下方法并复制这些代码
    @凌驾
    public void onResult(@NonNull LoadPeopleResult arg0){
    //TODO自动生成的方法存根
    }
    @凌驾
    public void onconnection失败(@NonNull ConnectionResult arg0){
    //TODO自动生成的方法存根
    }
    @凌驾
    未连接的公共无效(@Nullable Bundle arg0){
    //TODO自动生成的方法存根
    mSignInClicked=false;
    //更新(真);
    Plus.PeopleApi.loadVisible(mgoogleAppClient,null).setResultCallback(
    这),;
    }
    @凌驾
    连接上的公共无效已暂停(int arg0){
    //TODO自动生成的方法存根
    mGoogleApiClient.connect();
    }
    @凌驾
    受保护的void onStart(){
    //TODO自动生成的方法存根
    super.onStart();
    mGoogleApiClient.connect();
    }
    @凌驾
    受保护的void onStop()
    {
    //TODO自动生成的方法存根
    super.onStop();
    if(mgoogleapClient.isConnected()){
    mGoogleApiClient.disconnect();
    }
    if(mDialog.isShowing()){
    mDialog.discouse();
    }
    }
    }
    
    一旦我注销,下次登录时,我希望用户选择可用的google帐户再次登录

    诀窍是在用户单击Google登录按钮登录后,清除默认帐户并连接GoogleAppClient这确保每当您单击登录按钮时,始终显示所有可用的Google帐户。

    步骤1:初始化GoogleAppClient并在Activity onCreate()中将onClickListener设置为googleSignInButton

    步骤2:通过onClick()方法处理Google登录

    @Override
    public void onClick(View v) {
    
        switch (v.getId()) {
            case R.id.google_sign_in:
    
                if (mApiClient.isConnected()) {
                    mApiClient.clearDefaultAccountAndReconnect();
                } else {
                    mApiClient.connect();
                }
    
                Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mApiClient);
                startActivityForResult(signInIntent, RC_SIGN_IN);
    
                break;
        }
    }
    
    误判

    // Make sure you connect and disconnect the GoogleApiClient in onStart and onStop lifecycle methods
    @Override
    protected void onStart() {
        super.onStart();
        mApiClient.connect();
    }
    
    @Override
    protected void onStop() {
        super.onStop();
        if (mApiClient.isConnected())
            mApiClient.disconnect();
    }
    
    
    
     @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if (requestCode == RC_SIGN_IN) {
                GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
    
                if (result != null && result.isSuccess()) {
    
                    GoogleSignInAccount account = result.getSignInAccount();
    
                    setAppPreferenceData(account.getId(), account.getEmail(), String.valueOf(account.getPhotoUrl()), account.getDisplayName());
    
                    startActivity(new Intent(this, NavigationActivity.class));
    
    
                    finish();
                } else {
                    mProgressLayout.setVisibility(View.GONE);
    
                    if (Utils.isNetworkAvailable(this))
                        Toast.makeText(this, "Google Authentication Failed! Please try again", Toast.LENGTH_SHORT).show();
                    else
                        Toast.makeText(this, "Network Error! Please connect to your wifi.", Toast.LENGTH_LONG).show();
                }
            } 
        }
    
    为什么您的代码中需要这么多回调方法?我想您的代码有点复杂。主要的技巧是在用户尝试登录时断开并清除默认帐户,以确保始终向用户显示有效的google帐户列表。 我使用了同样的程序,它经过了尝试、测试和工作

    我的应用程序中使用的登录状态只有一种回调方法

    public class SignInActivity extends AppCompatActivity implements
            GoogleApiClient.OnConnectionFailedListener {
    }
    
    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {
        Toast.makeText(SignInActivity.this, "Google Play connection error", Toast.LENGTH_SHORT).show();
        mProgressLayout.setVisibility(View.GONE);
    }
    
    一旦我注销,下次登录时,我希望用户选择可用的google帐户再次登录

    只需注销用户和revo即可
    private GoogleApiClient mApiClient;
    
    private void initializeGoogleSignIn() {
        GoogleSignInOptions signInOptions = new GoogleSignInOptions
                .Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestProfile()
                .build();
    
        mApiClient = new GoogleApiClient.Builder(this)
                .enableAutoManage(this, this)
                .addApi(Auth.GOOGLE_SIGN_IN_API, signInOptions)
                .build();
    
        SignInButton googleSignInButton = (SignInButton) findViewById(R.id.google_sign_in);
    
        googleSignInButton.setOnClickListener(this);
    }
    
    @Override
    public void onClick(View v) {
    
        switch (v.getId()) {
            case R.id.google_sign_in:
    
                if (mApiClient.isConnected()) {
                    mApiClient.clearDefaultAccountAndReconnect();
                } else {
                    mApiClient.connect();
                }
    
                Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mApiClient);
                startActivityForResult(signInIntent, RC_SIGN_IN);
    
                break;
        }
    }
    
    // Make sure you connect and disconnect the GoogleApiClient in onStart and onStop lifecycle methods
    @Override
    protected void onStart() {
        super.onStart();
        mApiClient.connect();
    }
    
    @Override
    protected void onStop() {
        super.onStop();
        if (mApiClient.isConnected())
            mApiClient.disconnect();
    }
    
    
    
     @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if (requestCode == RC_SIGN_IN) {
                GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
    
                if (result != null && result.isSuccess()) {
    
                    GoogleSignInAccount account = result.getSignInAccount();
    
                    setAppPreferenceData(account.getId(), account.getEmail(), String.valueOf(account.getPhotoUrl()), account.getDisplayName());
    
                    startActivity(new Intent(this, NavigationActivity.class));
    
    
                    finish();
                } else {
                    mProgressLayout.setVisibility(View.GONE);
    
                    if (Utils.isNetworkAvailable(this))
                        Toast.makeText(this, "Google Authentication Failed! Please try again", Toast.LENGTH_SHORT).show();
                    else
                        Toast.makeText(this, "Network Error! Please connect to your wifi.", Toast.LENGTH_LONG).show();
                }
            } 
        }
    
    public class SignInActivity extends AppCompatActivity implements
            GoogleApiClient.OnConnectionFailedListener {
    }
    
    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {
        Toast.makeText(SignInActivity.this, "Google Play connection error", Toast.LENGTH_SHORT).show();
        mProgressLayout.setVisibility(View.GONE);
    }
    
    private void signOut() {
        Auth.GoogleSignInApi.signOut(googleApiClient).setResultCallback(
                new ResultCallback<Status>() {
                    @Override
                    public void onResult(Status status) {
                        Timber.d("Logged out");
                    }
                });
    }
    
    public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) {
        this.activity = activity;
        if (requestCode == RC_SIGN_IN) {
            GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
            handleSignInResult(result);
        }
    
       /*For inintializing googleapiclient*/
        private void initGoogleClient() {
    
        gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestEmail()
                .build();
    
        googleApiClient = new GoogleApiClient.Builder(activity)
                .enableAutoManage((FragmentActivity) activity /* FragmentActivity */, this /* OnConnectionFailedListener */)
                .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
                .addOnConnectionFailedListener(this)
                .addApi(Plus.API)
                .addScope(new Scope(Scopes.PROFILE))
                .build();
    }
    
    private void signIn() {
        Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(googleApiClient);
        activity.startActivityForResult(signInIntent, RC_SIGN_IN);
    }
    
    Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback(
                new ResultCallback<Status>() {
                    @Override
                    public void onResult(@NonNull Status status) {
                        Toast.makeText(context, "Success"+status.getStatusMessage(), Toast.LENGTH_SHORT).show();
                    }
                });