- 浏览: 507800 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
lin_kk:
最近正在学,请问LZ有源码事例吗,如果有能发一下我邮箱吗,万分 ...
使用libgdx及其中的box2d 2.1的注意事项 -
ahong520:
编译都通不过
ffmpeg对音频解码的一般步骤 -
辽东小小:
yajun_soft 写道XXX@XXX:~$ adb she ...
adb push的Permission denied -
cdtdx:
好文, 相当不错啊. 收了.
什么是app2sd,app2ext,data2ext?app移动到SD卡哪里去了? /mnt/asec /mnt/secure -
dickycat:
学习了,最近正在学这一块,年纪大了,学起来有点吃亏!
使用libgdx及其中的box2d 2.1的注意事项
6、温故知新之Intent
此系列前面简单地接受过意图(Intent),这里再次简单介绍一下,在短信接收程序和使用Intent发送SMS中我们要用到。android应用程序的三大组件——Activities、Services、Broadcast Receiver,通过消息触发,这个消息就称作意图(Intent)。下面以Acitvity为例,介绍一下Intent。Android用Intent这个特殊的类实现在Activity与Activity之间的切换。Intent类用于描述应用的功能。在Intent的描述结构中,有两个最重要的部分:动作和动作对应的数据。典型的动作类型有MAIN、VIEW、PICK、EDIT等,我们在短信接收程序中就用到从广播意图中提取动作类型并判断是否是"android.provider.Telephony.SMS_RECEIVED",进而作深一步的处理。而动作对应的数据则以URI的形式表示。例如,要查看一个人的联系方式,需要创建一个动作为VIEW的Intent,以及表示这个人的URI。
通过解析各种Intent,从一个屏幕导航到另一个屏幕是很简单的。当向前导航时,Activity将会调用startActivity("指定一个Intent")方法。然后,系统会在所有已安装的应用程序中定义的IntentFilter中查找,找到最匹配的Intent对应的Activity。新的Activity接收到指定的Intent的通知后,开始运行。当startActivity()方法被调用时,将触发解析指定Intent的动作,该机制提供了两个关键的好处:
- Activity能够重复利用从其他组件中以Intent形式产生的请求。
- Activity可以在任何时候被具有相同IntentFilter的新的Activity取代。
7、准备工作:SmsMessage类
顾名思义,SmsMessage类是一个表示短信的类,为了更好地了解Android的短信机制及以后更好地编写短信相关程序,这里介绍一下该类的公有方法和常量,及嵌套枚举、类成员。
公有方法:
-
public static int[] calculateLength (CharSequence
msgBody, boolean use7bitOnly)
参数:
msgBody-要封装的消息、use7bitOnly-如果为TRUE,不是广播特定7-比特编码的部分字符被认为是单个空字符;如果为FALSE,且msgBody包含非7-比特可编码字符,长度计算使用16-比特编码。
返回值:
返回一个4个元素的int数组,int[0]表示要求使用的SMS数量、int[1]表示编码单元已使用的数量、int[2]表示剩余到下个消息的编码单元数量、int[3]表示编码单元大小的指示器。 -
public static int[] calculateLength (String
messageBody, boolean use7bitOnly)
参数和返回值跟上面类似 -
public static SmsMessage createFromPdu (byte[] pdu)
从原始的PDU(protocol description units)创建一个SmsMessage。这个方法很重要,在我们编写短信接收程序要用到,它从我们接收到的广播意图中获取的字节创建SmsMessage。 -
public String
getDisplayMessageBody()
返回短信消息的主体,或者Email消息主体(如果这个消息来自一个Email网关)。如果消息主体不可用,返回null。这个方法也很重要,在我们编写短信接收程序也要用到。 -
public String getDisplayOriginatingAddress
()
返回信息来源地址,或Email地址(如果消息来自Email网关)。如果消息主体不可用,返回null。这个方法在来电显示,短信接收程序中经常用到。 -
public String getEmailBody
()
如果isEmail为TRUE,即是邮件,返回通过网关发送Email的地址,否则返回null。 -
public int getIndexOnIcc
()
返回消息记录在ICC上的索引(从1开始的) -
public String getMessageBody
()
以一个String返回消息的主体,如果它存在且是基于文本的。 -
public SmsMessage.MessageClass
getMessageClass ()
返回消息的类。 -
public String getOriginatingAddress
()
以String返回SMS信息的来电地址,或不可用时为null。 -
public byte[] getPdu ()
返回消息的原始PDU数据。 -
public int getProtocolIdentifier ()
获取协议标识符。 - public String getPseudoSubject ()
-
public String getServiceCenterAddress
()
返回转播消息SMS服务中心的地址,如果没有的话为null。 -
public int getStatus
()
GSM:为一个SMS-STATUS-REPORT消息,它返回状态报告的status字段。这个字段表示之前提交的SMS消息的状态。
CDMA:为不影响来自GSM的状态码,值移动到31-16比特。这个值由一个error类(25-16比特)和一个状态码(23-16比特)组成。
如果是0,表示之前发送的消息已经被收到。 -
public int getStatusOnIcc
()
返回消息在ICC上的状态(已读、未读、已发送、未发送)。有下面的几个值:SmsManager.STATUS_ON_ICC_FREE、SmsManager.STATUS_ON_ICC_READ、SmsManager.STATUS_ON_ICC_UNREAD、SmsManager.STATUS_ON_ICC_SEND、SmsManager.STATUS_ON_ICC_UNSENT这几个值在上篇的SmsManager类介绍有讲到。 -
public static SmsMessage.SubmitPdu getSubmitPdu
(
String scAddress, String destinationAddress,
short destinationPort, byte[] data,
boolean statusReportRequested)
参数:scAddress - 服务中心的地址(Sercvice Centre address,为null即使用默认的)、destinationAddress - 消息的目的地址、destinationPort- 发送消息到目的的端口号、data - 消息数据。
返回值:一个包含编码了的SC地址(如果指定了的话)和消息内容的SubmitPdu,否则返回null,如果编码错误。 -
public static SmsMessage.SubmitPdu getSubmitPdu
(
String scAddress, String destinationAddress,
String message, boolean statusReportRequested)
和上面类似。 -
public static int getTPLayerLengthForPDU (String
pdu)
返回指定SMS-SUBMIT PDU的TP-Layer-Length,长度单位是字节而不是十六进字符。 -
public long getTimestampMillis
()
以currentTimeMillis()格式返回服务中心时间戳。 -
public byte[] getUserData
()
返回用户数据减去用户数据头部(如果有的话) -
public boolean isCphsMwiMessage ()
判断是否是CPHS MWI消息 -
public boolean isEmail
()
判断是否是Email,如果消息来自一个Email网关且Email发送者(sender)、主题(subject)、解析主体(parsed body)可用,则返回TRUE。 -
public boolean isMWIClearMessage
()
判断消息是否是一个CPHS 语音邮件或消息等待MWI清除(clear)消息。 -
public boolean isMWISetMessage ()
判断消息是否是一个CPHS 语音邮件或消息等待MWI设置(set)消息。 -
public boolean isMwiDontStore
()
如果消息是一个“Message Waiting Indication Group:Discard Message”通知且不应该保存,则返回TRUE,否则返回FALSE。 -
public boolean isReplace ()
判断是否是一个“replace short message”SMS -
public boolean isReplyPathPresent
()
判断消息的TP-Reply-Path位是否在消息中设置了。 -
public boolean isStatusReportMessage
()
判断是否是一个SMS-STATUS-REPORT消息。
常量值:
- public static final int ENCODING_16BIT :值为3(0x00000003)
- public static final int ENCODING_8BIT :值为2 (0x00000002)
- public static final int ENCODING_UNKNOWN :值为0 (0x00000000) ,用户数据编码单元的大小。
- public static final int MAX_USER_DATA_BYTES :值为140 (0x0000008c),表示每个消息的最大负载字节数。
- public static final int MAX_USER_DATA_BYTES_WITH_HEADER :134 (0x00000086),如果一个用户数据有头部,该值表示它的最大负载字节数,该值假定头部仅包含CONCATENATED_8_BIT_REFENENCE元素。
- public static final int MAX_USER_DATA_SEPTETS :值为160 (0x000000a0) ,表示每个消息的最大负载septets数。
- public static final int MAX_USER_DATA_SEPTETS_WITH_HEADER :值为153 (0x00000099),如果存在用户数据头部,则该值表示最大负载septets数该值假定头部仅包含CONCATENATED_8_BIT_REFENENCE元素。
嵌套枚举成员SmsMessage.MessageClass的枚举值:
- public static final SmsMessage.MessageClass CLASS_0
- public static final SmsMessage.MessageClass CLASS_1
- public static final SmsMessage.MessageClass CLASS_2
- public static final SmsMessage.MessageClass CLASS_3
- public static final SmsMessage.MessageClass CLASS_UNKNOWN
嵌套枚举成员SmsMessage.MessageClass的公有方法:
- public static SmsMessage.MessageClass valueOf (String name):返回值的字符串的值
- public static final MessageClass[] values ():返回MessageClass的值数组
嵌套类成员SmsMessage.SubmitPdu的字段:
- public byte[] encodedMessage :编码了的消息
- public byte[] encodedScAddress :编码的服务中心地址
嵌套类成员SmsMessage.SubmitPdu的公有方法:
-
public String toString
()
返回一个包含简单的、可读的这个对象的描述字符串。鼓励子类去重写这个方法,并提供实现对象的类型和数据。默认实现简单地连接类名、@、十六进制表示的对象哈希码,即下面的形式: getClass().getName() + '@' + Integer.toHexString(hashCode())
8、SMS接收程序
当一个SMS消息被接收时,一个新的广播意图由android.provider.Telepony.SMS_RECEIVED动作触发。注意:这个一个字符串字面量(string literal),但是SDK当前并没有包括这个字符串的引用,因此当要在应用程序中使用它时必须自己显示的指定它。现在我们就开始构建一个SMS接收程序:
1)、跟SMS发送程序类似,要在清单文件AndroidManifest.xml中指定权限允许接收SMS:<uses-permission android:name="android.permission.RECEIVER_SMS"/>
为了能够回发短信,还应该加上发送的权限。
2)、应用程序监听SMS意图广播,SMS广播意图包含了到来的SMS细节。我们要从其中提取出SmsMessage对象,这样就要用到pdu键提取一个SMS PDUs数组(protocol description units—封装了一个SMS消息和它的元数据),每个元素表示一个SMS消息。为了将每个PDU byte数组转化为一个SMS消息对象,需要调用SmsMessage.createFromPdu。
每个SmsMessage包含SMS消息的详细信息,包括起始地址(电话号码)、时间戳、消息体。下面编写一个接收短信的类SmsReceiver代码如下:
package skynet.com.conblogs.www;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.telephony.SmsMessage;
import android.widget.Toast;
public class SmsReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context _context, Intent _intent) {
if (_intent.getAction().equals(SMS_RECEIVER)) {
SmsManager sms = SmsManager.getDefault();
Bundle bundle = _intent.getExtras();
if (bundle != null) {
Object[] pdus = (Object[]) bundle.get("pdus");
SmsMessage[] messages = new SmsMessage[pdus.length];
for (int i = 0; i < pdus.length; i++)
messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
for (SmsMessage message : messages) {
String msg = message.getMessageBody();
String to = message.getOriginatingAddress();
if (msg.toLowerCase().startsWith(queryString)) {
String out = msg.substring(queryString.length());
sms.sendTextMessage(to, null, out, null, null);
Toast.makeText(_context, "success",
Toast.LENGTH_LONG).show();
}
}
}
}
}
private static final String queryString="@echo";
private static final String SMS_RECEIVER=
"android.provider.Telephony.SMS_RECEIVED";
}
上面代码的功能是从接收到的广播意图中提取来电号码、短信内容,然后将短信加上@echo头部回发给来电号码,并在屏幕上显示一个Toast消息提示成功。
发表评论
-
编译XT720 gingerbread
2013-05-04 11:18 826在android根目录下执行". build/env ... -
编译mx 内核成功
2013-03-18 17:48 831转 : http://hi.baidu.com/_xi ... -
ubuntu下面找不到ZTE V880设备
2012-12-06 16:22 784两种方法:第一种方法是你连上你的手机,重启电脑,再adb de ... -
Android中解决图像解码导致的OOM问题
2012-10-01 18:41 796http://7dot9.com/2011/08/androi ... -
编译Android下纯C的静态程序,undefined reference to raise
2012-07-08 23:28 2337尝试在Android下编译纯C的静态程序,执行gcc -v - ... -
开发Android下纯C程序时,打开时提示not found
2012-07-08 20:09 1342这个问题烦了我一天了..郁闷.本人想试验一下使用ndk里面的t ... -
NDK报错:make: *** 没有规则可以创建“obj/local/armeabi/objs/a/a.o”需要的目标“/a.c”。 停止。
2012-07-05 21:02 2145android开发用ndk编译so库时,有时直接从别的地 ... -
adb push的Permission denied
2012-05-30 17:19 3578遇到的问题是 zhanglanyun@zhanglan ... -
adb pull失败问题解决方法
2012-05-30 17:03 2116问题:使用adb pull命令从android系统中读取文件失 ... -
关于app2sd、a2sd、data2sd、a2sd+的区别的解释
2012-05-17 11:47 1031因为看到很多机友对这个概念不理解。首先解释一下这些缩写,全部的 ... -
什么是app2sd,app2ext,data2ext?app移动到SD卡哪里去了? /mnt/asec /mnt/secure
2012-05-17 10:56 3327Google Android手机的软件为了安全性和稳定性 ... -
android 如何自定义ProgressBar
2012-04-22 15:39 1896原文:http://blog.sina.com.cn/s/bl ... -
修改MAC,没有nvs_map.bin时该怎么做
2012-04-10 16:53 1784Basically: nvs_map.bin is what ... -
Android Activity LaunchMode 验证
2012-03-31 11:23 876在Android中,每个Activity有4种LaunchMo ... -
Android改变MAC地址
2012-03-30 13:42 21471.Find out your original MAC ad ... -
C通过JNI 层调用Java的静态和非静态方法
2012-03-26 09:47 39181、主要流程 1、 新建一个测试类TestProv ... -
使用ndk或linux下独立交叉编译(ffmpeg)
2012-03-18 21:48 22711、ndk 编译程序 在NDK的apps目录下创建he ... -
android-ndk-r7 编译 ffmpeg-0.10
2012-03-18 21:46 4564看了这篇文章 http://blog.sina.com ... -
android2.3 MODIFY_PHONE_STATE
2012-02-27 22:14 3034一直被一些莫名其妙的电话骚扰,而且只响两声就断了,一直 ... -
Androidmanifest.xml里的<uses-feature>
2011-12-27 17:10 1321如果你是一个Android用户,而且你有一个老旧的安装有and ...
相关推荐
Android 开发之旅:短信的收发及在android模拟器之间实践(一) 14 Android 开发之旅:短信的收发及在android模拟器之间实践(二) 15 Android开发之旅 Intents和Intent Filters(理论部分) 16 Android开发之旅 ...
• Android 开发之旅:短信的收发及在android模拟器之间实践(一) • Android 开发之旅:短信的收发及在android模拟器之间实践(二) • Android开发之旅: Intents和Intent Filters(理论部分)
• Android 开发之旅:短信的收发及在android模拟器之间实践(一) • Android 开发之旅:短信的收发及在android模拟器之间实践(二) • Android开发之旅: Intents和Intent Filters(理论部分)
Android系统源码短信模块,短信收发流程分析,从app层到framework层。
本项目是Android的短信收发项目实战,主要功能是短信的发送和接受,主要练习的是Android的四大组件之Broadcast广播i的使用和学习
如何实现短信的接收和发送,了解短信的收发机制
android手机短信的收发 android手机短信的收发
本代码可以实现两个模拟器之间的短信接发,并附有设计文档,希望能帮到各位。
本工具包包含中国移动、中国联通、中国电信、中国网通及短信中心短信网关模拟器及用于测试用途的手机终端模拟器. 二、功能介绍 中国移动CMPP模拟器 概述:基于CMPP v3.0 v2.0协议开发的,具有方便易用图形化的...
Android多媒体应用——短信收发源码
Android SMS短消息服务系统,自己开发的Android短信收发系统,可以用于办公等专项业务。
一个运行在android上的短信收发程序
AT命令操作GSM短信猫收发短信,支持长短信收发,收长短信自动合并成一条短信。
收发短信。 private String getSimpleDateFormat(long long_date) { /*时锟斤拷锟绞阶拷锟轿�yyyy-MM-dd HH:mm:ss"*/ SimpleDateFormat dateFormat = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); Date d ...
一个很好的短信收发测试工具,也可以用于企业短信收发。
android短信收发流流程
基于Android手机系统的java短信收发程序,本程序提供发送短信功能,并提醒短信接收。
短信收发包 SMSLib
android开发实例,可以接收和发送短信,有一个还可以的界面设计,适用于初级android开发者学习
在Android Studio实现MQTT对主题的订阅和数据的收发,以及将数据封装成对象传回MainActivity,方便进行数据处理,其操作信息在TextView中展示相关的数据。对相关的数据一目了然,同时,在页面中为物联网的开发提供了...