精华内容
下载资源
问答
  • Android 自动填写验证码

    千次阅读 2016-12-28 17:00:27
    获取验证码几乎是每个应用所必备的,很多应用在用户注册的时候设置一个验证码的功能,根据手机号获取验证码的作用就是防止恶意注册。先来看一下效果图 上面的效果就是读取短信的信息,然后根据信息内容将验证码...

    获取验证码几乎是每个应用所必备的,很多应用在用户注册的时候设置一个验证码的功能,根据手机号获取验证码的作用就是防止恶意注册。先来看一下效果图
    这里写图片描述
    上面的效果就是读取短信的信息,然后根据信息内容将验证码截取出来,赋值到输入框。具体的实现过程如下:
    首先就是要读取短信,获取短信的内容,如何获取短信的内容呢,android将所有的短信信息都存入了mmssms.db中,如果要访问短信数据库里面的内容就需要一些协议了

    content://sms/inbox        收件箱 
    content://sms/sent        已发送 
    content://sms/draft        草稿 
    content://sms/outbox        发件箱 
    content://sms/failed        发送失败 
    content://sms/queued        待发送列表

    根据上面的协议以及内容我们就知道,我们需要的tent://sms/inbox这个协议,因为我们的验证码是在收件箱里面的

    cursor=MainActivity.this.managedQuery(Uri.parse("content://sms/inbox"),
                            new String[]{"_id", "address", "read", "body"},
                            "address=? and read=?", new String[]{"10690XXXXX", "0"}, "_id desc");//按id排序
                    if (cursor!=null&&cursor.getCount()>0){
                        ContentValues values=new ContentValues();
                        values.put("read", "1");//修改短信为已读模式
                        cursor.moveToNext();
                        int smsbodyColumn=cursor.getColumnIndex("body");
                        String smsBody=cursor.getString(smsbodyColumn);
                        }

    要注意10690XXXXX这个是你接收验证码的号码,也就是发送验证码那一方的号码,而不是本人的手机号码。
    这里写图片描述
    下面是数据库的字段以及说明

    _id               一个自增字段,从1开始 
    thread_id    序号,同一发信人的id相同 
    address      发件人手机号码 
    person        联系人列表里的序号,陌生人为null 
    date            发件日期 
    protocol      协议,分为: 0 SMS_RPOTO, 1 MMS_PROTO  
    read           是否阅读 0未读, 1已读  
    status         状态 -1接收,0 complete, 64 pending, 128 failed 
    type 
        ALL    = 0; 
        INBOX  = 1; 
        SENT   = 2; 
        DRAFT  = 3; 
        OUTBOX = 4; 
        FAILED = 5; 
        QUEUED = 6; 
    body                     短信内容 
    service_center     短信服务中心号码编号 
    subject                  短信的主题 
    reply_path_present     TP-Reply-Path 
    locked

    根据数据库中的字段以及说明我们就可以知道上面代码的作用了,上面的代码作用就是读取短信内容的。获取到短信内容以后我们还不算完成任务,因为我需要的是验证码,当然了要想获取验证码短信的获取是必不可少的,因为我们的验证码就包含在短信的内容里面的,所以我们要把验证码从短信内容里面分离出来,如何分离呢?

    public String getVerificationCode(String str){
            Pattern pattern = Pattern.compile("(\\d{6})");
            Matcher matcher=pattern.matcher(str);
            String verificationCode;
            if (matcher.find()) {
                verificationCode = matcher.group(0);
                return verificationCode;
            }
            return "";
        }

    就是根据验证码的位数来判断,Pattern.compile(“(\d{6})”)表示连续6位的数字,可以在这修改成自己想要的格式,如四位验证码就将6替换为4即可。我们还可以看到matcher.find(),这个find()是什么呢?find()方法是部分匹配,是查找输入串中与模式匹配的子串,而我们平时用的matches()则是全部查询匹配。还有就是matcher.group(0)这又是怎么回事呢?这就是正则表达式里面的组,关于组我们来说一下是什么意思

     String str = "name LiuYongxiang Robert!";
            Pattern pattern = Pattern.compile("Liu(Yong)(xiang)");
            Matcher matcher = pattern.matcher(str);
            while (matcher.find()) {
                System.out.println("matcher.group(0)---------->" + matcher.group(0));
                System.out.println("matcher.group(1)---------->" + matcher.group(1));
                System.out.println("matcher.group(2)---------->" + matcher.group(2));
            }

    输出的的内容为
    这里写图片描述
    想必大家一看便知这组的作用了。Pattern.compile(“Liu(Yong)(xiang)”)这个方法里面的一个()代表一个组。还有就是LiuYongxiang这个内容之间是不能有空格的,除非你匹配的时候也有空格,所要的内容和要匹配的内容完全一致才能匹配成功。前面讲了如何获取短信内容和验证码,但是还要注意,我们要获取的短信的内容可不是之前的,而是我们点击获取验证码后获取的短信内容。这一点想必大家都清楚。这样的话我们就需要一个内容观察者,时时刻刻监视着短信内容的变化,而这个观察者就是ContentObserver。继承ContentObserver要重写onChange这个方法,这个方法的作用就是监听短信内容是否发生了变化。

    class SmsContentObserver extends ContentObserver {
            private Cursor cursor;
            public SmsContentObserver(Handler handler) {
                super(handler);
            }
            @Override
            public void onChange(boolean selfChange) {
                super.onChange(selfChange);
                //读取收件箱中指定号码的短信
                try {
                    cursor=MainActivity.this.managedQuery(Uri.parse("content://sms/inbox"),
                            new String[]{"_id", "address", "read", "body"},
                            "address=? and read=?", new String[]{"10690XXXXX", "0"}, "_id desc");//按id排序
                    if (cursor!=null&&cursor.getCount()>0){
                        ContentValues values=new ContentValues();
                        values.put("read", "1");//修改短信为已读模式
                        cursor.moveToNext();
                        int smsBodyColumn=cursor.getColumnIndex("body");
                        String smsBody=cursor.getString(smsBodyColumn);
                        final String code = getVerificationCode(smsBody);
                        Message msg = new Message();
                        msg.what = VERIFICATION_CODE;
                        msg.obj = code;
                        mHandler.sendMessage(msg);
                    }
                }catch (Exception e){
    
                }
                //在用managedQuery的时候,不能主动调用close()方法,否则在Android 4.0+的系统上会发生崩溃
                if (Build.VERSION.SDK_INT<14){
                    cursor.close();
                }
            }
        }

    有了这些还是不够的,既然是观察者当然少不了注册,下面是注册的代码

     SmsContentObserver smsContentObserver = new SmsContentObserver(mHandler);
     Uri smsUri = Uri.parse("content://sms");
     getContentResolver().registerContentObserver(smsUri, true, smsContentObserver);

    点击下载源码

    如有疑问欢迎留言,如果感觉对您有帮助还请给个好评再走。

    展开全文
  • 目前在某为,小蓝小绿手机上存在验证码安全保护的功能,该功能开启时可能会导致应用自动读取验证码内容的失败,具体页面如下: 该页面无法通过Intent跳转,(某为是这样,小蓝小绿没试过估计也是),通过...

    目前在某为,小蓝小绿手机上存在验证码安全保护的功能,该功能开启时可能会导致应用自动读取验证码内容的失败,具体页面如下:

    在这里插入图片描述

    该页面无法通过Intent跳转,(某为是这样,小蓝小绿没试过估计也是),通过AndroidManifest.xml分析发现此Activity设置的permission,而此权限是signatureOrSystem级别,因此普通APP无法在AndroidManifest.xml声明。APP在开发的时候只能提醒用户手机关闭它。

    那怎么判断它是否开启?这个开关其实在系统中对应的是一个属性,所以只需要判断改值是1或者0就行了。

    首先注册Observer(在Service中注册),获取变化的uri:

        getContentResolver().registerContentObserver(Uri.parse("content://settings/system"), true, new ContentObserver(new Handler()) {
            @Override
            public void onChange(boolean selfChange, @Nullable Uri uri) {
                super.onChange(selfChange, uri);
                Log.d(TAG, "onChange: " + uri);
            }
        });
    

    然后手动开启,关闭验证码安全保护开关,可以通过log发现:

    在这里插入图片描述
    可以发现verifition_sms_protect_enable这个值不停的变化,通过Settings.System.getInt直接获取,可以发现开启关闭开关时值也会在0和1之间转换。

    小绿小蓝的值不同,但是结果也一样。

    demo地址:https://download.csdn.net/download/weixin_45253393/13507749

    展开全文
  • C#编程经验技巧宝典

    热门讨论 2008-06-01 08:59:33
    91 <br>5.1 数字处理技巧 92 <br>0140 如何对计算结果四舍五放入 92 <br>0141 如何将商品金额小写转换成大写 92 <br>0142 如何根据生日自动计算员工年龄 93 <br>0143 如何设置货币值中使用...
  • 实例174 利用Servlet生成动态验证码 实例175 避免客户端访问的并发问题 实例176 在Servlet中使用JDBC访问数据库 实例177 利用Servlet访问数据库连接池 实例178 Servlet实现的个人所得税计算器 实例179 利用...
  • 实例174 利用Servlet生成动态验证码 实例175 避免客户端访问的并发问题 实例176 在Servlet中使用JDBC访问数据库 实例177 利用Servlet访问数据库连接池 实例178 Servlet实现的个人所得税计算器 实例179 利用...
  • 实例073 使用正则表达式验证手机号 实例074 使用正则表达式验证身份证号 实例075 使用正则表达式验证两位小数 实例076 使用正则表达式验证一年的12个月份 实例077 使用正则表达式验证一个月的31天 实例078 ...
  • 实例073 使用正则表达式验证手机号 实例074 使用正则表达式验证身份证号 实例075 使用正则表达式验证两位小数 实例076 使用正则表达式验证一年的12个月份 实例077 使用正则表达式验证一个月的31天 实例078 ...
  • 实例073 使用正则表达式验证手机号 实例074 使用正则表达式验证身份证号 实例075 使用正则表达式验证两位小数 实例076 使用正则表达式验证一年的12个月份 实例077 使用正则表达式验证一个月的31天 实例078 ...
  •  实例073 使用正则表达式验证手机号 89  实例074 使用正则表达式验证身份证号 90  实例075 使用正则表达式验证两位小数 91  实例076 使用正则表达式验证一年的12个月份 92  实例077 使用正则表达式验证一个...
  • 实例071 如何将字节单位B转换成GB、MB 和KB 108 实例072 身份证号从15位升到18位算法 109 第3章 面向对象编程思想 111 3.1 面向对象家族核心——类与类成员 112 实例073 面向对象编程核心——类、对象和引用 112 ...
  • 实例071 如何将字节单位B转换成GB、MB 和KB 108 实例072 身份证号从15位升到18位算法 109 第3章 面向对象编程思想 111 3.1 面向对象家族核心——类与类成员 112 实例073 面向对象编程核心——类、对象和引用 112 ...
  • 实例071 如何将字节单位B转换成GB、MB 和KB 108 实例072 身份证号从15位升到18位算法 109 第3章 面向对象编程思想 111 3.1 面向对象家族核心——类与类成员 112 实例073 面向对象编程核心——类、对象和引用 112 ...
  • 实例073 使用正则表达式验证手机号 89 实例074 使用正则表达式验证身份证号 90 实例075 使用正则表达式验证两位小数 91 实例076 使用正则表达式验证一年的12个月份 92 实例077 使用正则表达式验证一个月的31天 93 ...
  • uni-start集成的登录方式有:验证码登录(smsCode)、读取手机SIM卡一键登录(univerify)、账号密码登录(username)、微信登录(weixin)、苹果登录(apple) 使用方式:在 uni-starter.config.js->router->login下...
  • uni-start集成的登录方式有:验证码登录(smsCode)、读取手机SIM卡一键登录(univerify)、账号密码登录(username)、微信登录(weixin)、苹果登录(apple) 使用方式:在 uni-starter.config.js->router->login下...
  • 设置:App更新(整包升级、wgt升级、强制升级,后台搭配uniCloud admin的升级中心插件管理)、权限引导(app)、推送开关(app)、清除缓存(app)、用户协议、隐私协议(app)、问题与反馈、分享推荐、关于 ...
  • 实例009 读取和写入M3U文件 21 实例010 迷你歌词秀 26 实例011 歌词编辑器 31 实例012 自制录音机 34 实例013 实时在线广播 38 实例014 播放MIDI和WAV文件 40 实例015 利用sndPlaySound()函数播放音频文件 41 ...
  • 实例009 读取和写入M3U文件 21 实例010 迷你歌词秀 26 实例011 歌词编辑器 31 实例012 自制录音机 34 实例013 实时在线广播 38 实例014 播放MIDI和WAV文件 40 实例015 利用sndPlaySound()函数播放音频文件 41 ...
  • [如何使用] 下载程序,解压上传到你的服务器路径下,data目录设置777权限。访问体验超便捷的服务吧! (data目录没有写权限会导致配置修改不能保存、不能新建用户等) [关于上传问题] 程序没有做任何限制,如果需要...
  • 实例047 如何为MDI类型窗体设置背景图片 48 实例048 向提示框中添加图标 49 第2章 控件应用 51 2.1 TextBox控件应用 52 实例049 只允许输入数字的TextBox控件 52 实例050 限制用户名称长度及设置密码文本...
  • 实例027 自动启动的多媒体光盘程序 27 实例028 为触摸屏程序添加虚拟键盘 28 1.8 窗体效果 29 实例029 半透明渐显窗体 29 实例030 窗口颜色的渐变 30 1.9 窗体动画 31 实例031 窗体中的滚动字幕 31 实例032 动画显示...
  • 程序开发范例宝典>>

    2012-10-24 10:41:28
    实例086 禁用DataGridView控件列表头自动排序 122 2.9 其他控件典型应用 123 实例087 TrackBar控件的简单应用 123 实例088 自制平滑进度条控件 125 实例089 MaskedTextBox控件的简单应用 128 实例090...
  • C#程序开发范例宝典(第2版).part02

    热门讨论 2012-11-12 07:55:11
    实例086 禁用DataGridView控件列表头自动排序 122 2.9 其他控件典型应用 123 实例087 TrackBar控件的简单应用 123 实例088 自制平滑进度条控件 125 实例089 MaskedTextBox控件的简单应用 128 实例090 制作日历...
  • C#程序开发范例宝典(第2版).part13

    热门讨论 2012-11-12 20:17:14
    实例086 禁用DataGridView控件列表头自动排序 122 2.9 其他控件典型应用 123 实例087 TrackBar控件的简单应用 123 实例088 自制平滑进度条控件 125 实例089 MaskedTextBox控件的简单应用 128 实例090 制作日历...
  • 实例086 禁用DataGridView控件列表头自动排序 122 2.9 其他控件典型应用 123 实例087 TrackBar控件的简单应用 123 实例088 自制平滑进度条控件 125 实例089 MaskedTextBox控件的简单应用 128 实例090 制作日历...
  • 实例086 禁用DataGridView控件列表头自动排序 122 2.9 其他控件典型应用 123 实例087 TrackBar控件的简单应用 123 实例088 自制平滑进度条控件 125 实例089 MaskedTextBox控件的简单应用 128 实例090 制作日历...
  • 实例086 禁用DataGridView控件列表头自动排序 122 2.9 其他控件典型应用 123 实例087 TrackBar控件的简单应用 123 实例088 自制平滑进度条控件 125 实例089 MaskedTextBox控件的简单应用 128 实例090 制作日历...

空空如也

空空如也

1 2 3
收藏数 47
精华内容 18
关键字:

手机自动读取验证码如何设置