问题分享

华为开发者论坛上有开发者向我们咨询:想要实现应用自动填写短信验证码,但如果将手机短信"验证码保护"功能打开,app就不能自动填写验证码,有没有什么方法能获取到短信验证码?问题链接:

https://developer.huawei.com/consumer/cn/forum/topicview?tid=0202342491084740374&fid=18?ha_source=hms1

android自动填充短信验证码 app自动填充验证码_账号服务

 

我们知道,华为对隐私保护高度重视,用户的隐私安全一直是华为的首要关注。为了保护用户的支付安全和帐号安全,华为EMUI系统提供了验证码短信的保护功能,该功能可以阻止第三方应用获取用户收到的验证码短信。那么正如开发者提问的那样,开启短信验证码保护后app不能自动填写验证码,华为有没有提供什么方法在开启短信验证码保护的状态下,仍然可以自动获取到验证码并自动填写的呢?

解决方案

华为帐号服务(HUAWEI Account Kit)为开发者提供了一项短信自动读取能力,可以帮助应用自动读取验证码,实现应用自动或者被授权读取短信验证码,提高验证效率,优化用户体验。

android自动填充短信验证码 app自动填充验证码_验证码_02

以下是短信自动读取能力的一种场景:

如果应用需要用户输入手机号并通过短信验证码核实用户身份,可以通过集成ReadSmsManager服务,使应用在无需申请短信读取权限的前提下,具备自动读取针对该应用的短信验证码的能力。用户在验证过程中可以省去手动输入短信验证码的操作,整个获取短信验证码的流程可简化成:用户点击获取验证码→收到短信→自动填充→用户点击,将会更加优化用户体验。

自动读取短信验证码功能关键开发操作指导

1.应用调用ReadSmsManager.start(Activity activity)方法请求开启短信读取服务。

Task<Void> task = ReadSmsManager.start(MainActivity.this);
task.addOnCompleteListener(new OnCompleteListener<Void>() {
    @Override
    public void onComplete(Task<Void> task) {
        if (task.isSuccessful()) {
            // 开启服务成功,可以继续后续流程
            doSomethingWhenTaskSuccess();
        }
    }
});

2. 应用客户端将手机号发送给应用服务器,应用服务器生成一条验证消息,并通过SMS将其发送到用户的手机号。此部分由开发者自行完成。

3. 当用户的设备接收到验证消息时,HMS Core(APK)会显式地向应用客户端发送广播,intent里面包含消息的文本。应用客户端可以使用广播接收此验证消息。应用客户端读取到验证消息的文本后,可以使用正则表达式或其他逻辑从消息中获得验证码,验证码的格式由应用客户端和服务器自行定义。

public class MySMSBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle bundle = intent.getExtras();
        if (bundle != null && ReadSmsConstant.READ_SMS_BROADCAST_ACTION.equals(intent.getAction())) {
            Status status = bundle.getParcelable(ReadSmsConstant.EXTRA_STATUS);
            if (status.getStatusCode() == CommonStatusCodes.TIMEOUT) {
                // 服务已经超时,未读取到符合要求的短信,服务关闭
                doSomethingWhenTimeOut();
            } else if (status.getStatusCode() == CommonStatusCodes.SUCCESS) {
                if (bundle.containsKey(ReadSmsConstant.EXTRA_SMS_MESSAGE)) {
                    // 服务读取到了符合要求的短信,服务关闭
                    doSomethingWhenGetMessage(bundle.getString(ReadSmsConstant.EXTRA_SMS_MESSAGE));
                }
            }
        }
    }
}

除了以上自动读取短信验证码能力以外,华为帐号服务还提供了授权读取短信验证码的能力,使应用在无需申请短信读取权限的前提下,可以通过用户授权方式来自动获取针对应用的短信验证码。用户在验证过程中可以省去手动输入短信验证码的操作,优化用户体验。