zoukankan      html  css  js  c++  java
  • 安卓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(
    					"
    ", " ");
    			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; }


    //有些验证码是纯数字的那么直接用这个就能够了
    //Pattern p = Pattern.compile("(?<![0-9])([0-9]{" + YZMLENGTH+ "})(?

    ![0-9])");
    监听完毕后记得getContentResolver().unregisterContentObserver(c);注销监听

    这样子就能够监听到短信数据库的变化了记住还须要增加权限顺便列出短信权限

        <!-- 发送短信-->

       <uses-permission android:name="android.permission.SEND_SMS" />
        <!-- 阅读消息 -->
        <uses-permission android:name="android.permission.READ_SMS" />
        <!-- 写入消息 -->
        <uses-permission android:name="android.permission.WRITE_SMS" />
        <!-- 接收消息 -->
        <uses-permission android:name="android.permission.RECEIVE_SMS" />

    demo就不写了呵呵这里非常清楚也非常easy..不喜勿喷。有错回帖。转载必备 尊重作者-yung7086

  • 相关阅读:
    BNUOJ 19792 Airport Express
    Poor Hanamichi
    BNUOJ 1206 A Plug for UNIX
    HDU 3507 Print Article
    一个程序猿试用有道云笔记VIP功能体验
    Cloud Foundry Session Affinity(Sticky Session)的实现
    SAP成都研究院廖婧:SAP C4C社交媒体集成概述
    SAP订单编排和流程增强概述
    在Kubernetes上运行SAP UI5应用(上)
    Docker入门系列之三:如何将dockerfile制作好的镜像发布到Docker hub上
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/7039298.html
Copyright © 2011-2022 走看看