zoukankan      html  css  js  c++  java
  • 通过BroadcastReceiver自动获取短信验证码

    在使用App的时候,经常需要接收短信验证码进行身份验证,有的App在收到短信后,能够自动在需要填写验证码的地方自动填写验证码,这样的话就不需要手动再填写,很好的提升用户体验。

    如何实现这个功能呢?我们通常会想到通过注册广播来实现。实现步骤如下:

    首先,需要申请监控短信接收权限以及读取短信权限

    <uses-permission android:name="android.permission.RECEIVE_SMS"/>
        <uses-permission android:name="android.permission.READ_SMS"/>

    然后,写一个类继承BroadcastReceiver

    public class SmsBroadcastReceiver extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            Bundle bundle = intent.getExtras();
            if(bundle != null){         
                Object[] datas = (Object[]) bundle.get("pdus");
                for(Object data : datas){
                    byte[] sms = (byte[]) data;
                    SmsMessage message = SmsMessage.createFromPdu(sms);  
                    // 发送人号码  
                    String number = message.getOriginatingAddress(); 
                    // 短信内容  
                    String content = message.getMessageBody();  
                    // 发送时间  
                    Date date = new Date(message.getTimestampMillis());  
                    String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()).format(date);  
    
                    Log.e("Receiver", "发送号码:" + number + 
                            " 发送内容:" + content + 
                            " 发送时间" + time);            
                }
            }
        }
    }

    接下来注册广播,注册的方法有两种:
    (1)在AndroidManifest.xml中注册

    <receiver android:name="com.example.smstest.SmsBroadcastReceiver">
                <intent-filter android:priority="999">
                    <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
                </intent-filter>
            </receiver>

    这里的priority数值越大,优先级越高。

    (2)使用Java代码进行注册

    IntentFilter filter = new IntentFilter();    filter.addAction("android.provider.Telephony.SMS_RECEIVED");
             registerReceiver(new SmsBroadcastReceiver(), filter);

    在MainActivity的onCreate()中进行注册,就可以通过日志查看接收到的短信了。日志如下:
    日志

    在onReceive中,为什么获取短信内容是bundle.get(“pdus”)呢?
    感兴趣的可以看下这篇博客:Android短信接收过程源码分析(原) http://blog.csdn.net/u010961631/article/details/12705541

    好,现在功能看起来一切OK,真的没问题么?
    实际上因为短信的广播是有序广播,假如有其他应用先捕获广播并终止传递,那么我们就永远也收不到这条短信变化的广播了。

    还有没有其他办法呢?答案是肯定的,解决问题的办法不会只有一种,我们还可以通过ContentObserver来监听短信。具体怎么实现呢,下篇博客接着讲。

  • 相关阅读:
    啥叫ORM
    git reset --hard HEAD^ 在cmd中执行报错
    windows下生成文件目录树
    批量解决win10图标上有两个蓝色箭头的方法
    Sublime Text 3 安装包
    Sublime Text 3 部分安装过程记录
    sense8影评摘抄
    如何取消chrome的自动翻译
    把本地仓库同步到github上去
    关于PDF阅读器
  • 原文地址:https://www.cnblogs.com/lishbo/p/9956041.html
Copyright © 2011-2022 走看看