第一章 短信安全 短信发送和拦截.

Slides:



Advertisements
Similar presentations
7.1 内置对象概述及分类 JSP 视频教学课程. JSP2.2 目录 1. 内置对象简介 1. 内置对象简介 2. 内置对象分类 2. 内置对象分类 3. 内置对象按功能区分 3. 内置对象按功能区分 4. 内置对象作用范围 4. 内置对象作用范围.
Advertisements

面向侧面的程序设计 方林博士 本文下载地址:
第六 章数据库访问页 6.1 数据访问页视图 6.2 创建数据访问页 6.3 编辑数据访问页 6.4 查看数据访问页 退出.
Part 2 開發Android應用程式的流程
位置與地圖應用 此投影片為講解Android如何取得定位經緯度和使用Google Map地圖.
Oracle数据库 Oracle 子程序.
在PHP和MYSQL中实现完美的中文显示
陈香兰 助教:陈博、李春华 Spring 2009 嵌入式操作系统 陈香兰 助教:陈博、李春华 Spring 2009.
厦门大学数据库实验室 报告人:谢荣东 导师:林子雨 2014年8月30日
移动开发的灵便迭代之道 黄凯.
Kvm异步缺页中断 浙江大学计算机体系结构实验室 徐浩.
第9章 BroadcastReceiver的使用
Ch5 Android應用程式的主要組成.
Chapter 7 Android應用元件 Android應用元件可以幫助我們獲得系統資源訊息(ActivityManager)、提供系統服務(Service)、搜尋系統服務(SearchManager)、監聽Intent訊息(Broadcast Receiver)以及資料共享(ContentProvider和ContentResolver)。
第八章 菜单设计 §8.1 Visual FoxPro 系统菜单 §8.2 为自己的程序添加菜单 §8.3 创建快捷菜单.
第9章 使用意圖啟動活動與內建應用程式 9-1 意圖的基礎 9-2 使用意圖啟動活動
第6章 Android广播接收器 (BroadcastReceiver)
6.4 Notification 通知栏.
SOA – Experiment 3: Web Services Composition Challenge
走进编程 程序的顺序结构(二).
辅导课程六.
第8章 Service解析.
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
Windows网络操作系统管理 ——Windows Server 2008 R2.
第五讲 四则运算计算器(一) 精品教程《C#程序设计与应用(第2版)清华大学出版社 谭恒松 主编
以ISI平台为例,为您演示一下如何在Endnote文献中查看该文献的References
Android 视频教程简介.
本节内容 模拟线程切换 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
用event class 从input的root文件中,由DmpDataBuffer::ReadObject读取数据的问题
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
SOA – Experiment 2: Query Classification Web Service
Android Application Component
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
内容摘要 ■ 课程概述 ■ 教学安排 ■ 什么是操作系统? ■ 为什么学习操作系统? ■ 如何学习操作系统? ■ 操作系统实例
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
$9 泛型基础.
電子郵件簡介.
本节内容 随机读取 视频提供:昆山爱达人信息技术有限公司.
VisComposer 2019/4/17.
实验四、TinyOS执行机制实验 一、实验目的 1、了解tinyos执行机制,实现程序异步处理的方法。
VB与Access数据库的连接.
Aspect Oriented Programming
Lightweight Data-flow Analysis for Execution-driven Constraint Solving
Web安全基础教程
本节内容 Win32 API中的宽字符 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
iSIGHT 基本培训 使用 Excel的栅栏问题
3.16 枚举算法及其程序实现 ——数组的作用.
_13简单的GDI绘图操作 本节课讲师——void* 视频提供:昆山爱达人信息技术有限公司 官网地址:
本节内容 文件系统 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
Chapter 18 使用GRASP的对象设计示例.
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
Visual Basic程序设计 第13章 访问数据库
辅导课程十五.
VRP教程 2011.
Lync 2013 for Android 课程摘要卡 加入 Lync 会议 登录并开始使用 在会议中启动您的视频 更改状态或注销
Python 环境搭建 基于Anaconda和VSCode.
本节内容 Windows线程切换_时钟中断切换 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
_08文件操作 本节课讲师——void* 视频提供:昆山爱达人信息技术有限公司 官网地址:
WSAAsyncSelect 模型 本节内容 视频提供:昆山爱达人信息技术有限公司 视频录制:yang
基于列存储的RDF数据管理 朱敏
本节内容 动态链接库 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第9章 BroadcastReceiver的使用
本节内容 进程 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第四章 UNIX文件系统.
第十七讲 密码执行(1).
创建、启动和关闭Activity 本讲大纲: 1、创建Activity 2、配置Activity 3、启动和关闭Activity
使用Fragment 本讲大纲: 1、创建Fragment 2、在Activity中添加Fragment
顺序结构程序设计 ——关于“字符串”和数值.
Part 8 Broadcast Receiver、Service和App Widget
多个Activity的使用 本讲大纲: 1、使用Bundle在Activity之间交换数据 2、调用另一个Activity并返回结果
Presentation transcript:

第一章 短信安全 短信发送和拦截

学习目标 了解在Android中如何实现短信发送与接收功能 短信拦截作用及其必要性 通过运行两个Android模拟器,介绍在Android中如何实现短信服务(SMS,short message service)的功能。 此页列出学习本课程需要达到的目标。 此页胶片仅在授课时使用,胶片+注释中有单独的文字说明课程目标,不需要再使用该页胶片。 2

短信 short message service,简称SMS 是用户通过手机或其他电信终端直接发送或接收的文字或数字信息,用户每次能接收和发送短信的字符数,是160个英文或数字字符,或者70个中文字符。

android 短信流程分析 参考 http://lzd20021683.iteye.com/blog/1306918

系统的短信库存在data/data/com. android. providers. telephony/databases/mmssms 系统的短信库存在data/data/com.android.providers.telephony/databases/mmssms.db

1 SMS发送API Android 使用SmsManager发送短信 public void sendTextMessage (String destinationAddress, String scAddress, String text, PendingIntent sentIntent, PendingIntent deliveryIntent) destinationAddress:  收件人地址 scAddress:  短信中心号码,空为默认中心号码 sentIntent: 当消息发出时,成功或者失败的信息报告通过PendingIntent来广播。如果该参数为空,则发信程序会被所有位置程序检查一遍,这样会导致发送时间延长。 deliveryIntent: 当消息发送到收件人时,该PendingIntent会被广播。pdu数据在状态报告的extended data (“pdu”)中。 抛出 IllegalArgumentException  如果收件人或者信息为空。

1 SMS发送API public static PendingIntent getBroadcast (Context context, int requestCode, Intent intent, int flags) 返回一个用于广播的PendingIntent,类似于调用Context.sendBroadcast()函数,requestCode 暂时不用 intent 是用于广播的intent flags 有:FLAG_ONE_SHOT, FLAG_NO_CREATE, FLAG_CANCEL_CURRENT, FLAG_UPDATE_CURRENT 用于设置新建的PendingIntent是使用一次、如无则不创建、取消当前、更新当前等属性。

void sendMultipartTextMessage(String destinationAddress, String scAddress, ArrayList<String> parts,ArrayList<PendingIntent> sentIntents, ArrayList<PendingIntent>  deliverIntents)  发送一个基于SMS的多部分文本,调用者应用已经通过调用divideMessage(String text)将消息分割成正确的大小。 

2 SMS发送程序分析 讲解例子SendDemo 第一步:设计界面

2 SMS发送程序分析 第一步:设计界面 编辑布局文件res/layout/main.xml 在res/values/strings.xm中添加上面定义的视图的text的值

2 SMS发送程序分析 第二步:编写代码实现简单的短信发送 在java源文件中,获取用户在edtPhoneNo中输入的电话号码,edtContent中输入要发送的内容;然后点击btnSend按钮发送短信,要达到这个目的我们要设置btnSend的OnClickListener以达到当点击它触发发送短信的功能,而且要发送短信就要用到我们前面介绍的SmsManager类提供的方法接口。

btnSend的OnClickListener的代码 发送短信的功能的代码sendSMS

2 SMS发送程序分析 第三步:在清单文件AndroidManifest.xml中加入允许发送短信的权限 <uses-permission android:name="android.permission.SEND_SMS"/>

课堂练习1 增强发送短信功能,使其能够发送超长短信以及查看短信是否成功被接收 解决办法:为了跟踪发出的短信的状态,需要修改sendTextMessage方法中的第4个和第5个参数,即sentIntent和deliveryIntent。第4个参数-sendIntent,当消息成功发送或发送失败都将被触发。广播接收者的结果码,Activity.RESULT_OK表示成功,或RESULT_ERROR_GENERIC_FAILURE、RESULT_ERROR_RADIO_OFF、RESULT_ERROR_NULL_PDU之一表示错误。对应RESULT_ERROR_GENERIC_FAILURE,sentIntent可能包括额外的“错误代码”包含一个无线电广播技术特定的值,通常只在修复故障时有用。第5个参数-deliveryIntent,仅当目标接收到你的SMS消息才触发。

3 SMS拦截API 演示一个小例子:通过DDMS给SendDemo虚拟机发送一条短信 广播接收者(BroadcastReceiver)用于接收广播Intent,广播Intent的发送是通过调用Context.sendBroadcast()、Context.sendOrderedBroadcast()来实现的。通常一个广播Intent可以被订阅了此Intent的多个广播接收者所接收,这个特性跟JMS中的Topic消息接收者类似。

3 SMS拦截API BroadcastReceiver是android中用处巨大的异步消息机制。一个BroadcastReceiver对象的生命周期不超过5秒,不能绑定服务和做一些耗时的操作,但是用来接收信息则戳戳有余。 public void onReceive(Context context, Intent intent) 

3 SMS拦截API 广播接收者的响应 在Android中,每次广播消息到来时都会创建BroadcastReceiver实例并执行onReceive() 方法, onReceive() 方法执行完后,BroadcastReceiver 的实例就会被销毁。当onReceive() 方法在10秒内没有执行完毕,Android会认为该程序无响应。所以在BroadcastReceiver里不能做一些比较耗时的操作,否则会弹出ANR(Application No Response)的对话框。如果需要完成一项比较耗时的工作,应该通过发送Intent给Service,由Service来完成。

3 SMS拦截API 这里不能使用子线程来解决,因为BroadcastReceiver的生命周期很短,子线程可能还没有结束BroadcastReceiver就先结束了。 BroadcastReceiver一旦结束,此时BroadcastReceiver的所在进程很容易在系统需要内存时被优先杀死,因为它属于空进程(没有任何活动组件的进程)。如果它的宿主进程被杀死,那么正在工作的子线程也会被杀死。所以采用子线程来解决是不可靠的。

3 SMS拦截API public class IncomingSMSReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //发送Intent启动服务,由服务来完成比较耗时的操作 Intent service = new Intent(context, XxxService.class); context.startService(service); }

3 SMS拦截API 广播被分为两种不同的类型:“普通广播(Normal broadcasts)”和“有序广播(Ordered broadcasts)”。普通广播是完全异步的,可以在同一时刻(逻辑上)被所有接收者接收到,消息传递的效率比较高,但缺点是:接收者不能将处理结果传递给下一个接收者,并且无法终止广播Intent的传播;然而有序广播是按照接收者声明的优先级别,被接收者依次接收广播。如:A的级别高于B,B的级别高于C,那么,广播先传给A,再传给B,最后传给C 。

3 SMS拦截API 优先级别声明在intent-filter元素的android:priority属性中,数越大优先级别越高,取值范围:-1000到1000,优先级别也可以调用IntentFilter对象的setPriority()进行设置 。有序广播的接收者可以终止广播Intent的传播,广播Intent的传播一旦终止,后面的接收者就无法接收到广播。另外,有序广播的接收者可以将数据传递给下一个接收者,如:A得到广播后,可以往它的结果对象中存入数据,当广播传给B时,B可以从A的结果对象中得到A存入的数据。

3 SMS拦截API Context.sendBroadcast(),发送的是普通广播,所有订阅者都有机会获得并进行处理。 Context.sendOrderedBroadcast(),发送的是有序广播,系统会根据接收者声明的优先级别按顺序逐个执行接收者,前面的接收者有权终止广播 BroadcastReceiver.abortBroadcast()中断广播的继续传递,实现拦截短信的功能。

3 SMS拦截API 如果发出的广播属于有序广播。如果不想让比他优先级低的人收到这个信息,那就在onReceiver()方法的最后加上这个abortBroadcast() ,这样就中断了广播的继续传递 如果广播被前面的接收者终止,后面的接收者就再也无法获取到广播。对于有序广播,前面的接收者可以将数据通过setResultExtras(Bundle)方法存放进结果对象,然后传给下一个接收者,下一个接收者通过代码:Bundle bundle = getResultExtras(true))可以获取上一个接收者存入在结果对象中的数据。

4 SMS拦截例子分析 例子:使用广播接收者监听短信 本程序设计了一个可以接收短信的程序,将捕捉到的短信广播信息,拆解为可阅读的消息正文,而后以Toast的方式输出至手机。 当系统收到短信时,会发出一个广播Intent,Intent的action名称为android.provider.Telephony.SMS_RECEIVED,该Intent存放了系统接收到的短信内容,我们使用名称“pdus”即可从Intent中获取到短信内容。 SMSReceive 静态注册Receiver的例子

4 SMS拦截例子分析 要实现一个广播接收者方法如下: 第一步:继承BroadcastReceiver,并重写onReceive()方法 public class IncomingSMSReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { }

第二步:订阅感兴趣的广播Intent,订阅方法有两种: 第一种动态注册:使用代码进行订阅 IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED"); IncomingSMSReceiver receiver = new IncomingSMSReceiver(); registerReceiver(receiver, filter);

第二种静态注册:在AndroidManifest 第二种静态注册:在AndroidManifest.xml文件中的<application>节点里进行订阅: <receiver android:name=".IncomingSMSReceiver"> <intent-filter> <action android:name="android.provider.Telephony.SMS_RECEIVED"/> </intent-filter> </receiver>

代码动态注册的Intent-Filter高于manifest静态注册的Intent-Filter。动态注册中的Intent-Filter在相同优先级下(如整型的最大值),接受顺序是按照动态注册的时间顺序。静态注册中Intent-Filter在相同优先级下,接受顺序是apk的安装顺序。

使用BroadReceiver的弊端 查看BroadReceiver sdk reference , 可以了解到所有的BroadReceiver对短信的接收是无顺序的状态 ,即使是使用了Ordered broadcasts对于同等优先级别的BroadReceiver ,也会产生无顺序的行为。 所以下面介绍另一种接收短信的行为,包括其中可以进行短信的删除。 应用观察者模式,监听短信数据库,操作短信内容

课堂作业2 改成动态注册然后观察是否能监听到短信信息?

Android DDMS DDMS 的全称是Dalvik Debug Monitor Service,它为我们提供例如:为测试设备截屏,针对特定的进程查看正在运行的线程以及堆信息、Logcat、广播状态信息、模拟电话呼叫、接收SMS、虚拟地理坐标等等。

综合课堂练习 做一个既能接收又能拦截的例子 (1)发送短信按钮能够发送短信 (2)拦截短信按钮实现短信拦截,即中断了广播的继续传递,低优先级的程序无法接收短信, (3)取消拦截按钮则取消拦截,使模拟机能够接受到短信息