收到短信了,我该做点什么?

接收短信后,发送系统广播实现显示短信内容 本示例实现,当用户接收到短信后,向系统发送广播,这里在接收广播后,只是显示一条Toast提示作为后续处理 在模拟器中存在一个问题,如果发送中文短信,接收显示乱码,需要在发送端作编码为UTF8的处理,而不是在接收端作解码处理 有手机上没有问题 立即下载

转自:http://dev.10086.cn/cmdn/bbs/viewthread.php?tid=22235&highlight=

 

 

本文为《Android/OPhone开发完全讲义》一书的内容连载。转载请注明出处

短信是手机中经常使用到的一种服务。然而,当手机接收到短信时,也会向系统发送广播。如果我们的应用程序要在手机接收到短信后做点什么,那就需要接收这个系统广播。 
接收系统广播的步骤我们已经熟悉了,下面就按步就班地来完成这两个步骤。 
1.
编写一个 SMSReceiver类来接收系统广播。

[c-sharp:nogutter]  view plain copy
  1. package net.blogjava.mobile.sms;  
  2. 02     
  3. 03  import android.content.BroadcastReceiver;  
  4. 04  import android.content.Context;  
  5. 05  import android.content.Intent;  
  6. 06  import android.os.Bundle;  
  7. 07  import android.telephony.gsm.SmsMessage;  
  8. 08  import android.widget.Toast;  
  9. 09     
  10. 10  public class SMSReceiver extends BroadcastReceiver  
  11. 11  {  
  12. 12      @Override  
  13. 13      public void onReceive(Context context, Intent intent)  
  14. 14      {  
  15. 15          //  判断接收到的广播是否为收到短信的Broadcast Action  
  16. 16          if ("android.provider.Telephony.SMS_RECEIVED".equals(intent.getAction()))  
  17. 17          {  
  18. 18              StringBuilder sb = new StringBuilder();  
  19. 19              // 接收由SMS传过来的数据  
  20. 20              Bundle bundle = intent.getExtras();  
  21. 21              // 判断是否有数据  
  22. 22              if (bundle != null)  
  23. 23              {  
  24. 24                  //  通过pdus可以获得接收到的所有短信消息  
  25. 25                  Object[] objArray = (Object[]) bundle.get("pdus");  
  26. 26                  //  构建短信对象array,并依据收到的对象长度来创建array的大小  
  27. 27                  SmsMessage[] messages = new SmsMessage[objArray.length];  
  28. 28                  for (int i = 0; i < objArray.length; i++)  
  29. 29                  {  
  30. 30                      messages[i] = SmsMessage.createFromPdu((byte[]) objArray[i]);  
  31. 31                  }  
  32. 32                  //  将送来的短信合并自定义信息于StringBuilder当中  
  33. 33                  for (SmsMessage currentMessage : messages)  
  34. 34                  {  
  35. 35                      sb.append("短信来源:");  
  36. 36                      // 获得接收短信的电话号码  
  37. 37                      sb.append(currentMessage.getDisplayOriginatingAddress());  
  38. 38                      sb.append("/n------短信内容------/n");  
  39. 39                      // 获得短信的内容  
  40. 40                      sb.append(currentMessage.getDisplayMessageBody());  
  41. 41                  }  
  42. 42              }  
  43. 43              Intent mainIntent = new Intent(context, Main.class);  
  44. 44              mainIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);              
  45. 45              context.startActivity(mainIntent);  
  46. 46              //  使用Toast信息提示框显示接收到的短信内容  
  47. 47              Toast.makeText(context, sb.toString(), Toast.LENGTH_LONG).show();  
  48. 48          }  
  49. 49      }  
  50. 50  }  

在编写 SMSReceiver类时需要注意如下 4点:

  • 接收短信的Broadcast Action是android.provider.Telephony.SMS_RECEIVED,因此,要在onReceiver方法的开始部分判断接收到的是否是接收短信的Broadcast Action。
  • 需要通过Bundle.get("pdus")来获得接收到的短信消息。这个方法返回了一个表示短信内容的数组。每一个数组元素表示一条短信。这就意味着通过Bundle.get("pdus")可以返回多条系统接收到的短信内容。
  • 通过Bundle.get("pdus")返回的数组一般不能直接使用,需要使用SmsMessage.createFromPdu方法将这些数组元素转换成SmsMessage对象才可以使用。每一个SmsMessage对象表示一条短信。
  • 通过SmsMessage类的getDisplayOriginatingAddress方法可以获得发送短信的电话号码。通过getDisplayMessageBody方法可以获得短信的内容。


2.
在 AndroidManifest.xml文件中配置 SMSReceiver类,代码如下:

[xhtml]  view plain copy
  1. 1   <receiver android:name="SMSReceiver">              
  2. 2       <intent-filter>  
  3. 3           <!--  指定SMSReceiver可以接收的Broadcast Action  -->  
  4. 4           <action android:name="android.provider.Telephony.SMS_RECEIVED" />  
  5. 5       </intent-filter>  
  6. 6   </receiver>  

为了使应用程序可以成功地接收 SMS_RECEIVED广播,还需要使用 <uses-permission>标签为应用程序打开接收短信的权限,代码如下:

[xhtml]  view plain copy
  1. <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>  
 

现在启动应用程序,界面上会显示“等待接收短信 ...”的信息。那么这里还有一个问题。如果我们在模拟器上测试这个程序呢? 
解决这个问题并不难, Android模拟器不仅可以模拟程序的运行,还可以模拟手机的很多动作,例如,发短信就是其中之一。要模拟手机的动作,仍然要求助于 DDMS透视图。在 DDMS透视图中有一个【 Emulator Control】视图(如果 DDMS中没有这个视图,请读者通过 Eclipse的【 Window】 >【 Show View】菜单项来显示这个视图)。在【 Telephone Actions】分组框,选中 SMS选项框,并在【 Incomingnumber】文本框中输入一个电话号,然后在【 Message】文本框中输入要发送的短信内容,最后单击【 Send】按钮来模拟发送短信。输入相应信息后的【 Emulator Control】视图如图1 所示。当单击【 Send】按钮后,手机模拟器就会接收到短信,不管接收短信的应用程序是否启动,都会显示如图 2所示的显示短信内容的 Toast信息提示框。

ArcGIS Pro实战:用时空立方体分析共享单车轨迹数据(含3D可视化技巧) 本文详细介绍了在ArcGIS Pro中利用时空立方体技术分析共享单车轨迹数据的全流程。从数据预处理、构建时空立方体,到执行新兴时空热点分析,并最终实现动态3D可视化,手把手教你挖掘城市骑行活动的时空规律。文章重点解析了工具参数设置、常见报错解决方案,并提供了可复用的Python脚本,助力城市规划与交通研究者高效完成时空模式挖掘。 阅读详情

相关推荐

OpenWebUI外部模型配置异常排查与修复指南

本文详细解析了OpenWebUI外部模型配置异常的常见问题及解决方案,包括隐藏字符、数据库锁死等典型现象。通过错误日志分析和数据库修复实战指南,帮助开发者快速定位并解决配置问题,确保OpenWebUI与第三方大模型的稳定连接。

weixin_29205061的博客 310

【Android】四大组件之BroadcastReceiver

广播接收者的配置和使用,对应的应用场景,以及常用的广播接收者

WzhVae的博客 588

S型速度曲线C程序实现

S型速度曲线C语言程序实现 前言 S型曲线相较于梯形速度曲线具有运行更加平稳的特点,S型曲线共有八种运行情况,感兴趣可以查阅相关文献 代码段 #include <stdio.h> #include <math.h> #define FP64 double int main(void) { /**************************** 定义相关变量(需要映射到PLC寄存器才能进行监控) ***********************/ FP6

LSX312441548的博客 8392

系统广播详解之接收短信

上一次讲解了系统开机自动运行的广播,这次讲解系统广播中的SMS广播。 1、编写一个系统广播接收类 public class SMSReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if ("android.provi

eclipse_xu 2050

【学习笔记】无人机(UAV)在3GPP系统中的增强支持(四)-无人机系统(UAS)命令与控制(C2)通信用例

UTM向5G网络提供无人机系统C2通信所需的信息,例如服务类别、无人机系统服务的流量类型、授权的无人机系统服务所需的QoS以及无人机系统服务的订阅。遵循模型B的网络辅助C2模型,为了确保UAS操作的C2通信的服务可用性和可靠性,特别是当无人机在操作员的视线之外(BLOS)飞行时,为无人机提供支持冗余的C2通信链路。如果需要创建额外的C2通信连接或更改现有数据连接的配置以进行C2通信,则5G网络会根据无人机系统的授权服务信息和C2通信中所需的QoS和优先级,修改或分配一个或多个C2通信流量的QoS流。

u011376987的博客 2052

Ubuntu 20.04 server 安装

Ubuntu 20.04 server 安装 前面我们介绍了 Ubuntu Desktop 版本的安装,今天我们来看看 Ubuntu server 版本的安装。Ubuntu Server 版本的安装和 Desktop 有很大的区别,并且全程不能使用鼠标,只能通过键盘。 从光盘或 U 盘启动到 Welcome 界面,选择语言,一般都是使用 English,所以保保持默认,直接按回车即可; 系统检测到了新的版本,问你是否是否更新,这里我们不需要安装新的版本,所以选项 Continue without upda

as900的博客 1万+

Android面试常客--四大组件之BroadcastReceiver

今天我们要讲的主角是四大组件之BroadcastReceiver(广播),面试官一般都会问到怎么去注册广播啊,这样注册广播会有啥区别的?还有一些广播的知识点也是需要掌握的。

meHao的专栏 426

肖特基二极管的反向恢复过程

本博客简述肖特基二极管反向恢复过程。

记得诚 1万+

《Android/OPhone开发完全讲义》连载(8):收到短信了,我该做点什么?

本文为《Android/OPhone开发完全讲义》一书的内容连载。转载请注明出处<br /><br />    短信是手机中经常使用到的一种服务。然而,当手机接收到短信时,也会向系统发送广播。如果我们的应用程序要在手机接收到短信后做点什么,那就需要接收这个系统广播。<br />接收系统广播的步骤我们已经熟悉了,下面就按步就班地来完成这两个步骤。<br /> 1.编写一个SMSReceiver类来接收系统广播。<br /><br />package net.blogjava.mobile.sms;<br /

一个被知识诅咒的人 941

AI Agent Harness内容审核:生成内容合规

在过去的几年里,生成式人工智能(Generative AI)技术取得了爆炸性的发展。从 GPT-4、Claude 这样的文本生成模型,到 Midjourney、Stable Diffusion 这样的图像生成工具,再到 Sora 这样的视频生成模型,AI 已经具备了媲美甚至超越人类的内容创作能力。然而,技术是一把双刃剑。随着生成式 AI 的普及,内容安全与合规风险也呈指数级增长。

AI架构师小马 300

深入C++学习还必须掌握的一基础知识精讲

施磊C++语言基础提高课程笔记,包括了new/delete;malloc/free;引用和指针;const,指计和引用的结合;函数重载,inline的数,参数带默认值的函数;函数模板等知识点

GeniusAng的博客 1479
上一篇: android开发中遇到sqlite3 not found
下一篇: 序列化:java.io.Serializable
mywebstudy
博客等级 码龄15年 30粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值