先说一句:MIUI请放弃治疗!这里给个传送门:

识别短信验证码并提取还是挺常见的一个需求。所要解决的问题主要有:

1、如何监听

2、如何提取短信中的验证码

3、监听多次调用问题

直接看下面代码吧,很明了。需要注意的点有就是onChange会多次调用。其实打Log就看的出了,收到一条短信会调用两次onChange,Log结果如下:

mUri===content://sms/raw/20

mUri===content://sms/inbox/20

安卓7.0以上系统,点击标记为已读,也会调用一次

mUri===content://sms

收到一条短信都是uri后面都会有确定的一个数字,对应数据库的_id,比如上面的20

public static class SMSCodeObserver extends ContentObserver {

private Activity mActivity;

private static final String TAG = "SMSCodeObserver";

private SMSCodeListener mSMSCodeListener;

private Uri mUri;

public void setSMSCodeListener(SMSCodeListener SMSCodeListener) {

mSMSCodeListener = SMSCodeListener;

}

public interface SMSCodeListener {

void onResult(String code);

}

public SMSCodeObserver(Handler handler, Activity activity) {

super(handler);

mActivity = activity;

}

public void register() {

mActivity.getContentResolver().registerContentObserver(

Uri.parse("content://sms/"), true, this);

}

public void unRegister() {

mActivity.getContentResolver().unregisterContentObserver(this);

}

@Override

public void onChange(boolean selfChange, Uri uri) {

super.onChange(selfChange, uri);

if (uri == null) {

mUri = Uri.parse("content://sms/inbox");

} else {

mUri = uri;

}

if (mUri.toString().contains("content://sms/raw") || mUri.toString().equals("content://sms")) {

return;

}

LogUtils.d(TAG, "mUri===" + mUri.toString());

AndPermission.with(mActivity)

.permission(Manifest.permission.READ_SMS)

.requestCode(100)

.callback(this)

.rationale(new RationaleListener() {

@Override

public void showRequestPermissionRationale(int requestCode, Rationale rationale) {

AndPermission.rationaleDialog(mActivity, rationale)

.show();

}

})

.start();

}

@PermissionYes(100)

@SuppressWarnings("unused")

private void getPermissionYes(List grantedPermissions) {

handleSMS();

}

@PermissionNo(100)

@SuppressWarnings("unused")

private void getPermissionNo(List deniedPermissions) {

if (AndPermission.hasPermission(mActivity, Manifest.permission.READ_SMS)) {

handleSMS();

} else {

AndPermission.defaultSettingDialog(mActivity)

.show();

}

}

private void handleSMS() {

/* 按照日期倒序排序 */

Cursor cursor = mActivity.getContentResolver().query(mUri, 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"));

LogUtils.d(TAG, "address:" + address + ",body:" + body);

if (!body.contains("验证码")) {

return;

}

/* 利用正则提取验证码(根据实际情况修改) */

String code = getSMSCode(body);

if (code != null) {

if (mSMSCodeListener != null) {

mSMSCodeListener.onResult(code);

}

LogUtils.d(TAG, "code:" + code);

}

}

cursor.close();

}

}

private static String getSMSCode(String msg) {

/*提取正则表达式,需按需修改*/

Pattern p = Pattern.compile("(?

Matcher m = p.matcher(msg);

if (m.find()) {

LogUtils.d(TAG, m.group());

return m.group(0);

}

return null;

}

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

android 监听 短信,Android短信验证码监听解决onChange多次调用的方法相关推荐

  1. Android多条短信监听不到,Android短信验证码监听,解决onChange多次调用

    先说一句:MIUI请放弃治疗!这里给个传送门: MIUI通知类短信权限的坑 识别短信验证码并提取还是挺常见的一个需求.所要解决的问题主要有: 1.如何监听 2.如何提取短信中的验证码 3.监听多次调用 ...

  2. android短信模板,短信服务 · Android – Bmob后端云

    短信服务 Android 开发文档¶ 除了与用户相关的包括一键注册,手机号码登录等操作外,Bmob 还推出了单独的短信验证码服务. 在实际的应用中,开发者希望能够通过短信验证的方式来与用户进行某些重要 ...

  3. Android开发之用Bmob实现短信验证码功能

    本博客地址: http://blog.csdn.net/talentclass_ctt/article/details/51958374 这篇文章主要介绍发送验证码和校验验证码的功能,用到一个第三方平 ...

  4. android系统(8)---android事件分发机制

    前言 Android事件分发机制是每个Android开发者必须了解的基础知识 网上有大量关于Android事件分发机制的文章,但存在一些问题:内容不全.思路不清晰.无源码分析.简单问题复杂化等等 今天 ...

  5. android p preview_细数 Android P 开发者预览版中最不能错过的新特性

    原标题:细数 Android P 开发者预览版中最不能错过的新特性 2018年安卓巴士全球开发者论坛-重庆站 [线下活动]春天到了 跟小编一起去重庆嗨皮吧~ Android P 应用适配新特性1.Pr ...

  6. Android实战简易教程-第三十六枪(监听短信-实现短信验证码自动填入)

    一般用户喜欢用手机号作为用户名注册APP账号,这时一般都是通过手机验证码的方式进行验证,下面我们就研究一个非常实用的方法,通过监听短信-实现短信验证码的自动填入,提高用户体验. 首先我们看一下如何监听 ...

  7. Android 短信发送失败是如何监听到的

    之前做项目,遇到需求:在短信发送失败后,弹出对话框,提示失败,如果用户点击retry,则开始重新发送,否则什么都不干. 高通8.0短信发送失败处理: 平台发送短信后会监听短信是否发送成功,这里主要看失 ...

  8. Android从普通发送和接收短信到对短信进行拦截

    概述: 说实话,关于Android中对短信的一些相关操作是一个比较入门的东西.那我现在还要来写这一篇博客的原因只是因为现在开发中有相关内容,而又想将这些东西分享给更多的人来学习,同时在以后对Andro ...

  9. Android开发学习之电话、短信、联系人

    作为一部手机,最重要的功能当属电话.短信.联系人了,所以今天想和大家分享的是关于Android电话.短信.联系人这块的API接口. 1.通话记录的获取 List<TelePhoneRecord& ...

最新文章

  1. MySQL数据库(五)使用pymysql对数据库进行增删改查
  2. AI换脸、声音篡改等,明确写入新版《民法典》
  3. 成为最差开发者的10条建议
  4. cannot import name 'multiarray'
  5. 同感,C#对JSON序列化和反序列化有点蹩脚
  6. bs4之标签树的平行遍历
  7. C++判断一个数是否为回文数palindrome的算法(附完整源码)
  8. python程序写蛇_python蟒蛇绘制程序
  9. [POJ3177]Redundant Paths(双联通)
  10. Javascript事件模型系列(一)事件及事件的三种模型
  11. 为什么黑客都用python-黑客编程为什么首选Python语言?这里告诉你答案!
  12. 16位LED恒流源芯片TC5020A,32*128点阵屏驱动函数
  13. 基于pytorch实现线性回归
  14. html大鱼吃小鱼游戏,大鱼吃小鱼 网页游戏源码(javascript)
  15. Ubuntu 18.04配置静态IP地址
  16. 我的年终总结之一波三折的2018
  17. APP应用分发平台分析(一)
  18. 面积计算9860SD计算器程序(好用就用,不用就删-----歪XX)
  19. 格基规约算法:数学基础
  20. Vue.js 内置指令

热门文章

  1. Kubernetes CKA认证运维工程师笔记-Kubernetes故障排查
  2. sonarqube中 项目名称 问题
  3. matlab怎么画隐函数图像,matlab中如何画隐函数的图像
  4. Verbatim字符串
  5. 参数validator/valid校验用法(通俗)
  6. 京东登月机器学习平台 团队_发展您的安全团队并让机器人来完成工作
  7. hapi mysql项目实战路由初始化_hapi框架搭建记录(三):Joi数据校验和Sequelize(数据迁移、填充数据)...
  8. 烤仔TVの尚书房 | “鸽王”还是“割王”?
  9. 学校计算机信息固定资产编号,学校固定资产的分类和编号(仅供参考).doc
  10. 【杂记】数据存储架构