1、谷歌最新登录接入官方文档地址:https://developer.android.com/identity/sign-in/credential-manager-siwg?hl=zh-cn
2、配置远程依赖库:
implementation "androidx.credentials:credentials:1.2.2" implementation "androidx.credentials:credentials-play-services-auth:1.2.2" implementation "com.google.android.libraries.identity.googleid:googleid:<latest version>"
3、安卓x的appCompat库也是必须的,但是文档上面没有讲,看你自己用那个版本吧,我这边用的下方这个:
implementation 'androidx.appcompat:appcompat:1.3.1'
4、去Google API 控制台创建项目:
https://console.cloud.google.com/apis/credentials?invt=Ablu1Q&project=global-doodad-442105-r8
5、点下方这个位置创建:
5.1、继续创建
5.2、点击左侧红圈部分:
5.3、找到刚才创建的项目:
5.4、选择外部,然后创建:
5.5、添加应用名称,邮箱,以及应用icon:
5.6、开发者联系信息写一下,如果公司有自己的用户隐私协议网址也可以在这里填上,我这里测试的就没写了:
5.7、点击保存并继续,点击下方:
5.8、点击保存:
5.9、点击左侧客户端,创建客户端:
5.10、填写应用名称,包名,以及签名证书指纹(不知道怎么获取签名指纹的注意填写那里有提示)
5.11、点击保存,会生成一个ID:
5.12、然后用同样的流程创建一个web应用:
5.13、最终结果如下:
5.14、注意点
不管是授权登录还是一键登录都需要使用Web客户端ID才能成功,因为使用 Android 客户端ID测试(失败),推荐用使用Web方式登入。官方文档在官方文档说明了 必须要用Web客户端ID 才可以
应用上线后(可以先提交一个内部测试应用,不用官方审核)在google play中获取Google生成的SHA-1 再根据这个值在Google Cloud 中创建一个Android Aouth客户端ID 不然google会一直返回 10。
6、接入登录:
6.1、登录初始化,setServerClientId就是上方创建应用的ID:
android.os.CancellationSignal cancellationSignal; GetCredentialRequest request; GetGoogleIdOption googleldOption; CredentialManager credentialManager;
private void initLogin(){ googleldOption = new GetGoogleIdOption.Builder() //将 setFilterByAuthorizedAccounts 参数设置为 true。如果没有可用的凭据 //,请再次调用该 API 并将 setFilterByAuthorizedAccounts 设置为 false .setFilterByAuthorizedAccounts(false) .setAutoSelectEnabled(true) .setServerClientId(XyConfig.qudao_appid) .build(); request = new GetCredentialRequest.Builder() .addCredentialOption(googleldOption) .build(); cancellationSignal = new android.os.CancellationSignal(); cancellationSignal.setOnCancelListener(new CancellationSignal.OnCancelListener() { @Override public void onCancel() { } }); }
6.2、拉起登录,callback是自定义的可以忽略:
public void login(Activity mActivity, UserListener mUserListener, YZYCallback callback) { credentialManager = CredentialManager.Companion.create(mActivity); credentialManager.getCredentialAsync( mActivity, request, cancellationSignal, Executors.newSingleThreadExecutor(), new CredentialManagerCallback<GetCredentialResponse, GetCredentialException>() { @Override public void onResult(GetCredentialResponse result) { handleSignIn(result,mUserListener,callback); } @Override public void onError(GetCredentialException e) { LogUtil.e("Error getting(or preparing)credential:" + e); } }); }
6.3:登录返回数据解析:
private void handleSignIn(GetCredentialResponse result,UserListener mUserListener,YZYCallback callback) { Credential credential = result.getCredential(); if (credential instanceof PublicKeyCredential) { String responseJson = ((PublicKeyCredential) credential).getAuthenticationResponseJson(); } else if (credential instanceof PasswordCredential) { String userName = ((PasswordCredential) credential).getId(); String password = ((PasswordCredential) credential).getPassword(); } else if (credential instanceof CustomCredential) { if (GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL.equals(credential.getType())) { callback.onSuccess(); GoogleIdTokenCredential googleIdTokenCredential = GoogleIdTokenCredential.Companion.createFrom(((CustomCredential) credential).getData()); String idToken = googleIdTokenCredential.getIdToken(); try { JSONObject googleloginInfoReturn = new JSONObject(); uid=googleIdTokenCredential.getId(); String name=googleIdTokenCredential.getDisplayName(); googleloginInfoReturn.put("id",uid); googleloginInfoReturn.put("name", name); googleloginInfoReturn.put("phto", googleIdTokenCredential.getProfilePictureUri()); googleloginInfoReturn.put("token", idToken); LogUtil.e("google handleSignIn googleloginInfoReturn:"+googleloginInfoReturn.toString()); XYUserInfo userInfo = new com.xy.mid_common.bean.XYUserInfo(uid, name, "", "", idToken, ""); mUserListener.loginSuccess(userInfo); } catch (JSONException e) { e.printStackTrace(); } } else { LogUtil.e("google Unexpected type of credentia 111"); } } else { LogUtil.e("google Unexpected type of credentia 222"); } }
7、登出:
public void loginOut(){ ClearCredentialStateRequest clearCredentialStateRequest= new ClearCredentialStateRequest(); android.os.CancellationSignal cancellationSignal=new CancellationSignal(); cancellationSignal.setOnCancelListener(new CancellationSignal.OnCancelListener() { @Override public void onCancel() { LogUtil.e("GoogleLoginOut onCancel"); } }); if(credentialManager!=null) { credentialManager.clearCredentialStateAsync( clearCredentialStateRequest, cancellationSignal, Executors.newSingleThreadExecutor(), new CredentialManagerCallback<Void, ClearCredentialException>() { @Override public void onResult(Void result) { LogUtil.e("GoogleLoginOut onSuccess"); } @Override public void onError(ClearCredentialException e) { } }); } }
8. 大家后面有 SDK问题可以加QQ群: 623257187,大家相互讨论,相互进步