应用可以调用此接口登录用户的华为帐号,登录成功后应用可获取用户的华为帐号信息。
开发者提前在华为开发者联盟申请华为帐号服务。用户在应用界面选择华为帐号登录方式时,应用调用此接口拉起华为帐号登录和登录授权页面,用户登录成功并进行授权后,应用即可获得用户的华为帐号信息。
● 调用本接口前,必须已经提前为应用申请华为帐号服务,参见申请帐号服务。
● 本接口当前支持的国家或地区请参见华为帐号登录中的“注意事项”。
- HMSAgent.Hwid.signIn(boolean forceLogin, SignInHandler handler);
| 参数名称 | 必选(M)/可选(O) | 类型 | 参数说明 |
|---|---|---|---|
| forceLogin | M | boolean | 是否强制登录和授权。 ● true:如果华为帐号在当前设备未登录会拉起登录界面,如果未授权会拉起授权界面。 ● false:如果已经登录授权直接返回帐号信息,否则返回失败错误码。 |
| handler | M | SignInHandler | 接口调用后的回调结果,通过此回调实例回调给应用。回调结果中包含的具体参数参见结果回调。 |
- public interface SignInHandler {
- /**
- *登录结果回调
- * @param rtnCode结果码
- * @param hwidInfo登录结果
- */
- void onResult(int rtnCode, SignInHuaweiId hwidInfo);
- }
| 参数名称 | 必选(M)/可选(O) | 类型 | 参数说明 |
|---|---|---|---|
| rtnCode | M | int | 回调结果中登录结果的返回码,应用可以根据返回码判断登录是否成功或失败后如何处理,具体返回码处理参见返回码。 |
| hwidInfo | M | SignInHuaweiId | 登录结果的对象信息。 获取hwidInfo对象中参数值时,请使用“对象名称.get参数名称()”的方式,参数名首字母大写。例如,“hwidInfo.getOpenId()”为登录成功后用户的唯一标识。 |
| 参数名称 | 必选(M)/可选(O) | 类型 | 参数说明 |
|---|---|---|---|
| openId | M | string | 应用内用户的唯一标识。 如果应用对用户的openId安全性要求较高,不希望由应用客户端直接保存openId,可以先获取接口返回的accessToken再获取openId,具体参见accessToken参数的说明。 |
| disPlayName | M | string | 用户华为帐号的用户昵称,用于在开发者应用中显示。 |
| photoUrl | M | string | 如果用户的华为帐号设置了头像,则返回头像的url,否则返回null。 |
| accessToken | M | string | 用户的accessToken。 如果应用对用户的唯一标识安全性要求较高,必须由应用的服务端保存用户标识,可以由应用的服务端通过accessToken从华为服务器获取用户的openId或unionId。具体方法请参见获取用户帐号信息接口或accessToken鉴权接口。 注意: accessToken首次获取成功后会保存在HMS缓存中,最长有效期为1小时。当再次调用signIn接口时如果HMS缓存中的accessToken仍然有效,则HMS SDK会直接返回HMS缓存中的accessToken。也就是说,应用获取到的accessToken可能有效期已小于1小时,因此为了防止accessToken失效请应用获取后立刻使用。如果应用发现accessToken已超过有效期(NSP_STATUS=6),需要再次调用signIn接口重新获取accessToken。 |
| unionId | O | string | 用户的unionId,即用户在同一个开发者帐号下所有应用中的唯一标识。 unionId和openId的区别在于,如果开发者帐号下管理了多个应用,针对同一个华为帐号,不同的应用返回的openId值不同,但返回的unionId相同。 如果开发者需要在不同应用中共享同一个华为帐号的用户信息,可以使用unionId作为用户标识。 使用unionId作为用户标识需要满足以下所有条件,如果任一不满足则不会返回。 ● 应用集成HMS SDK 2.6.1以及更高版本。 ● HMS Core(APK)版本为2.6.1以及更高版本(相关配置指导请参见配置工程文件)。 ● 应用申请帐号服务时启用了UnionId(参见申请帐号服务)。 说明: 如果应用对unionId的保存有较高安全性要求,不能由应用的客户端保存,可以由应用的服务端根据accessToken从华为服务器直接获取unionId,具体方法请参见accessToken鉴权接口。 |
| 类型 | 返回码常量 | 返回码值 | 返回码说明 | 处理建议 |
|---|---|---|---|---|
| 通用返回码 | 参见通用返回码。 | |||
| 业务返回码 | HuaweiIdStatusCodes.SIGN_IN_SUCCESS | 0 | 登录授权成功。 | |
| HuaweiIdStautsCodes.SIGN_IN_UNLOGIN | 2001 | 华为帐号未登录。forceLogin传入false时,如果用户在当前设备未登录华为帐号,会返回该错误码。 | 应用需要根据应用实际情况确认是否需要重新调用signIn接口(forceLogin传入true)拉起华为帐号登录页面。 | |
| HuaweiIdStatusCodes.SIGN_IN_AUTH | 2002 | 登录未授权。forceLogin传入false时,如果用户在当前设备未授权,会返回该错误码。 | 应用需要根据应用实际情况确认是否需要重新调用signIn接口(forceLogin传入true)拉起华为登录授权页面。 | |
| HwIDConstant.RETCODE.SIGN_IN_PARAMS_ERROR | 2003 | 授权成功后返回系统内部错误。 | 请联系华为技术支持定位。 | |
| HuaweiIdStautsCodes.SIGN_IN_NETWORK_ERROR | 2007 | 登录过程中请求华为网关服务器时网络异常。 | 检查网络后重试。 | |
| HuaweiIdStautsCodes.ERROR_SIGN_IN_AUTH_SERVER_FAILED | 2009 | 华为网关服务器内部异常。 | 请联系华为技术支持定位。 | |
| HuaweiIdStatusCodes.SIGN_IN_NETWORK_ERROR | 2005 | 除以上错误以外的其他错误。 | 请联系华为技术支持定位。 | |
- private voidsignIn(booleanforceLogin) {
- HMSAgent.Hwid.signIn(forceLogin,newSignInHandler() {
- @Override
- public voidonResult(intrtnCode, SignInHuaweiId signInResult) {
- if(rtnCode == HMSAgent.AgentResultCode.HMSAGENT_SUCCESS&& signInResult !=null) {
- //可以获取帐号的openid,昵称,头像at信息
- showLog("signIn successful=========");
- showLog("Nickname:"+ signInResult.getDisplayName());
- showLog("openid:"+ signInResult.getOpenId());
- showLog("accessToken:"+ signInResult.getAccessToken());
- showLog("Head pic URL:"+ signInResult.getPhotoUrl());
- showLog("unionID:"+ signInResult.getUnionId());
- }else{
- /*根据错误码处理异常 */
- showLog("signIn---error: "+ rtnCode);
- }
- }
- });
- }