谷歌使用g-plus最新API在android中登录和注销
我已经讨论了一些与登录和注销google plus相关的问题。而且大多数都过时了。我无法实现我真正想要的 一旦我注销,下次登录时,我希望用户选择可用的google帐户再次登录 我正在使用自定义登录和注销按钮。对于注销,我有两个案例谷歌使用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{
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();
}
});