目录

接口功能

应用可以调用此接口登录用户的华为帐号,登录成功后应用可获取用户的华为帐号信息。

调用场景

开发者提前在华为开发者联盟申请华为帐号服务。用户在应用界面选择华为帐号登录方式时,应用调用此接口拉起华为帐号登录和登录授权页面,用户登录成功并进行授权后,应用即可获得用户的华为帐号信息。

接口约束

● 调用本接口前,必须已经提前为应用申请华为帐号服务,参见申请帐号服务。
● 本接口当前支持的国家或地区请参见华为帐号登录中的“注意事项”。

调用方法

  1. HMSAgent.Hwid.signIn(boolean forceLogin, SignInHandler handler);

请求参数

参数名称必选(M)/可选(O)类型参数说明
forceLoginMboolean是否强制登录和授权。
● true:如果华为帐号在当前设备未登录会拉起登录界面,如果未授权会拉起授权界面。
● false:如果已经登录授权直接返回帐号信息,否则返回失败错误码。
handlerMSignInHandler接口调用后的回调结果,通过此回调实例回调给应用。回调结果中包含的具体参数参见结果回调。

结果回调

  1. public interface SignInHandler {
  2. /**
  3. *登录结果回调
  4. * @param rtnCode结果码
  5. * @param hwidInfo登录结果
  6. */
  7. void onResult(int rtnCode, SignInHuaweiId hwidInfo);
  8. }
参数名称必选(M)/可选(O)类型参数说明
rtnCodeMint回调结果中登录结果的返回码,应用可以根据返回码判断登录是否成功或失败后如何处理,具体返回码处理参见返回码。
hwidInfoMSignInHuaweiId登录结果的对象信息。
获取hwidInfo对象中参数值时,请使用“对象名称.get参数名称()”的方式,参数名首字母大写。例如,“hwidInfo.getOpenId()”为登录成功后用户的唯一标识。

SignInHuaweiId

参数名称必选(M)/可选(O)类型参数说明
openIdMstring应用内用户的唯一标识。
如果应用对用户的openId安全性要求较高,不希望由应用客户端直接保存openId,可以先获取接口返回的accessToken再获取openId,具体参见accessToken参数的说明。
disPlayNameMstring用户华为帐号的用户昵称,用于在开发者应用中显示。
photoUrlMstring如果用户的华为帐号设置了头像,则返回头像的url,否则返回null。
accessTokenMstring用户的accessToken。
如果应用对用户的唯一标识安全性要求较高,必须由应用的服务端保存用户标识,可以由应用的服务端通过accessToken从华为服务器获取用户的openId或unionId。具体方法请参见获取用户帐号信息接口或accessToken鉴权接口。

注意:

accessToken首次获取成功后会保存在HMS缓存中,最长有效期为1小时。当再次调用signIn接口时如果HMS缓存中的accessToken仍然有效,则HMS SDK会直接返回HMS缓存中的accessToken。也就是说,应用获取到的accessToken可能有效期已小于1小时,因此为了防止accessToken失效请应用获取后立刻使用。如果应用发现accessToken已超过有效期(NSP_STATUS=6),需要再次调用signIn接口重新获取accessToken。

unionIdOstring用户的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_SUCCESS0登录授权成功。
HuaweiIdStautsCodes.SIGN_IN_UNLOGIN2001华为帐号未登录。forceLogin传入false时,如果用户在当前设备未登录华为帐号,会返回该错误码。应用需要根据应用实际情况确认是否需要重新调用signIn接口(forceLogin传入true)拉起华为帐号登录页面。
HuaweiIdStatusCodes.SIGN_IN_AUTH2002登录未授权。forceLogin传入false时,如果用户在当前设备未授权,会返回该错误码。应用需要根据应用实际情况确认是否需要重新调用signIn接口(forceLogin传入true)拉起华为登录授权页面。
HwIDConstant.RETCODE.SIGN_IN_PARAMS_ERROR2003授权成功后返回系统内部错误。请联系华为技术支持定位。
HuaweiIdStautsCodes.SIGN_IN_NETWORK_ERROR2007登录过程中请求华为网关服务器时网络异常。检查网络后重试。
HuaweiIdStautsCodes.ERROR_SIGN_IN_AUTH_SERVER_FAILED2009华为网关服务器内部异常。请联系华为技术支持定位。
HuaweiIdStatusCodes.SIGN_IN_NETWORK_ERROR2005除以上错误以外的其他错误。请联系华为技术支持定位。

调用示例

  1. private voidsignIn(booleanforceLogin) {
  2. HMSAgent.Hwid.signIn(forceLogin,newSignInHandler() {
  3.  @Override
  4. public voidonResult(intrtnCode, SignInHuaweiId signInResult) {
  5. if(rtnCode == HMSAgent.AgentResultCode.HMSAGENT_SUCCESS&& signInResult !=null) {
  6. //可以获取帐号的openid,昵称,头像at信息
  7. showLog("signIn successful=========");
  8.      showLog("Nickname:"+ signInResult.getDisplayName());
  9.      showLog("openid:"+ signInResult.getOpenId());
  10.      showLog("accessToken:"+ signInResult.getAccessToken());
  11.      showLog("Head pic URL:"+ signInResult.getPhotoUrl());
  12.      showLog("unionID:"+ signInResult.getUnionId());
  13.      }else{
  14. /*根据错误码处理异常 */
  15. showLog("signIn---error: "+ rtnCode);
  16.      }
  17.   }
  18. });
  19. }