安卓观察者ContentObserver模式用正则获取短信验证码

最近做注册的时候看到很多app在手机接受到短信的时候直接填写验证码到界面省略用户自动输入,感觉这样确实蛮人性化的呵呵,于是自己也做了一个

步骤:

首先我使用了ContentObserver监听短信,(最好知道您的验证码从那个号码发过来)

然后从短信中用正则的分组去拿到验证码(当然验证码必须是什么格式)

贴出关键代码:

注册监听短信数据库

ContentObserver c=new ContentObserver(han) {
                @Override
                public void onChange(boolean selfChange) {
                    // TODO Auto-generated method stub
                    super.onChange(selfChange);
                    han.sendEmptyMessage(0);
                }
            };
getContentResolver().registerContentObserver(Uri.parse("content://sms"), true, c);
 
 
Handler han = new Handler() {
        @SuppressWarnings("deprecation")
        public void handleMessage(android.os.Message msg) {
            String codestr = null;
            try {
                codestr = Cus_UnitTools.getsmsyzm(Reg_ForgetPassword.this);
                code.setText(codestr);
                requestcode();
            } catch (Exception e) {
                Log.e("yung", "验证码提取失败:" + codestr);
            }
        };
    };  
 
    public static String getsmsyzm(Activity c) {
        Uri uri = Uri.parse("content://sms/inbox");
        String[] projection = new String[] { "address", "person", "body" };
        String selection = " address='" + JTPHONE + "' ";
        String[] selectionArgs = new String[] {};
        String sortOrder = "date desc";
        @SuppressWarnings("deprecation")
        Cursor cur = c.managedQuery(uri, projection, selection, selectionArgs,
                sortOrder);
        if(cur!=null&&cur.getCount()>0){
            cur.moveToFirst();
            String body = cur.getString(cur.getColumnIndex("body")).replaceAll(
                    "\n", " ");
            cur.close();
            return getyzm(body, YZMLENGTH);
    }
        cur.close();
        return null;
    }
 
 
        /**
     * 从短信字符窜提取验证码
     * @param body 短信内容 
         * @param YZMLENGTH  验证码的长度 一般6位或者4位
     * @return 接取出来的验证码
     */
    public static String getyzm(String body, int YZMLENGTH) {
        // 首先([a-zA-Z0-9]{YZMLENGTH})是得到一个连续的六位数字
        // (?<!--[a-zA-Z0-9])负向断言([0-9]{YZMLENGTH})前面不能有数字
        // (?![a-zA-Z0-9])断言([0-9]{YZMLENGTH})后面不能有数字出现
        Pattern p = Pattern
                .compile("(?<![a-zA-Z0-9])([a-zA-Z0-9]{" + YZMLENGTH + "})(?![a-zA-Z0-9])");
        Matcher m = p.matcher(body);
        if (m.find()) {
            System.out.println(m.group());
            return m.group(0);
        }
        return null;
    }</pre-->
<p><br>
//有些验证码是纯数字的那么直接用这个就可以了<br>
//Pattern p = Pattern.compile("(?<!--[0-9])([0-9]{" + YZMLENGTH+ "})(?![0-9])");<br-->
监听完成后记得getContentResolver().unregisterContentObserver(c);注销监听 </p>
<p>这样子就可以监听到短信数据库的变化了记住还需要加入权限顺便列出短信权限</p>
<p>    <!-- 发送短信--></p>
<p>   <uses-permission android:name="android.permission.SEND_SMS"><br>
    <!-- 阅读消息 --><br>
    <uses-permission android:name="android.permission.READ_SMS"><br>
    <!-- 写入消息 --><br>
    <uses-permission android:name="android.permission.WRITE_SMS"><br>
    <!-- 接收消息 --><br>
    <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission></uses-permission></uses-permission></uses-permission></p>
<p> </p>
<p> </p>
<p>demo就不写了呵呵这里很清楚也很简单..不喜勿喷,有错回帖,转载必备 尊重作者-yung7086</p>
<p> </p>                        


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值