Android 中使用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;
  }
//有些验证码是纯数字的那么直接用这个就可以了
//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" />

以上所述是小编给大家介绍的Android 中使用ContentObserver模式获取短信用正则自动填充验证码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

时间: 2017-02-02

详解Android开发中ContentObserver类的使用

ContentObserver--内容观察者,目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理,它类似于 数据库技术中的触发器(Trigger),当ContentObserver所观察的Uri发生变化时,便会触发它.触发器分为表触发器.行触发器, 相应地ContentObserver也分为"表"ContentObserver."行"ContentObserver,当然这是与它所监听的Uri MIME Type有关的. 熟悉Content Prov

Android采取ContentObserver方式自动获取验证码

Android 自动获取验证码的两种方式分别是BroadcastReceiver及ContentObserver,两种方式都需要进行注册.取消注册两个步骤 记得添加权限,本文介绍ContentObserver方式. 照旧先上ContentObserver代码 /** * Created by weifeiyang on 2016/7/29 0029. */ import android.app.Activity; import android.content.SharedPreferences;

Android 使用ContentObserver监听数据库内容是否更改

Android 使用ContentObserver监听数据库内容是否更改 ContentObserver--内容观察者,目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理,它类似于数据库技术中的触发器(Trigger),当ContentObserver所观察的Uri发生变化时,便会触发它.触发器分为表触发器.行触发器,相应地ContentObserver也分为"表"ContentObserver."行"ContentObserver,当然这是与它所

android截图事件监听的原理与实现

Android系统没有对用户截屏行为提供回调的api,所以我们只能走野路子来获取用户是否截屏了.一般大家都会采用如下两种方法 1.监听截屏图片所在目录变化(FileObserver) 2.监听媒体库的变化(ContentObserver) 上面两种方法均不是万能的,需要结合使用才能达到良好的效果,首先看看如何监控目录 在android中,我们可以通过FileObserver来监听目录变化,先来看看如何使用 private static final File DIRECTORY_PICTURES

Android App内监听截图加二维码功能代码

Android截屏功能是一个常用的功能,可以方便的用来分享或者发送给好友,本文介绍了如何实现app内截屏监控功能,当发现用户在我们的app内进行了截屏操作时,进行对图片的二次操作,例如添加二维码,公司logo等一系列*. 项目地址 测试截图: 截屏原理 android系统并没有提供截屏通知相关的API,需要我们自己利用系统能提供的相关特性变通实现.Android系统有一个媒体数据库,每拍一张照片,或使用系统截屏截取一张图片,都会把这张图片的详细信息加入到这个媒体数据库,并发出内容改变通知,我们可

Android下载进度监听和通知的处理详解

本文实例为大家分享了Android下载进度监听和通知的具体代码,供大家参考,具体内容如下 下载管理器 关于下载进度的监听,这个比较简单,以apk文件下载为例,需要处理3个回调函数,分别是: 1.下载中 2.下载成功 3.下载失败 因此对应的回调接口就有了: public interface DownloadCallback { /** * 下载成功 * @param file 目标文件 */ void onComplete(File file); /** * 下载失败 * @param e */

Android编程实现监听EditText变化的方法

本文实例讲述了Android编程实现监听EditText变化的方法.分享给大家供大家参考,具体如下: 监听EditText中的内容的变化.在EditText没有找到一个setOnxxxx的方法.百度了一下,原来在EditText中有一个方法addTextChangedListner(TextWatcher watcher)方法,用他可以时时监听EditText的内容变化.TextWatcher是一个接口类,所以必须实现TextWatcher里的抽象方法: 当EditText里面的内容有变化的时候

Android 7.0 监听网络变化的示例代码

Android7.0前,Android系统前网络切换时,会发广播,业务只要监听广播即可. public class NetChangeReceiver extends BroadcastReceiver { private static final String ANDROID_NET_CHANGE_ACTION = "android.net.conn.CONNECTIVITY_CHANGE"; @Override public void onReceive(Context conte

Laravel监听数据库访问,打印SQL的例子

增加一个helper函数 if ( ! function_exists('sql_dump')) { function sql_dump() { \DB::listen(function ($sql) { $i = 0; $bindings = $sql->bindings; $rawSql = preg_replace_callback('/\?/', function ($matches) use ($bindings, &$i) { $item = isset($bindings[$i

android studio按钮监听的5种方法实例详解

1.匿名内部类 public class MainActivity extends AppCompatActivity implements View.OnClickListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button btn1 = fin

jquery监听div内容的变化具体实现思路

我们做电子商务,javascript框架采用的是jQuery,在开发过程中遇到了上面标题列出的问题:如何监听div内容的变化. 先给出最终代码(后续进行相关分析): 复制代码 代码如下: var title = $("b.facility"); var title = $('#title');//the element I want to monitor title.bind('DOMNodeInserted', function(e) { alert('element now con

Android实现信号强度监听的方法

信号强度的监听是Android手机十分常见的一个重要功能.今天本文就以实例展示Android实现信号强度监听的方法.分享给大家供大家参考. 具体实现代码如下: TelephonyManager Tel; MyPhoneStateListener MyListener; /* Update the listener, and start it */ MyListener = new MyPhoneStateListener(); Tel = (TelephonyManager) getSystem