首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >每次用户登录时,Google登录都使用相同的帐户

每次用户登录时,Google登录都使用相同的帐户
EN

Stack Overflow用户
提问于 2016-04-16 11:21:34
回答 15查看 14.4K关注 0票数 18

我使用OAuth让用户通过谷歌账户登录安卓应用。当用户第一次点击Google登录按钮时,它会产生一个选择帐户的对话框。同样,当用户注销并决定使用不同的Google帐户登录时,它不会提示选择帐户,而是登录用户上次选择的帐户

代码语言:javascript
运行
复制
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.login);
    initialize();
    Firebase.setAndroidContext(this);
    ref=new Firebase("https://texter10c.firebaseio.com");

    loginButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            progressDialog.setMessage("Logging in !");
            progressDialog.setTitle("Hang on!");
            progressDialog.show();

            ref.authWithPassword(emailField.getText().toString(), passwordField.getText().toString(), new Firebase.AuthResultHandler() {
                @Override
                public void onAuthenticated(AuthData authData) {
                    Log.e("Authenticated","Authenticated");
                    getUserIdandLogin();
                }

                @Override
                public void onAuthenticationError(FirebaseError firebaseError) {
                    progressDialog.dismiss();
                    Toast.makeText(LoginActivity.this, firebaseError.getMessage(), Toast.LENGTH_SHORT).show();
                }
            });
        }
    });

    signupButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(LoginActivity.this, SignupActivity.class);
            startActivity(intent);
        }
    });

    googleSignInButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            progressDialog.setTitle("Contacting Google");
            progressDialog.setMessage("Logging you in");
            progressDialog.show();
            if(!mGoogleApiClient.isConnected())
            mGoogleApiClient.connect();
        }
    });

}

private void getGoogleToken(){

    AsyncTask<Void,Void,String> task=new AsyncTask<Void, Void, String>() {
        @Override
        protected String doInBackground(Void... params) {
            final String scopes="oauth2:"+"https://www.googleapis.com/auth/plus.login"+" "+"https://www.googleapis.com/auth/plus.me";
            try {
                if(!mGoogleApiClient.isConnected())
                {
                    mGoogleApiClient.connect();
                }
                googleAccessToken= GoogleAuthUtil.getToken(LoginActivity.this,Plus.AccountApi.getAccountName(mGoogleApiClient),scopes);
                Log.e("AccessToken",googleAccessToken+"");
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
            catch (GoogleAuthException e)
            {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            try {
                ref.authWithOAuthToken("google", googleAccessToken, new Firebase.AuthResultHandler() {
                    @Override
                    public void onAuthenticated(final AuthData authData) {
                        try {
                            Log.e("Firebase", "Google Authentication Success");
                            Log.e("Username", authData.getProviderData().get("displayName").toString());
                            Log.e("Id", authData.getProviderData().get("id").toString());


                            Firebase googleUserRef = ref.child("UserDetails/names/" + authData.getProviderData().get("id").toString());
                            Map<String, String> googleUserMap = new HashMap<String, String>();
                            googleUserMap.put("Username", authData.getProviderData().get("displayName").toString());
                            final String UserID = "GoogleUser" + authData.getProviderData().get("displayName") + authData.getProviderData().get("id");
                            googleUserMap.put("UserId", UserID);

                            googleUserRef.setValue(googleUserMap, new Firebase.CompletionListener() {
                                @Override
                                public void onComplete(FirebaseError firebaseError, Firebase firebase) {
                                    progressDialog.dismiss();
                                    dataStore.setCurrentUserName(authData.getProviderData().get("displayName").toString());
                                    dataStore.setCurrentUserID(UserID);
                                    storeDatainSharedPreferences();
                                    Intent intent = new Intent(LoginActivity.this, DialogActivity.class);
                                    startActivity(intent);
                                }
                            });
                        }
                        catch (NullPointerException e)
                        {
                            e.printStackTrace();
                        }
                    }

                    @Override
                    public void onAuthenticationError(FirebaseError firebaseError) {
                        Log.e("GogoleAuthFailed", firebaseError.getMessage());

                    }
                });
            }
            catch (NullPointerException e)
            {
                Log.e("Accesstoken problem",e.getMessage());
            }
        }
    };
    task.execute();
}

public void getUserIdandLogin()
{
    dataStore.userDialogMap=new ArrayList<Map<String,String>>();
    dataStore.generatedChatIds=new ArrayList<>();
    Firebase refUser=ref.child("UserDetails/names");
    refUser.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            Map<String, String> map = new HashMap<String, String>();
            map = dataSnapshot.getValue(Map.class);
            try{
                if (map.get("Email").equals(emailField.getText().toString()))
                {
                    Toast.makeText(LoginActivity.this, "Successfilly Logged in", Toast.LENGTH_SHORT).show();
                    dataStore.setCurrentUserName(map.get("Username"));
                    dataStore.setCurrentUserID(map.get("UserId"));
                    intent=new Intent(LoginActivity.this,DialogActivity.class);
                    startActivity(intent);
                    storeDatainSharedPreferences();
                    progressDialog.dismiss();
                }

            }
            catch (NullPointerException e)
            {
                Log.e("NullPointerGUser",e.getMessage());
            }
        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {

        }
    });
}

private void storeDatainSharedPreferences() {
    try {
        SharedPreferences.Editor editor = getSharedPreferences(NEW_PREFS, MODE_PRIVATE).edit();
        editor.putString("CurrentUsername", dataStore.getCurrentUserName());
        editor.putString("CurrentUserId", dataStore.getCurrentUserID());
        editor.commit();
    }
    catch (NoSuchElementException e)
    {
        new AlertDialog.Builder(LoginActivity.this).setMessage("There was an error whil logging in")
                .setTitle("Little Problem here!").setPositiveButton("Retry", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Intent intent=new Intent(LoginActivity.this,LoginActivity.class);
                removeDatainSharedPreferences();
                mGoogleApiClient.disconnect();
                startActivity(intent);
            }
        }).show();
    }
}

private void removeDatainSharedPreferences() {
    SharedPreferences.Editor editor = getSharedPreferences(NEW_PREFS, MODE_PRIVATE).edit();
    editor.remove("CurrentUsername");
    editor.remove("CurrentUserId");
    editor.commit();
}


private void initialize() {
    emailInputLayout=(TextInputLayout)findViewById(R.id.emailInputLayout);
    emailField=(EditText)findViewById(R.id.emailField);
    passwordField=(EditText)findViewById(R.id.passwordField);
    passwordInputLayout=(TextInputLayout)findViewById(R.id.passwordInputLayout);
    loginButton=(Button)findViewById(R.id.loginButton);
    emailInputLayout.setHint("Email");
    passwordInputLayout.setHint("Password");
    progressDialog=new ProgressDialog(LoginActivity.this);
    signupButton=(TextView)findViewById(R.id.signupButton);
    forgotPasswordButton=(TextView)findViewById(R.id.forgotPasswordField);
    googleSignInButton=(SignInButton)findViewById(R.id.googleSignInButton);
    googleSignInButton.setColorScheme(SignInButton.COLOR_AUTO);
    forgotPasswordButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent=new Intent(LoginActivity.this,ForgotPasswordActivity.class);
            startActivity(intent);
        }
    });

    SharedPreferences sharePreferences=getSharedPreferences(NEW_PREFS,MODE_PRIVATE);
    if(!sharePreferences.getString("CurrentUsername","null").equals("null")) {
        Log.e("SharedPreferences", sharePreferences.getString("CurrentUsername", "null"));
        Log.e("SharedPreferences",sharePreferences.getString("CurrentUserId",null));
        Intent intent=new Intent(LoginActivity.this,DialogActivity.class);
        startActivity(intent);
    }

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


   if(!isNetworkAvailable())
   {
      snackbar=Snackbar.make(findViewById(android.R.id.content),"You are offline",Snackbar.LENGTH_INDEFINITE)
              .setAction("Retry", new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                      if(!isNetworkAvailable())
                          dismissSnackBar();
                      else
                          snackbar.show();
                  }

              });
       snackbar.show();
   }

}

private void dismissSnackBar() {
    snackbar.dismiss();
}


private boolean isNetworkAvailable()
{
    ConnectivityManager manager=(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkIngo=manager.getActiveNetworkInfo();
    return networkIngo!=null&& networkIngo.isConnected();
}

@Override
public void onConnected(@Nullable Bundle bundle) {
        Log.e("GoogleApi","Connected");
        getGoogleToken();
}

@Override
public void onConnectionSuspended(int i) {

}

@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
    Log.e("GoogleApi",connectionResult.toString());
    if(!connectionResult.hasResolution())
    {
        GooglePlayServicesUtil.getErrorDialog(connectionResult.getErrorCode(),LoginActivity.this,0).show();
    }
    if(connectionResult.isSuccess())
    {
        getGoogleToken();
    }
    try
    {
        connectionResult.startResolutionForResult(this,100);
    }
    catch (IntentSender.SendIntentException e)
    {
        e.printStackTrace();
    }
}

}

`

EN

回答 15

Stack Overflow用户

发布于 2017-10-01 00:26:35

只需在从intent获取数据后添加此signIn()方法。

代码语言:javascript
运行
复制
Intent signInIntent=Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
mGoogleApiClient.clearDefaultAccountAndReconnect(); 
票数 15
EN

Stack Overflow用户

发布于 2018-10-31 13:16:05

您需要从google客户端注销该用户。

代码语言:javascript
运行
复制
public void signOut() {
   mAuth.signOut();
   mGoogleSignInClient.signOut();
   LoginManager.getInstance().logOut();
}

哪里

代码语言:javascript
运行
复制
private FirebaseAuth mAuth;
private GoogleSignInClient mGoogleSignInClient;

代码语言:javascript
运行
复制
mGoogleSignInClient = GoogleSignIn.getClient(this, gso);
mAuth = FirebaseAuth.getInstance();
票数 14
EN

Stack Overflow用户

发布于 2020-09-06 20:37:38

你只需清除预签帐户即可。为此,在signIn()函数下添加以下代码作为第一行: mGoogleSignInClient.signOut();

代码语言:javascript
运行
复制
 private void signIn() {
    // clearing previous signin caches
       mGoogleSignInClient.signOut();

    //getting the google signin intent
    Intent signInIntent = mGoogleSignInClient.getSignInIntent();
    //starting the activity for result
    startActivityForResult(signInIntent, RC_SIGN_IN);
}
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36659753

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档