获取短信内容

2024-08-26 05:32
文章标签 获取 短信内容

本文主要是介绍获取短信内容,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近做的项目里要监听手机的短消息内容,这个东西好像在最初学的时候都做过,不过现在早忘记了,现在写下来,记住了。



前提--权限:

[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://www.chinasem.cn/article/1107683

相关文章

MySQL 获取字符串长度及注意事项

《MySQL获取字符串长度及注意事项》本文通过实例代码给大家介绍MySQL获取字符串长度及注意事项,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 获取字符串长度详解 核心长度函数对比⚠️ 六大关键注意事项1. 字符编码决定字节长度2

python3如何找到字典的下标index、获取list中指定元素的位置索引

《python3如何找到字典的下标index、获取list中指定元素的位置索引》:本文主要介绍python3如何找到字典的下标index、获取list中指定元素的位置索引问题,具有很好的参考价值,... 目录enumerate()找到字典的下标 index获取list中指定元素的位置索引总结enumerat

SpringMVC高效获取JavaBean对象指南

《SpringMVC高效获取JavaBean对象指南》SpringMVC通过数据绑定自动将请求参数映射到JavaBean,支持表单、URL及JSON数据,需用@ModelAttribute、@Requ... 目录Spring MVC 获取 JavaBean 对象指南核心机制:数据绑定实现步骤1. 定义 Ja

C++中RAII资源获取即初始化

《C++中RAII资源获取即初始化》RAII通过构造/析构自动管理资源生命周期,确保安全释放,本文就来介绍一下C++中的RAII技术及其应用,具有一定的参考价值,感兴趣的可以了解一下... 目录一、核心原理与机制二、标准库中的RAII实现三、自定义RAII类设计原则四、常见应用场景1. 内存管理2. 文件操

SpringBoot服务获取Pod当前IP的两种方案

《SpringBoot服务获取Pod当前IP的两种方案》在Kubernetes集群中,SpringBoot服务获取Pod当前IP的方案主要有两种,通过环境变量注入或通过Java代码动态获取网络接口IP... 目录方案一:通过 Kubernetes Downward API 注入环境变量原理步骤方案二:通过

使用Python实现获取屏幕像素颜色值

《使用Python实现获取屏幕像素颜色值》这篇文章主要为大家详细介绍了如何使用Python实现获取屏幕像素颜色值,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、一个小工具,按住F10键,颜色值会跟着显示。完整代码import tkinter as tkimport pyau

python获取cmd环境变量值的实现代码

《python获取cmd环境变量值的实现代码》:本文主要介绍在Python中获取命令行(cmd)环境变量的值,可以使用标准库中的os模块,需要的朋友可以参考下... 前言全局说明在执行py过程中,总要使用到系统环境变量一、说明1.1 环境:Windows 11 家庭版 24H2 26100.4061

使用Python获取JS加载的数据的多种实现方法

《使用Python获取JS加载的数据的多种实现方法》在当今的互联网时代,网页数据的动态加载已经成为一种常见的技术手段,许多现代网站通过JavaScript(JS)动态加载内容,这使得传统的静态网页爬取... 目录引言一、动态 网页与js加载数据的原理二、python爬取JS加载数据的方法(一)分析网络请求1

通过cmd获取网卡速率的代码

《通过cmd获取网卡速率的代码》今天从群里看到通过bat获取网卡速率两段代码,感觉还不错,学习bat的朋友可以参考一下... 1、本机有线网卡支持的最高速度:%v%@echo off & setlocal enabledelayedexpansionecho 代码开始echo 65001编码获取: >

使用Python实现调用API获取图片存储到本地的方法

《使用Python实现调用API获取图片存储到本地的方法》开发一个自动化工具,用于从JSON数据源中提取图像ID,通过调用指定API获取未经压缩的原始图像文件,并确保下载结果与Postman等工具直接... 目录使用python实现调用API获取图片存储到本地1、项目概述2、核心功能3、环境准备4、代码实现