通过ContentObserver自动获取短信验证码
来源:互联网 发布:电子商务模式的大数据 编辑:程序博客网 时间:2024/05/22 07:07
在上一篇博客中讲到通过广播获取短信验证码,但是存在缺陷。这里讲一下如何通过ContentObserver来实现这个功能。关于ContentObserver这里就不再介绍了,主要是利用ContentObserver能监控到手机短信箱内容变化的原理来实现,实现过程如下文。
首先写一个类继承ContentObserver,重写onChange方法:
public class SmsContentObserver extends ContentObserver { private String smsInboxUri = "content://sms/inbox"; private Context ctx; private String sortOrder; private String address = "10001";// 发送短信地址 public SmsContentObserver(Context ctx, Handler handler) { super(handler); this.ctx = ctx; sortOrder = Sms.DATE + " desc"; } @Override public void onChange(boolean selfChange) { super.onChange(selfChange); Uri uri = Uri.parse(smsInboxUri); Cursor cursor = ctx.getContentResolver().query(uri, null, null, null, sortOrder); if (cursor != null) { while (cursor.moveToNext()) { if (cursor.moveToNext()) { String number = cursor.getString(cursor .getColumnIndex(Sms.ADDRESS));// 手机号 String smsbody = cursor.getString(cursor .getColumnIndex(Sms.BODY)); Log.e("smsbody", number + "-->" + smsbody); if (number.equals(address)) { Log.e("smsbody", "10001" + "-->" + smsbody); String regEx = "\\d{4}$"; Pattern p = Pattern.compile(regEx); Matcher m = p.matcher(smsbody.toString()); String msgContent = ""; while (m.find()) { msgContent = m.group(); Log.e("msgContent", "-->" + msgContent); break; } } } } cursor.close(); } }}
然后注册ContentObserver:
smsContentObserver = new SmsContentObserver(this, new Handler()); Uri smsUri = Uri.parse("content://sms"); getContentResolver().registerContentObserver(smsUri, true, smsContentObserver);
最后,使用完不要忘了释放资源:
getContentResolver().unregisterContentObserver(smsContentObserver);
MainActivity完整代码如下:
public class MainActivity extends Activity { SmsContentObserver smsContentObserver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); smsContentObserver = new SmsContentObserver(this, new Handler()); Uri smsUri = Uri.parse("content://sms"); getContentResolver().registerContentObserver(smsUri, true, smsContentObserver); } @Override protected void onStop() { // TODO Auto-generated method stub super.onStop(); getContentResolver().unregisterContentObserver(smsContentObserver); }}
输出日志:
注意点:
1. 在使用ctx.getContentResolver().query()查询的时候,加上查询条件可以提高查询效率。
2. 通过正则表达式对发送短信的号码进行匹配,可以只读取某个号码发送的短信。
试着读取手机收到的摩拜短信验证码,结果有时候能读到,有时候不行,后来发现是发送短信的号码不同,真是坑爹!
所以实际使用的时候,要注意address是否与实际发送短信的号码相一致。
同一手机运营商发送短信的号码都不同,如果是不同的运营商,号码也会不同。
如何判断手机运营商?可以看这个里面的方法:
http://blog.csdn.net/ceovip/article/details/77069789
阅读全文
0 0
- 通过ContentObserver自动获取短信验证码
- 通过BroadcastReceiver自动获取短信验证码
- 短信验证码(通过ContentObserver)实时填写
- 自动填充短信验证码(使用ContentObserver)
- 自动填充短信验证码(使用ContentObserver)
- 自动填充短信验证码(使用ContentObserver)
- 自动填充短信验证码(使用ContentObserver)
- Android 应用中使用ContentObserver自动填写短信验证码
- 短信验证码自动填写认知之ContentObserver详解
- 【android】利用ContentObserver监听短信来获取验证码
- 监听短信获取验证码——ContentObserver的使用
- 自动获取短信验证码
- 自动获取短信验证码
- android 短信验证自动获取验证码
- Android ContentObserver监听短信提取验证码
- 安卓观察者ContentObserver模式用正则获取短信验证码
- android自动获取短信验证码
- android自动获取短信验证码
- 306
- 斯坦福機器學習編程作業1
- 307
- 算法题中常见的C++ STL
- 308
- 通过ContentObserver自动获取短信验证码
- 【Linux学习笔记】23:Bash基础-通配符和其它特殊符号
- 309
- HDU
- Linux shell 中的关联数组
- SPOJ REPEATS 后缀数组
- enote笔记语言(5)——其他(ver0.2)
- BZOJ 4753: [Jsoi2016]最佳团体 树形背包 01分数规划
- Angular引入第三方库--问题解决方法