项目需求:

Android开发中用户登录往会用到短信验证的功能,如果让用户先查看短信,然后再回到界面填写验证码,用户体验不是很好,有时就需要实现验证码的自动填写功能。
做法:
我以前的做法是先创建一个广播接收器,接受短信变化的广播,收到广播时,再把验证码提取出来。
那时有用户测试反馈他的手机安装了其他一些短信应用或者手机本身限制了权限的情况下,这种方式可能起不了作用,即使把优先级设高,也不能保证不会被别的应用抢先。
以前用户卸载掉第三方软件后,就没再追究了。
现在发现可以通过监听短信数据库的方式实现。监听短信数据库主要是通过ContentObserver这个类来完成。ContentObserver主要是通过Uri来监测特定的Databases的表,当ContentObserver所观察的Uri发生变化时,便会触发它。ContentObserver内容观察者,可监听观察特定Uri指向的数据库项的变化,进而进行相应的处理。
public class MessageContentObserver extends ContentObserver {
private Context mContext;
private Handler mHandler;
private String code;
public MessageContentObserver(Context context, Handler handler) {
super(handler);
mContext = context;
mHandler = handler;
}
/**
* 回调函数, 当监听的Uri发生改变时,会回调该方法
* 需要注意的是当收到短信的时候会回调两次
* 收到短信一般来说都是执行了两次onchange方法.第一次一般都是raw的这个.
* 虽然收到了短信.但是短信并没有写入到收件箱里
*/
@Override
public void onChange(boolean selfChange, Uri uri) {
if (uri.toString().equals("content://sms/raw")) {
return;
}
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")); // 短信内容
if (!address.equals("10086")) {
return;
}
Pattern pattern = Pattern.compile("(\\d{6})");//正则表达式匹配验证码
Matcher matcher = pattern.matcher(body); if (matcher.find()) {
code = matcher.group(0);
Message msg = Message.obtain();
msg.what = MainActivity.MSG_RECEIVE_CODE;
msg.obj = code;
mHandler.sendMessage(msg);
}
}
c.close();
}
}
}
调用:
/**
* 短信验证码自动填写功能的实现
*/
public class MainActivity extends Activity {
public static final int MSG_RECEIVE_CODE = 1; //收到短信的验证码
private EditText codeEdt; //短信验证码的输入框
private MessageContentObserver messageContentObserver; //回调接口
@SuppressLint("HandlerLeak")
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == MSG_RECEIVE_CODE) {
//设置读取到的内容
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
codeEdt = (EditText) findViewById(R.id.smsCode);
findViewById(R.id.send_sms_btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
senSMSCode();
}
});
messageContentObserver = new MessageContentObserver(MainActivity.this, handler);
getContentResolver().registerContentObserver(Uri.parse("content://sms/"), true, messageContentObserver);
}
/**
* 取消注册
*/
@Override
protected void onDestroy() {
super.onDestroy();
getContentResolver().unregisterContentObserver(messageContentObserver);
}
private void senSMSCode() {
}
}
需要在AndroidManifest.xml加上权限
<!--读取短信的权限--> <uses-permission android:name="android.permission.RECEIVE_SMS"/> <uses-permission android:name="android.permission.READ_SMS" />
关于content://sms/inbox表,大致包含的域有:
_id | 短消息序号 如100 thread_id | 对话的序号 如100
address | 发件人地址,手机号.如+8613811810000 person | 发件人,返回一个数字就是联系人列表里的序号,陌生人为null
date | 日期 long型。如1256539465022 protocol | 协议 0 SMS_RPOTO, 1 MMS_PROTO
read | 是否阅读 0未读, 1已读
status | 状态 -1接收,0 complete, 64 pending, 128 failed
type | 类型 1是接收到的,2是已发出
body | 短消息内容
service_center | 短信服务中心号码编号。
content://sms/inbox 收件箱
content://sms/sent 已发送
content://sms/draft 草稿
content://sms/outbox 发件箱 (正在发送的信息)
content://sms/failed 发送失败
content://sms/queued 待发送列表
项目地址
https://github.com/88ios/SMSContentObserver-master
项目主要用第三方bomb来发短信,感兴趣不妨看看。
以上所述是小编给大家介绍的Android自动填充短信验证码功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
# android短信验证码自动填充
# android短信验证码
# Android使用AutoCompleteTextView实现自动填充功能的案例
# Android实现自动填充短信验证码功能
# Android实现自动填充短信验证码
# Android利用广播接收器实现自动填充短信验证码
# Android 中使用ContentObserver模式获取短信用正则自动填充验证码
# Android短信验证码自动填充功能
# 基于Android中的 AutoCompleteTextView实现自动填充
# Android自定义控件实现短信验证码自动填充
# 验证码
# 收件箱
# 回调
# 都是
# 两次
# 小编
# 主要是
# 的是
# 短消息
# 很好
# 在此
# 感兴趣
# 可以通过
# 给大家
# 然后再
# 便会
# 时就
# 第三方
# 收到了
# 再把
相关文章:
平台云上自助建站如何快速打造专业网站?
电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?
广东专业制作网站有哪些,广东省能源集团有限公司官网?
如何在阿里云部署织梦网站?
建站上市公司网站建设方案与SEO优化服务定制指南
济南企业网站制作公司,济南社保单位网上缴费步骤?
高配服务器限时抢购:企业级配置与回收服务一站式优惠方案
定制建站流程步骤详解:一站式方案设计与开发指南
c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】
如何在自有机房高效搭建专业网站?
已有域名和空间,如何快速搭建网站?
导航网站建站方案与优化指南:一站式高效搭建技巧解析
建站之星会员如何解锁更多建站功能?
单页制作网站有哪些,朋友给我发了一个单页网站,我应该怎么修改才能把他变成自己的呢,请求高手指点迷津?
股票网站制作软件,网上股票怎么开户?
建站之星官网登录失败?如何快速解决?
子杰智能建站系统|零代码开发与AI生成SEO优化指南
济南专业网站制作公司,济南信息工程学校怎么样?
,怎么在广州志愿者网站注册?
宿州网站制作公司兴策,安徽省低保查询网站?
如何通过远程VPS快速搭建个人网站?
如何在局域网内绑定自建网站域名?
网站制作公司排行榜,四大门户网站排名?
建站之星如何通过成品分离优化网站效率?
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
如何在IIS7中新建站点?详细步骤解析
在线制作视频的网站有哪些,电脑如何制作视频短片?
c# 在高并发下使用反射发射(Reflection.Emit)的性能
大同网页,大同瑞慈医院官网?
如何快速使用云服务器搭建个人网站?
广州美橙建站如何快速搭建多端合一网站?
C++如何使用std::optional?(处理可选值)
合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?
北京网站制作网页,网站升级改版需要多久?
网站制作需要会哪些技术,建立一个网站要花费多少?
成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?
,网页ppt怎么弄成自己的ppt?
C#如何使用XPathNavigator高效查询XML
官网建站费用明细查询_企业建站套餐价格及收费标准指南
如何通过NAT技术实现内网高效建站?
建站之星北京办公室:智能建站系统与小程序生成方案解析
学校免费自助建站系统:智能生成+拖拽设计+多端适配
如何破解联通资金短缺导致的基站建设难题?
如何用好域名打造高点击率的自主建站?
如何在IIS7上新建站点并设置安全权限?
广德云建站网站建设方案与建站流程优化指南
深圳网站制作的公司有哪些,dido官方网站?
高端建站三要素:定制模板、企业官网与响应式设计优化
如何基于云服务器快速搭建网站及云盘系统?
网站按钮制作软件,如何实现网页中按钮的自动点击?
*请认真填写需求信息,我们会在24小时内与您取得联系。