zoukankan      html  css  js  c++  java
  • Andorid自动读取短信验证码

    手机收到验证码短信后,程序自动识别验证码并填充验证码输入框。

    思路是有了,实现的方式也有多种:

    1、开启一个线程,隔一段时间就去查询收件箱是否有变化,有变化再读取出来做处理。

    2、注册一个短信变化的广播,收到广播后再去读取出来做处理。

    3、通过ContentObserver(内容观察者)来捕获特定Uri的变化。

    方案1,显然不可以取,太耗资源。

    方案2,实际应用起来是会有问题的,因为短信的广播是有序广播,假如有其他应用先捕获广播并终止传递,那么我们就永远也收不到这条短信变化的广播了。

    所以,综合比较起来,方案3比较可取。经过笔者实践也是没有问题的。

    先来点介绍性文字吧。

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

    下面给出方案3的关键性代码:

     1 public class SmsObserver extends ContentObserver{
     2 
     3     private Context mContext;
     4     private Handler mHandler;
     5     
     6     public SmsObserver(Context context,Handler handler) {
     7         super(handler);
     8         this.mContext = context;
     9         this.mHandler = handler;
    10     }
    11     
    12     @Override
    13     public void onChange(boolean selfChange) {
    14         super.onChange(selfChange);
    15         
    16         String code = "";
    17         
    18         Uri inBoxUri = Uri.parse("content://sms/inbox");
    19         Cursor c = mContext.getContentResolver().query(inBoxUri,null,null,null,"date desc");
    20         
    21         if(c != null){
    22             if(c.moveToFirst()){
    23                 String address = c.getString(c.getColumnIndex("address"));
    24                 String body = c.getString(c.getColumnIndex("body"));
    25                 Log.i("TAG","发件人为: " + address + "
    " + "短信内容: " + body);
    26                 
    27                 //这里可以写某个电话
    28 //                if(!address.equals("+8615210091283")){
    29 //                    return;
    30 //                }
    31                 
    32                 Pattern pattern = Pattern.compile("\d{6}");
    33                 Matcher matcher = pattern.matcher(body);
    34                 
    35                 if(matcher.find()){
    36                     code = matcher.group(0);
    37                     mHandler.obtainMessage(MainActivity.MSG_RECEIVED_CODE,code).sendToTarget();
    38                 }
    39             }
    40             c.close();
    41         }
    42     }
    43 }

     

     1 public class MainActivity extends Activity {
     2 
     3     private SmsObserver mObserver;
     4     private EditText mEtReceive;
     5     public static final int MSG_RECEIVED_CODE = 1;
     6     
     7     private Handler mHandler = new Handler(){
     8         public void handleMessage(android.os.Message msg) {
     9             if(msg.what == MSG_RECEIVED_CODE){
    10                 String code = (String)msg.obj;
    11                 mEtReceive.setText(code);
    12             }
    13         };
    14     };
    15     private Uri uri;
    16     
    17     
    18 
    19     @Override
    20     protected void onCreate(Bundle savedInstanceState) {
    21         super.onCreate(savedInstanceState);
    22         setContentView(R.layout.activity_main);
    23         
    24         mEtReceive = (EditText)findViewById(R.id.et_receive);
    25         
    26         mObserver = new SmsObserver(MainActivity.this,mHandler);
    27         uri = Uri.parse("content://sms");
    28         getContentResolver().registerContentObserver(uri,true,mObserver);
    29     }
    30     
    31     @Override
    32     protected void onPause() {
    33         super.onPause();
    34         getContentResolver().unregisterContentObserver(mObserver);
    35     }
    36     
    37     @Override
    38     protected void onResume() {
    39         super.onResume();
    40         getContentResolver().registerContentObserver(uri,true,mObserver);
    41     }
    42 }
  • 相关阅读:
    sql分页 sql server,oracle,db2,mysql
    部分SQL优化
    javascript &&和||的其他用法
    socket 套接字
    网络协议篇
    异常处理
    元类type 反射 函数与方法 双下方法
    私有 实例方法 类方法 静态方法 属性 issubclass isinstance区别
    面向对象的三大特性 鸭子类型 类的约束 super的深度剖析
    继承
  • 原文地址:https://www.cnblogs.com/yangang2013/p/4869724.html
Copyright © 2011-2022 走看看