安卓手机短信

article/2025/7/12 7:26:51


前提--权限:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <uses-permission android:name="android.permission.RECEIVE_SMS" >  
  2. </uses-permission>  
  3. <uses-permission android:name="android.permission.READ_SMS" >  
  4. </uses-permission>  


方式一:通过广播监听短信消息

(注意:这种方式只对新收到的短消息有效,运行代码,并不会读取收件箱中已读或未读的消息,只有当收到新来的短消息时,才会执行onChange方法)


注册一个广播:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <receiver android:name="com.dbjtech.acbxt.waiqin.SmsReciver" >  
  2.            <intent-filter android:priority="999">  
  3.                <action android:name="android.provider.Telephony.SMS_RECEIVED" />  
  4.            </intent-filter>  
  5.        </receiver>  

SmsReceiver.java

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public class SmsReciver extends BroadcastReceiver {  
  2.   
  3.     @Override  
  4.     public void onReceive(Context context, Intent intent) {  
  5.         Bundle bundle = intent.getExtras();  
  6.         SmsMessage msg = null;  
  7.         if (null != bundle) {  
  8.             Object[] smsObj = (Object[]) bundle.get("pdus");  
  9.             for (Object object : smsObj) {  
  10.                 msg = SmsMessage.createFromPdu((byte[]) object);  
  11.             Date date = new Date(msg.getTimestampMillis());//时间  
  12.                 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
  13.                 String receiveTime = format.format(date);  
  14.                 System.out.println("number:" + msg.getOriginatingAddress()  
  15.                 + "   body:" + msg.getDisplayMessageBody() + "  time:"  
  16.                         + msg.getTimestampMillis());  
  17.                   
  18.                 //在这里写自己的逻辑  
  19.                 if (msg.getOriginatingAddress().equals("10086")) {  
  20.                     //TODO  
  21.                       
  22.                 }  
  23.                   
  24.             }  
  25.         }  
  26.     }  
  27.   
  28. }  


系统的这个广播是有序广播,就是当别的程序先获取到了这个广播再传递给你,当然它也可以干掉这个广播,让你接收不到,这样你的程序肯定是接收不到这个广播的了。我们发现,通过设置priority的数值,其实有时是不管用的,现在在一些定制的系统或是有安全软件的情况下,往往短消息都被截取到,并被干掉。

那么,我们只能使用方法二,监听短信数据库的变化,这种方式比方法一稍微复杂一些,不过使用起来也很方便,不受其它程序干扰~


方式二:通过短信数据库获取短信内容

(注意:这种方式可以获取手机上所有的短信,包括已读未读的短信,是不是很赞)

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. private Uri SMS_INBOX = Uri.parse("content://sms/");  
  2.     public void getSmsFromPhone() {  
  3.         ContentResolver cr = getContentResolver();  
  4.         String[] projection = new String[] { "body" };//"_id", "address", "person",, "date", "type  
  5.         String where = " address = '1066321332' AND date >  "  
  6.                 + (System.currentTimeMillis() - 10 * 60 * 1000);  
  7.         Cursor cur = cr.query(SMS_INBOX, projection, where, null"date desc");  
  8.         if (null == cur)  
  9.             return;  
  10.         if (cur.moveToNext()) {  
  11.             String number = cur.getString(cur.getColumnIndex("address"));//手机号  
  12.             String name = cur.getString(cur.getColumnIndex("person"));//联系人姓名列表  
  13.             String body = cur.getString(cur.getColumnIndex("body"));  
  14.             //这里我是要获取自己短信服务号码中的验证码~~  
  15.             Pattern pattern = Pattern.compile(" [a-zA-Z0-9]{10}");  
  16.             Matcher matcher = pattern.matcher(body);  
  17.             if (matcher.find()) {  
  18.                 String res = matcher.group().substring(111);  
  19.                 mobileText.setText(res);  
  20.             }  
  21.         }  
  22.     }  




sms主要结构:
  
  _id:短信序号,如100
  
  thread_id:对话的序号,如100,与同一个手机号互发的短信,其序号是相同的
  
  address:发件人地址,即手机号,如+86138138000
  
  person:发件人,如果发件人在通讯录中则为具体姓名,陌生人为null
  
  date:日期,long型,如1346988516,可以对日期显示格式进行设置
  
  protocol:协议0SMS_RPOTO短信,1MMS_PROTO彩信
  
  read:是否阅读0未读,1已读
  
  status:短信状态-1接收,0complete,64pending,128failed
  
  type:短信类型1是接收到的,2是已发出
  
  body:短信具体内容
  
  service_center:短信服务中心号码编号,如+8613800755500


通过方式二,我们就能获取手机中所有的短消息了,可是还有一个问题,如果来了新的短消息呢?我们总不能写个线程,每隔多少秒,去读取一下短信数据库吧?其实我们可以把方式二换个方式写:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. private SmsObserver smsObserver;  
  2.   
  3.     protected void onCreate(Bundle savedInstanceState) {  
  4.         super.onCreate(savedInstanceState);  
  5.         setContentView(R.layout.app_login);  
  6.         smsObserver = new SmsObserver(this, smsHandler);  
  7.         getContentResolver().registerContentObserver(SMS_INBOX, true,  
  8.                 smsObserver);  
  9.   
  10.     }  
  11.     public Handler smsHandler = new Handler() {  
  12.         //这里可以进行回调的操作  
  13.         //TODO  
  14.   
  15.     };  
  16.     class SmsObserver extends ContentObserver {  
  17.   
  18.         public SmsObserver(Context context, Handler handler) {  
  19.             super(handler);  
  20.         }  
  21.   
  22.         @Override  
  23.         public void onChange(boolean selfChange) {  
  24.             super.onChange(selfChange);  
  25.             //每当有新短信到来时,使用我们获取短消息的方法  
  26.             getSmsFromPhone();  
  27.         }  
  28.     }  



效果:



前提--权限:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <uses-permission android:name="android.permission.RECEIVE_SMS" >  
  2. </uses-permission>  
  3. <uses-permission android:name="android.permission.READ_SMS" >  
  4. </uses-permission>  


方式一:通过广播监听短信消息

(注意:这种方式只对新收到的短消息有效,运行代码,并不会读取收件箱中已读或未读的消息,只有当收到新来的短消息时,才会执行onChange方法)


注册一个广播:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <receiver android:name="com.dbjtech.acbxt.waiqin.SmsReciver" >  
  2.            <intent-filter android:priority="999">  
  3.                <action android:name="android.provider.Telephony.SMS_RECEIVED" />  
  4.            </intent-filter>  
  5.        </receiver>  

SmsReceiver.java

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public class SmsReciver extends BroadcastReceiver {  
  2.   
  3.     @Override  
  4.     public void onReceive(Context context, Intent intent) {  
  5.         Bundle bundle = intent.getExtras();  
  6.         SmsMessage msg = null;  
  7.         if (null != bundle) {  
  8.             Object[] smsObj = (Object[]) bundle.get("pdus");  
  9.             for (Object object : smsObj) {  
  10.                 msg = SmsMessage.createFromPdu((byte[]) object);  
  11.             Date date = new Date(msg.getTimestampMillis());//时间  
  12.                 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
  13.                 String receiveTime = format.format(date);  
  14.                 System.out.println("number:" + msg.getOriginatingAddress()  
  15.                 + "   body:" + msg.getDisplayMessageBody() + "  time:"  
  16.                         + msg.getTimestampMillis());  
  17.                   
  18.                 //在这里写自己的逻辑  
  19.                 if (msg.getOriginatingAddress().equals("10086")) {  
  20.                     //TODO  
  21.                       
  22.                 }  
  23.                   
  24.             }  
  25.         }  
  26.     }  
  27.   
  28. }  


系统的这个广播是有序广播,就是当别的程序先获取到了这个广播再传递给你,当然它也可以干掉这个广播,让你接收不到,这样你的程序肯定是接收不到这个广播的了。我们发现,通过设置priority的数值,其实有时是不管用的,现在在一些定制的系统或是有安全软件的情况下,往往短消息都被截取到,并被干掉。

那么,我们只能使用方法二,监听短信数据库的变化,这种方式比方法一稍微复杂一些,不过使用起来也很方便,不受其它程序干扰~


方式二:通过短信数据库获取短信内容

(注意:这种方式可以获取手机上所有的短信,包括已读未读的短信,是不是很赞)

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. private Uri SMS_INBOX = Uri.parse("content://sms/");  
  2.     public void getSmsFromPhone() {  
  3.         ContentResolver cr = getContentResolver();  
  4.         String[] projection = new String[] { "body" };//"_id", "address", "person",, "date", "type  
  5.         String where = " address = '1066321332' AND date >  "  
  6.                 + (System.currentTimeMillis() - 10 * 60 * 1000);  
  7.         Cursor cur = cr.query(SMS_INBOX, projection, where, null"date desc");  
  8.         if (null == cur)  
  9.             return;  
  10.         if (cur.moveToNext()) {  
  11.             String number = cur.getString(cur.getColumnIndex("address"));//手机号  
  12.             String name = cur.getString(cur.getColumnIndex("person"));//联系人姓名列表  
  13.             String body = cur.getString(cur.getColumnIndex("body"));  
  14.             //这里我是要获取自己短信服务号码中的验证码~~  
  15.             Pattern pattern = Pattern.compile(" [a-zA-Z0-9]{10}");  
  16.             Matcher matcher = pattern.matcher(body);  
  17.             if (matcher.find()) {  
  18.                 String res = matcher.group().substring(111);  
  19.                 mobileText.setText(res);  
  20.             }  
  21.         }  
  22.     }  




sms主要结构:
  
  _id:短信序号,如100
  
  thread_id:对话的序号,如100,与同一个手机号互发的短信,其序号是相同的
  
  address:发件人地址,即手机号,如+86138138000
  
  person:发件人,如果发件人在通讯录中则为具体姓名,陌生人为null
  
  date:日期,long型,如1346988516,可以对日期显示格式进行设置
  
  protocol:协议0SMS_RPOTO短信,1MMS_PROTO彩信
  
  read:是否阅读0未读,1已读
  
  status:短信状态-1接收,0complete,64pending,128failed
  
  type:短信类型1是接收到的,2是已发出
  
  body:短信具体内容
  
  service_center:短信服务中心号码编号,如+8613800755500


通过方式二,我们就能获取手机中所有的短消息了,可是还有一个问题,如果来了新的短消息呢?我们总不能写个线程,每隔多少秒,去读取一下短信数据库吧?其实我们可以把方式二换个方式写:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. private SmsObserver smsObserver;  
  2.   
  3.     protected void onCreate(Bundle savedInstanceState) {  
  4.         super.onCreate(savedInstanceState);  
  5.         setContentView(R.layout.app_login);  
  6.         smsObserver = new SmsObserver(this, smsHandler);  
  7.         getContentResolver().registerContentObserver(SMS_INBOX, true,  
  8.                 smsObserver);  
  9.   
  10.     }  
  11.     public Handler smsHandler = new Handler() {  
  12.         //这里可以进行回调的操作  
  13.         //TODO  
  14.   
  15.     };  
  16.     class SmsObserver extends ContentObserver {  
  17.   
  18.         public SmsObserver(Context context, Handler handler) {  
  19.             super(handler);  
  20.         }  
  21.   
  22.         @Override  
  23.         public void onChange(boolean selfChange) {  
  24.             super.onChange(selfChange);  
  25.             //每当有新短信到来时,使用我们获取短消息的方法  
  26.             getSmsFromPhone();  
  27.         }  
  28.     }  



效果:




http://chatgpt.dhexx.cn/article/InCOoDjs.shtml

相关文章

想为自己的网站添加短信验证怎么弄_捷径教程讲解一云手机短信验证码接受平台的聚合...

除了最初发表的以"熔岩音乐"和"流利阅读"为范本&#xff0c;以及初学者入门点这里&#xff0c;内容太过于巨细靡遗&#xff0c;主要是为了给入门朋友详解相关的基本流程&#xff0c;但之后所有文章唯有对于实例的重点讲解&#xff0c;主要在于培养大家对于…

短信SMS的接收

近日&#xff0c;看了《第一行代码》有关短信接收的内容&#xff0c;就总结了一下。 1.手机接收到一条短信时&#xff0c;系统会发出一条android.provider.Telephy.SMS_RECEIVER的广播&#xff0c;这条广播带有短信的所有数据 2.首先定义xml文件 <LinearLayout android:layo…

阿里云——Java实现手机短信验证码功能

目录 如何实现短信验证码功能1.准备工作1.1 注册 阿里云 账号&#xff0c;并完成实名认证。找到短信服务功能。1.2 开通短信服务1.3 签名与模板1.4 获取AccessKey1.5 打开短信控制台&#xff0c;通过API测试功能 2.Java SDK 示例2.1 添加maven依赖2.2 阿里云官方配置 如何实现短…

Android短信Mms接受流程

本文主要介绍Android如何接收短信&#xff0c;流程分为两个部分&#xff0c;Framework层和App层。 Framework层&#xff1a; 短信的接收&#xff0c;Framework部分处理的顺序是RIL->SMSDispatcher->GsmSMSDispatcher/CdmaSMSDispatcher->SMSDispatcher。 当短信到Fram…

vue实现一键换肤功能

1.创建所需要替换的css文件&#xff0c;1个皮肤对应一个&#xff0c;放在同一个目录 2.用link在index.html引入你所要用的皮肤css文件 3.在你需要实现换肤的页面添加方法 &#xff08;1&#xff09;首次加载&#xff0c;默认选中第一个皮肤&#xff0c;之后就选择最后所选的皮…

App一键换肤功能

实现应用皮肤随意切换&#xff0c;这里只做基础展示&#xff0c;一个是常规肤色&#xff0c;一个是夜晚模式肤色 效果如下&#xff1a; 步骤如下&#xff1a; 1、引入换肤三方框架 2、在Application中对换肤SkinCompatManager进行初始化 3、在main下新建自己对应肤色res文件…

微信小程序——如何一键换肤

小程序一键换肤不难&#xff0c;在这之前需要了解CSS的 var() 函数 方法如下&#xff1a; 先在page页面里创建一个包含所有元素的view标签&#xff0c;并为其配置style颜色的数据绑定&#xff1a; js如下&#xff1a; 此后我们只需要通过this.setData({})的方法改变data里…

Android hook技术实现一键换肤,移动应用开发项目案例

3. 利用HOOK技术实现优雅的“一键换肤" 什么是hook**如题,我是用hook实现一键换肤。那么什么是hook? hook,钩子. 安卓中的hook技术,其实是一个抽象概念:对系统源码的代码逻辑进行"劫持",插入自己的逻辑,然后放行。注意:hook可能频繁使用java反射机制**…

react+antd+vite配置一键换肤功能(步骤详细)

一、首先需要下载less、less-loader&#xff0c;然后在vite.config.js中配置如下 二、再全局引入node_modules中的less文件 三、引入antd中全局化配置组件,详细配置请参考官网ConfigProvider 四、最后通过ConfigProvider.config中的参数进行动态配置&#xff0c;从而改变主题…

Vue Element-ui 一键换肤的方案(第二种)

目录 前言 1、新建类名 2、定义变量 3、使用 4、关于切换主题的逻辑 总结 前言 因为涉及到除了ui库以外的样式需要配置两个风格或者更多的颜色&#xff0c;所以有了这个方案的出现。 1、新建类名 首先在style找到element这个文件夹&#xff0c;在base-variable.scss里&am…

前端项目一键换肤vue+element(ColorPicker)

前端项目一键换肤 1.需要配色的都是用变量声明 2.增加颜色选择器 3.改变颜色&#xff0c;更改初始值 1.需要配色的都是用变量声明 /* 全局样式 */ body {// 无需改变--light_color_aside: #f6f6f6;// 主题色--light_colourt: #E60027;--theme_color: #EC5E59;--light_color_b…

前端 “一键换肤“ 的几种方案

作者&#xff1a;熊的猫 原文&#xff1a;https://juejin.cn/post/7063010855167721486 前端 “一键换肤“ 的几种方案 前言 现在越来越多的网站都提供了拥有换肤&#xff08;切换主题&#xff09;功能&#xff0c;如 ElementUI&#xff0c;既是为了迎合用户需求&#xff0c;或…

element-plus简易一键换肤

哈喽&#xff0c;大家好我是小衰&#xff0c;勤勤恳恳一码农&#xff0c;低级前端工程师&#xff0c;不吃甲方零食下午茶&#xff0c;热爱用双手解决问题&#xff0c;白天用双手敲代码 晚上用双手做一些正能量的事情&#xff0c;夜深了&#xff0c;由于小哀在公司勤勤恳恳的努力…

vue 一键换肤 换主题

该一键换肤只是定义好几个颜色&#xff0c;并进行简单的切换。 在src下的assets文件下面定义一个css文件夹&#xff0c;在对应的文件里面定义_handle.scss和_themes.scss文件&#xff0c;如下&#xff1a; image.png 2.在_themes.scss文件里面定义好需要用到的几个样式。如下…

如何利用 SCSS 实现一键换肤

环境准备 首先我们需要安装 scss 解析环境 npm i sass // 注意 sass-loader 安装需要指定版本 如果安装最新版本会报错 this.getOptions 这个方法未定义 npm i -D sass-loader10.1.0 // 利用 normalize.css 初始化页面样式 npm i -S normalize.css 小技巧 这里讲一个小技巧&a…

项目实现一键换肤的功能

在publick下面分别建立两个文件 一个是默认的一个是夜间的 然后在app。vue入口文件 mounted(){let colorName localStorage.getItem(themes) || defaultlet link document.createElement(link)link.type text/csslink.relstylesheetlink.href /themes/${colorName}.cssdocu…

从零开始Vue3+Element Plus后台管理系统(17)——一键换肤的N种方案

暗黑模式 基于Element Plus和Tailwind CSS灵活的设计&#xff0c;我们很容易在项目中实现暗黑模式&#xff0c;具体可以参考之前的文章《从零开始写一个Vue3Element Plus的后台管理系统(二)——Layout页面布局的实现》 换肤方案 如果需要给用户提供更多主题&#xff0c;更丰…

三步实现Android应用内一键换肤,无需重启应用,无需编写多余代码

古人学问无遗力&#xff0c;少壮工夫老始成。 纸上得来终觉浅&#xff0c;绝知此事要躬行。 --《冬夜读书示子聿》 陆游 换肤效果演示 四种皮肤切换&#xff1a;默认白色、蓝色、绿色和玫瑰红&#xff1a; 前言 先给大家介绍一下现在比较主流的、Star比较多的换肤框架&#…

前端 “一键换肤“ 的 N 种方案

前端瓶子君&#xff0c;关注公众号 回复算法&#xff0c;加入前端编程面试算法每日一题群 前言 现在越来越多的网站都提供了拥有换肤&#xff08;切换主题&#xff09;功能&#xff0c;如 ElementUI[2]&#xff0c;既是为了迎合用户需求&#xff0c;或是为了凸显自己特点&#…