Andorid自动读取短信验证码
2015-10-11 18:30
309 查看
手机收到验证码短信后,程序自动识别验证码并填充验证码输入框。
思路是有了,实现的方式也有多种:
1、开启一个线程,隔一段时间就去查询收件箱是否有变化,有变化再读取出来做处理。
2、注册一个短信变化的广播,收到广播后再去读取出来做处理。
3、通过ContentObserver(内容观察者)来捕获特定Uri的变化。
方案1,显然不可以取,太耗资源。
方案2,实际应用起来是会有问题的,因为短信的广播是有序广播,假如有其他应用先捕获广播并终止传递,那么我们就永远也收不到这条短信变化的广播了。
所以,综合比较起来,方案3比较可取。经过笔者实践也是没有问题的。
先来点介绍性文字吧。
“ContentObserver——内容观察者,目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理,它类似于数据库技术中的触发器(Trigger),当ContentObserver所观察的Uri发生变化时,便会触发它。触发器分为表触发器、行触发器,相应地ContentObserver也分为“表“ContentObserver、“行”ContentObserver,当然这是与它所监听的Uri MIME Type有关的。”
下面给出方案3的关键性代码:
思路是有了,实现的方式也有多种:
1、开启一个线程,隔一段时间就去查询收件箱是否有变化,有变化再读取出来做处理。
2、注册一个短信变化的广播,收到广播后再去读取出来做处理。
3、通过ContentObserver(内容观察者)来捕获特定Uri的变化。
方案1,显然不可以取,太耗资源。
方案2,实际应用起来是会有问题的,因为短信的广播是有序广播,假如有其他应用先捕获广播并终止传递,那么我们就永远也收不到这条短信变化的广播了。
所以,综合比较起来,方案3比较可取。经过笔者实践也是没有问题的。
先来点介绍性文字吧。
“ContentObserver——内容观察者,目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理,它类似于数据库技术中的触发器(Trigger),当ContentObserver所观察的Uri发生变化时,便会触发它。触发器分为表触发器、行触发器,相应地ContentObserver也分为“表“ContentObserver、“行”ContentObserver,当然这是与它所监听的Uri MIME Type有关的。”
下面给出方案3的关键性代码:
public class SmsObserver extends ContentObserver{ private Context mContext; private Handler mHandler; public SmsObserver(Context context,Handler handler) { super(handler); this.mContext = context; this.mHandler = handler; } @Override public void onChange(boolean selfChange) { super.onChange(selfChange); String code = ""; Uri inBoxUri = Uri.parse("content://sms/inbox"); Cursor c = mContext.getContentResolver().query(inBoxUri,null,null,null,"date desc"); if(c != null){ if(c.moveToFirst()){ String address = c.getString(c.getColumnIndex("address")); String body = c.getString(c.getColumnIndex("body")); Log.i("TAG","发件人为: " + address + "\n" + "短信内容: " + body); //这里可以写某个电话 // if(!address.equals("+8615210091283")){ // return; // } Pattern pattern = Pattern.compile("\\d{6}"); Matcher matcher = pattern.matcher(body); if(matcher.find()){ code = matcher.group(0); mHandler.obtainMessage(MainActivity.MSG_RECEIVED_CODE,code).sendToTarget(); } } c.close(); } } }
public class MainActivity extends Activity { private SmsObserver mObserver; private EditText mEtReceive; public static final int MSG_RECEIVED_CODE = 1; private Handler mHandler = new Handler(){ public void handleMessage(android.os.Message msg) { if(msg.what == MSG_RECEIVED_CODE){ String code = (String)msg.obj; mEtReceive.setText(code); } }; }; private Uri uri; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mEtReceive = (EditText)findViewById(R.id.et_receive); mObserver = new SmsObserver(MainActivity.this,mHandler); uri = Uri.parse("content://sms"); getContentResolver().registerContentObserver(uri,true,mObserver); } @Override protected void onPause() { super.onPause(); getContentResolver().unregisterContentObserver(mObserver); } @Override protected void onResume() { super.onResume(); getContentResolver().registerContentObserver(uri,true,mObserver); } }
相关文章推荐
- 一些使用Android设备调试功能的注意事项(挖职位)
- 教主的花园
- 8.js模式-状态模式
- kali安装后配置
- 从工程中删除Cocoapods
- pandas 基础1
- 教主的花园
- 7.js模式-装饰者模式
- 大整数存储及运算——求100的阶乘
- 砍树
- 【转】mysql数据库中实现内连接、左连接、右连接
- 6.js模式-中介者模式
- wcf综合运用之:大文件异步断点续传
- 2015 ACM/ICPC 合肥赛区网络赛——吐槽向
- Android仿百度加载动画
- 5.js模式-职责链模式
- 4.js模式-发布-订阅模式
- BZOJ4298 : [ONTAK2015]Bajtocja
- 3.js模式-策略模式
- 2.js模式-单例模式