(出海必备)Android三方登录之Google登录

背景:之前一直做国内的项目,最近公司要做一款国外上架的app,因为海外和国内的文档,账号注册,demo测试等流程和国内大有不同,中间遇到了不少坑,在这里总结一下,有用到的小伙伴,可以借鉴下;

1.先撸官方文档

https://developers.google.com/identity/sign-in/android/sign-in

2.Google的Demo;

GitHub - googlesamples/google-services: A collection of quickstart samples demonstrating the Google APIs for Android and iOS

3.(1):注册Firebase账号 (https://console.firebase.google.com/)

(2):添加新应用

这里的json文件注意下载保存;

因为用到登录功能,SHA1还是需要的,

C:\Users\Alan>keytool -list -v -keystore

SHA1填写的位置有那么几个,如果只是为了测试google登录,在刚才添加应用的那加上就可以了。如图这样:

但是在后面又遇到了坑, 由于需要google play上架,所以先提交了测试版,加入了测试账号,可以在商店下载,下载后发现google登录不了。于是,各种撸代码找坑。。。最终的原因是,Google Play当应用上传后,一是应用本身的SHA1(应用签名),二是Google Play会为应用重新生成一个SHA1(商店的签名); 所以最终的解决方案如下:

然后,打开Google应用凭据官网 (https://console.developers.google.com/apis/credentials),将两个签名分别添加进去,测试,商店下载的app可以正常三方登录了。

然后撸代码:

1. init初始化:

//google login setting

GoogleSignInOptions googleSignInOptions = new GoogleSignInOptions

.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)

.requestId()

.requestProfile()

.requestIdToken(getString(R.string.default_web_client_id))

.requestEmail() //可以获取到邮箱信息【这一步还挺有必要,不光可以获取到邮箱信息,还会影响到下面获取性别信息】

.build();

mGoogleSignInClient = GoogleSignIn.getClient(this, googleSignInOptions);

R.String.default_web_client_id 客户端ID (很多朋友遇到 code返回10的问题,是因为下面的Web Client没有创建或者代码中google_client_id 使用的不是WebClient,代码一定要用WebClient 对应的客户端ID

2.点击登录

Intent intent = mGoogleSignInClient.getSignInIntent();

startActivityForResult(intent, CODE_SIGN_IN);

3.注册回调

@Override

protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {

super.onActivityResult(requestCode, resultCode, data);

if (requestCode == CODE_SIGN_IN && resultCode != 0) {

Task task = GoogleSignIn.getSignedInAccountFromIntent(data);

handleSignInResult(task);

} else if(requestCode == CODE_SIGN_IN) {

// ToastUtils.showShort(getResources().getString(R.string.net_error));

assert data != null;

ToastUtils.showShort( data.toString() );

}

}

4.登录成功数据回调

/**

* Google登录成功返回数据

* @param completedTask

*/

private void handleSignInResult(Task completedTask) {

try {

GoogleSignInAccount account = completedTask.getResult(ApiException.class);

// Signed in successfully, show authenticated UI.

GgOrFbUserInfo ggOrFbUserInfo = new GgOrFbUserInfo();

ggOrFbUserInfo.setAvatar(account.getPhotoUrl() == null ? "": account.getPhotoUrl().toString());

ggOrFbUserInfo.setLtype(1);

ggOrFbUserInfo.setUserId(account.getId());

ggOrFbUserInfo.setEmail(account.getEmail());

ggOrFbUserInfo.setEmailVerified(1);

ggOrFbUserInfo.setName(account.getDisplayName());

ggOrFbUserInfo.setLanguage(CommonPramsUtil.getSystemLanguage());

ggOrFbUserInfo.setFamilyName(account.getFamilyName() == null ? "" : account.getFamilyName());

ggOrFbUserInfo.setGivenName(account.getGivenName());

ggOrFbUserInfo.setRegion("zn");

login(ggOrFbUserInfo); //在这走自己后台接口

if (account.getPhotoUrl() != null) {

// Glide.with(LoginActivity.this).load(account.getPhotoUrl()).into(imgHead);

}

Log.e(TAG, "account--------------->>>" + new Gson().toJson(account));

} catch (ApiException e) {

// The ApiException status code indicates the detailed failure reason.

// Please refer to the GoogleSignInStatusCodes class reference for more information.

// failedCode.setText("获取登录信息失败" + e.getMessage());

Log.e(TAG, "signInResult:failed code=" + e.getStatusCode());

ToastUtils.showShort(e.getMessage());

}

}

5.退出登录

mGoogleSignInClient.signOut()

.addOnCompleteListener(this, new OnCompleteListener() {

@Override

public void onComplete(@NonNull Task task) {

Log.d(TAG, "signOut: -----------------------------");

// ...登出的逻辑

}

});

------------------以上就是Google登录和登出的所有步骤了-----------------------