获取短信内容

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

相关文章

如何利用Java获取当天的开始和结束时间

《如何利用Java获取当天的开始和结束时间》:本文主要介绍如何使用Java8的LocalDate和LocalDateTime类获取指定日期的开始和结束时间,展示了如何通过这些类进行日期和时间的处... 目录前言1. Java日期时间API概述2. 获取当天的开始和结束时间代码解析运行结果3. 总结前言在J

java获取图片的大小、宽度、高度方式

《java获取图片的大小、宽度、高度方式》文章介绍了如何将File对象转换为MultipartFile对象的过程,并分享了个人经验,希望能为读者提供参考... 目China编程录Java获取图片的大小、宽度、高度File对象(该对象里面是图片)MultipartFile对象(该对象里面是图片)总结java获取图片

Java通过反射获取方法参数名的方式小结

《Java通过反射获取方法参数名的方式小结》这篇文章主要为大家详细介绍了Java如何通过反射获取方法参数名的方式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、前言2、解决方式方式2.1: 添加编译参数配置 -parameters方式2.2: 使用Spring的内部工具类 -

Java如何获取视频文件的视频时长

《Java如何获取视频文件的视频时长》文章介绍了如何使用Java获取视频文件的视频时长,包括导入maven依赖和代码案例,同时,也讨论了在运行过程中遇到的SLF4J加载问题,并给出了解决方案... 目录Java获取视频文件的视频时长1、导入maven依赖2、代码案例3、SLF4J: Failed to lo

使用Java实现获取客户端IP地址

《使用Java实现获取客户端IP地址》这篇文章主要为大家详细介绍了如何使用Java实现获取客户端IP地址,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 首先是获取 IP,直接上代码import org.springframework.web.context.request.Requ

C++实现获取本机MAC地址与IP地址

《C++实现获取本机MAC地址与IP地址》这篇文章主要为大家详细介绍了C++实现获取本机MAC地址与IP地址的两种方式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 实际工作中,项目上常常需要获取本机的IP地址和MAC地址,在此使用两种方案获取1.MFC中获取IP和MAC地址获取

C/C++通过IP获取局域网网卡MAC地址

《C/C++通过IP获取局域网网卡MAC地址》这篇文章主要为大家详细介绍了C++如何通过Win32API函数SendARP从IP地址获取局域网内网卡的MAC地址,感兴趣的小伙伴可以跟随小编一起学习一下... C/C++通过IP获取局域网网卡MAC地址通过win32 SendARP获取MAC地址代码#i

5分钟获取deepseek api并搭建简易问答应用

《5分钟获取deepseekapi并搭建简易问答应用》本文主要介绍了5分钟获取deepseekapi并搭建简易问答应用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需... 目录1、获取api2、获取base_url和chat_model3、配置模型参数方法一:终端中临时将加

C#实现系统信息监控与获取功能

《C#实现系统信息监控与获取功能》在C#开发的众多应用场景中,获取系统信息以及监控用户操作有着广泛的用途,比如在系统性能优化工具中,需要实时读取CPU、GPU资源信息,本文将详细介绍如何使用C#来实现... 目录前言一、C# 监控键盘1. 原理与实现思路2. 代码实现二、读取 CPU、GPU 资源信息1.

在C#中获取端口号与系统信息的高效实践

《在C#中获取端口号与系统信息的高效实践》在现代软件开发中,尤其是系统管理、运维、监控和性能优化等场景中,了解计算机硬件和网络的状态至关重要,C#作为一种广泛应用的编程语言,提供了丰富的API来帮助开... 目录引言1. 获取端口号信息1.1 获取活动的 TCP 和 UDP 连接说明:应用场景:2. 获取硬