Android自定义控件实现短信验证码自动填充

yizhihongxing

我们来详细讲解“Android自定义控件实现短信验证码自动填充”的完整攻略。本攻略带有两条示例说明。

1. 实现思路

实现短信验证码自动填充的思路如下:

  1. 创建一个自定义控件,继承自EditText。

  2. 在该控件中添加一个倒计时按钮,用于触发发送短信验证码。

  3. 在控件通过监听短信的方式自动填充短信验证码到EditText中。

  4. 控制短信验证码填充后,自动跳转到下一个输入框。

2. 示例一

这里提供一种基于 BroadcastReceiver 实现自动填充短信验证码的示例。

2.1 创建自定义控件

首先创建一个自定义控件,继承自EditText,添加倒计时按钮:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <EditText
        android:id="@+id/et_code"
        android:textSize="20sp"
        android:hint="输入验证码"
        android:inputType="number"
        android:textColorHint="@color/color_code_hint"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="10dp"
        android:layout_marginTop="10dp"/>

    <Button
        android:id="@+id/btn_code"
        android:text="获取验证码"
        android:textSize="20sp"
        android:textColor="@color/color_code_btn"
        android:background="@drawable/btn_bg_code"
        android:layout_width="160dp"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_marginRight="10dp"/>

</RelativeLayout>

2.2 注册 BroadcastReceiver

在自定义控件中注册 BroadcastReceiver,用于监听短信:

private void registerReceiver() {
    IntentFilter intentFilter = new IntentFilter(SMS_RECEIVED_ACTION);
    broadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(SMS_RECEIVED_ACTION)) {
                Bundle bundle = intent.getExtras();
                if (bundle != null) {
                    Object[] pdus = (Object[]) bundle.get("pdus");
                    String code = getCodeFromMessage(pdus);
                    if (!TextUtils.isEmpty(code)) {
                        etCode.setText(code);
                        etCode.setSelection(code.length());
                        clearFocus();
                        etCode.clearFocus();
                    }
                }
            }
        }
    };
    getContext().registerReceiver(broadcastReceiver, intentFilter);
}

2.3 解析收到的短信

在 BroadcastReceiver 中解析收到的短信中的验证码:

private String getCodeFromMessage(Object[] pdus) {
    String code = "";
    for (Object pdu : pdus) {
        SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) pdu);
        String body = smsMessage.getMessageBody();
        Pattern pattern = Pattern.compile("\\d{6}");
        Matcher matcher = pattern.matcher(body);
        if (matcher.find()) {
            code = matcher.group(0);
        }
    }
    return code;
}

2.4 发送短信验证码

在控件中添加倒计时按钮并实现发送短信验证码功能:

btnCode.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        countDown();
        sendCode();
    }
});

private void sendCode() {
    SmsManager smsManager = SmsManager.getDefault();
    smsManager.sendTextMessage(phoneNumber, null, messageContent, null, null);
}

2.5 注销 BroadcastReceiver

最后在自定义控件销毁时注销 BroadcastReceiver:

@Override
protected void onDetachedFromWindow() {
    super.onDetachedFromWindow();
    if (broadcastReceiver != null) {
        getContext().unregisterReceiver(broadcastReceiver);
    }
}

3. 示例二

这里提供一种基于 Service 实现自动填充短信验证码的示例,相对来说比 BroadcastReceiver 适用范围更广。

3.1 创建Service

首先创建一个继承自 Service 的类,用于监听短信并通过广播发送给自定义控件:

public class SmsService extends Service {

    private SmsReceiver smsReceiver;

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        smsReceiver = new SmsReceiver();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("android.provider.Telephony.SMS_RECEIVED");
        registerReceiver(smsReceiver, intentFilter);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        unregisterReceiver(smsReceiver);
    }

    private class SmsReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            Bundle bundle = intent.getExtras();
            if (bundle != null) {
                Object[] pdus = (Object[]) bundle.get("pdus");
                if (pdus != null) {
                    for (Object pdu : pdus) {
                        SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) pdu);
                        String body = smsMessage.getMessageBody();
                        String sender = smsMessage.getOriginatingAddress();
                        if (sender.equals("106xxxxxxx")) {
                            Intent codeIntent = new Intent("code");
                            codeIntent.putExtra("code", getCodeFromMessage(body));
                            sendBroadcast(codeIntent);
                        }
                    }
                }
            }
        }

        private String getCodeFromMessage(String body) {
            String code = "";
            Pattern pattern = Pattern.compile("\\d{6}");
            Matcher matcher = pattern.matcher(body);
            if (matcher.find()) {
                code = matcher.group(0);
            }
            return code;
        }

    }

}

3.2 执行 Service

在自定义控件中执行 Service:

btnCode.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        countDown();
        Intent intent = new Intent(getContext(), SmsService.class);
        startService(intent);
    }
});

3.3 监听广播

在自定义控件中监听广播并填充短信验证码:

private BroadcastReceiver codeReceiver;

private void registerReceiver() {
    codeReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String code = intent.getStringExtra("code");
            if (!TextUtils.isEmpty(code)) {
                etCode.setText(code);
                etCode.setSelection(code.length());
                clearFocus();
                etCode.clearFocus();
            }
        }
    };
    IntentFilter filter = new IntentFilter("code");
    getContext().registerReceiver(codeReceiver, filter);
}

@Override
protected void onDetachedFromWindow() {
    super.onDetachedFromWindow();
    if (codeReceiver != null) {
        getContext().unregisterReceiver(codeReceiver);
    }
}

4. 总结

本文给出了两种示例,分别是基于 BroadcastReceiver 和 Service 实现自动填充短信验证码。其中,基于 BroadcastReceiver 的实现比较简单,但是仅能在应用前台或者 Activity 可见时使用;基于 Service 的实现比较复杂,但是可以在应用后台或者 Activity 不可见时使用。根据项目需求和实现难度的不同,选择合适的方式实现自动填充短信验证码。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android自定义控件实现短信验证码自动填充 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • GO开发编辑器安装图文详解

    关于“GO开发编辑器安装图文详解”的完整攻略和示例说明,以下是具体步骤: 首先,下载安装Visual Studio Code 打开 https://code.visualstudio.com/ 下载Visual Studio Code。 根据操作系统的不同选择不同的下载方式。 下载完成后,按照安装程序提示进行安装。 其次,安装GO的插件 打开Visual S…

    GitHub 2023年5月16日
    00
  • Golang项目在github创建release后自动生成二进制文件的方法

    首先,创建一个Golang项目,并在Github上创建一个对应的仓库。 其次,在本地编写Golang程序并进行测试,确保程序可以正常运行并编译通过。 接下来,需要将本地代码push到Github上的仓库中。在命令行中进入项目所在目录,运行以下命令: git add . git commit -m “initial commit” git push 然后,切换…

    GitHub 2023年5月16日
    00
  • Flutter 如何正确显示SnackBar

    Flutter 中的 SnackBar 是一种轻量级的用户交互反馈工具,用于向用户显示简短的消息或操作结果。本篇攻略将详细讲解如何正确地使用 SnackBar。 1. 显示 SnackBar 在 Flutter 中,显示 SnackBar 最常见的方式是使用 Scaffold 的 ScaffoldMessengerState.showSnackBar() 方…

    GitHub 2023年5月16日
    00
  • Linux系统下Git操作命令整理

    下面我将为你讲解“Linux系统下Git操作命令整理”的完整攻略。 Git基础命令 初始化Git 首先,我们需要进入到要管理的项目目录下,然后执行git init指令来初始化Git: cd /path/to/your/project git init 添加文件 要把文件添加到Git进行版本控制,我们需要执行git add指令: git add file1 f…

    GitHub 2023年5月16日
    00
  • 实用的Go语言开发工具及使用示例

    实用的Go语言开发工具及使用示例 Go语言被广泛应用于Web应用、分布式系统和云计算等领域。在进行Go语言开发时,使用合适的开发工具可以提高开发效率,本文将介绍几款实用的Go语言开发工具及使用示例,供开发者参考。 1. GoLand GoLand是一款由JetBrains开发的集成开发环境(IDE),专门用于Go语言开发。该IDE集成了丰富的代码编辑、调试、…

    GitHub 2023年5月16日
    00
  • 使用next.js开发网址缩短服务的方法

    下面就来详述一下使用Next.js开发网址缩短服务的完整攻略。 1. 准备工作 在开始Next.js开发之前,我们需要先安装好Node.js,以及npm包管理工具。具体安装方法可以通过官网进行了解。 2. 创建Next.js应用程序 使用以下命令创建一个新的Next.js应用程序: npx create-next-app url-shortener 即可在当…

    GitHub 2023年5月16日
    00
  • 微信小程序生成二维码的示例代码

    当你在开发微信小程序时,需要生成二维码来引导用户扫描进入小程序,以下是生成二维码的完整攻略: 步骤一:导入Qrcode.js 导入Qrcode.js可以帮助你轻松生成二维码,你可以在github上下载该库https://github.com/davidshimjs/qrcodejs。 步骤二:生成二维码 示例一: <!–在HTML中新建一个容器,用于…

    GitHub 2023年5月16日
    00
  • Linux 和Windows 安装Git 步骤详细介绍

    下面我就为您介绍一下如何在 Linux 和 Windows 系统上安装 Git。 Linux 安装 Git 步骤一:检查是否已安装 Git 在 Linux 系统中,运行以下命令检查是否已经安装 Git: $ git –version 如果 Git 已经安装,会显示 Git 的版本号。如果没有安装,则会提示找不到 git 命令。 步骤二:安装 Git 如果程…

    GitHub 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部