Android提取短信中的验证码
来源:互联网 发布:淘宝名字大全霸气 编辑:程序博客网 时间:2024/06/05 19:10
现在用短信验证码来实现登录和注册功能已经越来越常见了。如果你想用户在收到短信验证码后,不需要再手动输入进去的话,而是自动填入,那么你就需要做些特殊处理了!
1.监听短信变化
首先需要的是通过ContentObserver类中的OnChange()监听你的短信变化。简单的介绍下ContentObserver:内容观察者,目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理。
2.获取验证码
检测到了短信变化后,读取该条短信的内容,并且通过正则表达式来获取内容中的验证码。
3.修改UI
ContentObserver构造方法中有一个handler,通过handler来修改主线程中ui内容,将接收到的验证码呈现在ui上。
贴上代码,代码中有注释讲解:
MainActivity.java
import android.app.Activity;import android.net.Uri;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.widget.TextView;public class MainActivity extends Activity { private TextView mSmsTV; private SmsObserver mSmsObserver; private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); if(msg.what == 1) { String code = (String) msg.obj; mSmsTV.setText(code); } } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mSmsTV = (TextView) findViewById(R.id.tv_sms); mSmsObserver = new SmsObserver(this, mHandler); Uri smsUri = Uri.parse("content://sms"); getContentResolver().registerContentObserver(smsUri, true, mSmsObserver);//注册短信uri的监听 } @Override protected void onPause() { super.onPause(); getContentResolver().unregisterContentObserver(mSmsObserver);//取消监听 }}
SmsObserver.java
import android.content.Context;import android.database.ContentObserver;import android.database.Cursor;import android.net.Uri;import android.os.Handler;import android.os.Message;import android.util.Log;import java.util.regex.Matcher;import java.util.regex.Pattern;public class SmsObserver extends ContentObserver { private Context mContext; private Handler mHandler;//更新ui public SmsObserver(Context context, Handler handler) { super(handler); mContext = context; mHandler = handler; } @Override public void onChange(boolean selfChange, Uri uri) { super.onChange(selfChange, uri); /* 收到一条短信,onChange()会执行两次,uri不同 */ if (uri.toString().equals("content://sms/raw")) {//未写入数据库,不进行任何操作 return; } else {//此时已经写入数据库 Uri inboxUri = Uri.parse("content://sms/inbox"); /* 按照日期倒序排序 */ Cursor cursor = mContext.getContentResolver().query(inboxUri, null, null, null, "date desc"); if (cursor != null) { if (cursor.moveToFirst()) {//游标移动到first位置 /* 发件人的号码 */ String address = cursor.getString(cursor.getColumnIndex("address")); /* 短信内容 */ String body = cursor.getString(cursor.getColumnIndex("body")); Log.i("wyk", "address:" + address + ",body:" + body); /* 利用正则提取验证码(根据实际情况修改) */ Pattern pattern = Pattern.compile("(\\d{6})");//提取六位数字 Matcher matcher = pattern.matcher(body);//进行匹配 if(matcher.find()){//匹配成功 String code = matcher.group(0); Message msg = mHandler.obtainMessage(1, code); mHandler.sendMessage(msg); Log.i("wyk","code:"+code); } } cursor.close(); } } }}
最后别忘了再manifest中加入读取短信的权限
<uses-permission android:name="android.permission.READ_SMS"/>
0 0
- Android提取短信中的验证码
- Android ContentObserver监听短信提取验证码
- 提取短信验证码
- Android提取短信验证码并自动填写
- java:使用正则提取字符串中的数字(例如提取短信中的验证码)
- java使用正则提取字符串中的数字(例如提取短信中的验证码)(未测试)
- Android短信验证码
- Android短信验证码
- Android获得短信中的验证码并自动填充
- Android 短信验证码控件
- android 获取短信验证码
- Android之短信验证码
- Android之短信验证码
- Android发送短信验证码
- Android 短信注册验证码
- Android短信验证码SDK
- Android之短信验证码
- Android短信验证码读取
- C语言实现线性链表的19个功能
- 51nod 1460:连接小岛 贪心二分
- Snaigt 12.4.0 的使用和Snagit KEY
- Java的接口
- The Data Scientist's Toolbox -- markdown基础
- Android提取短信中的验证码
- iOS Crash 处理办法
- Atitit.获取approot api 应用根路径 java c#.net php asp
- IOC模式与JAVA反射机制
- iOS开发-常用第三方开源框架介绍(你了解的ios只是冰山一角)
- 机房重构--透过查询余额看视图的应用
- MAC 上配置 SecureCRT快捷键
- 程序员的段位进阶
- 一些idea的使用技巧文章