14Android 开发之旅短信的收发及在android模拟器之间实践一Word文档格式.docx

上传人:b****6 文档编号:17183461 上传时间:2022-11-28 格式:DOCX 页数:13 大小:234.51KB
下载 相关 举报
14Android 开发之旅短信的收发及在android模拟器之间实践一Word文档格式.docx_第1页
第1页 / 共13页
14Android 开发之旅短信的收发及在android模拟器之间实践一Word文档格式.docx_第2页
第2页 / 共13页
14Android 开发之旅短信的收发及在android模拟器之间实践一Word文档格式.docx_第3页
第3页 / 共13页
14Android 开发之旅短信的收发及在android模拟器之间实践一Word文档格式.docx_第4页
第4页 / 共13页
14Android 开发之旅短信的收发及在android模拟器之间实践一Word文档格式.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

14Android 开发之旅短信的收发及在android模拟器之间实践一Word文档格式.docx

《14Android 开发之旅短信的收发及在android模拟器之间实践一Word文档格式.docx》由会员分享,可在线阅读,更多相关《14Android 开发之旅短信的收发及在android模拟器之间实践一Word文档格式.docx(13页珍藏版)》请在冰豆网上搜索。

14Android 开发之旅短信的收发及在android模拟器之间实践一Word文档格式.docx

然而,它们启动一个活动去响应收到的信息,或者他们可能使用NotificationManager去通知用户。

通知可以使用多种方式获得用户的注意——闪烁的背光、振动设备、播放声音等等。

典型的是放在一个持久的图标在状态栏,用户可以打开获取信息。

2、准备工作:

实现SMS主要用到SmsManager类,该类继承自java.lang.Object类,下面我们介绍一下该类的主要成员。

公有方法:

∙ArrayList<

String>

 

divideMessage(Stringtext) 

当短信超过SMS消息的最大长度时,将短信分割为几块。

参数:

text——初始的消息,不能为空 

返回值:

有序的ArrayList<

,可以重新组合为初始的消息

∙static 

SmsManager 

getDefault() 

获取SmsManager的默认实例。

SmsManager的默认实例

∙void 

SendDataMessage(String 

destinationAddress, 

String 

scAddress, 

short 

destinationPort, 

byte[] 

data, 

PendingIntent 

sentIntent, 

deliveryIntent) 

发送一个基于SMS的数据到指定的应用程序端口。

1)、destinationAddress——消息的目标地址 

2)、scAddress——服务中心的地址or为空使用当前默认的SMSC3)destinationPort——消息的目标端口号 

4)、data——消息的主体,即消息要发送的数据 

5)、sentIntent——如果不为空,当消息成功发送或失败这个PendingIntent就广播。

结果代码是Activity.RESULT_OK表示成功,或RESULT_ERROR_GENERIC_FAILURE、RESULT_ERROR_RADIO_OFF、RESULT_ERROR_NULL_PDU之一表示错误。

对应RESULT_ERROR_GENERIC_FAILURE,sentIntent可能包括额外的“错误代码”包含一个无线电广播技术特定的值,通常只在修复故障时有用。

每一个基于SMS的应用程序控制检测sentIntent。

如果sentIntent是空,调用者将检测所有未知的应用程序,这将导致在检测的时候发送较小数量的SMS。

6)、deliveryIntent——如果不为空,当消息成功传送到接收者这个PendingIntent就广播。

异常:

如果destinationAddress或data是空时,抛出IllegalArgumentException异常。

sendMultipartTextMessage(String 

ArrayList<

parts, 

PendingIntent>

sentIntents,ArrayList<

deliverIntents) 

发送一个基于SMS的多部分文本,调用者应用已经通过调用divideMessage(Stringtext)将消息分割成正确的大小。

2)、scAddress——服务中心的地址or为空使用当前默认的SMSC 

3)、parts——有序的ArrayList<

,可以重新组合为初始的消息 

4)、sentIntents——跟SendDataMessage方法中一样,只不过这里的是一组PendingIntent 

5)、deliverIntents——跟SendDataMessage方法中一样,只不过这里的是一组PendingIntent 

sendTextMessage(String 

text, 

发送一个基于SMS的文本。

参数的意义和异常前面的已存在的一样,不再累述。

常量:

∙publicstaticfinalint 

RESULT_ERROR_GENERIC_FAILURE 

表示普通错误,值为1(0x00000001)

RESULT_ERROR_NO_SERVICE 

表示服务当前不可用,值为4(0x00000004)

RESULT_ERROR_NULL_PDU 

表示没有提供pdu,值为3(0x00000003)

RESULT_ERROR_RADIO_OFF 

表示无线广播被明确地关闭,值为2(0x00000002)

STATUS_ON_ICC_FREE 

表示自由空间,值为0(0x00000000)

STATUS_ON_ICC_READ 

表示接收且已读,值为1(0x00000001)

STATUS_ON_ICC_SENT 

表示存储且已发送,值为5(0x00000005)

STATUS_ON_ICC_UNREAD 

表示接收但未读,值为3(0x00000003)

STATUS_ON_ICC_UNSENT 

表示存储但为发送,值为7(0x00000007)

3、简单的SMS发送程序

1)、首先,编辑布局文件res/layout/main.xml,达到我们想要的结果,界面如下:

图1、程序运行界面

对应的xml代码如下:

<

?

xmlversion="

1.0"

encoding="

utf-8"

>

LinearLayoutxmlns:

android="

android:

orientation="

vertical"

layout_width="

fill_parent"

layout_height="

>

<

TextViewandroid:

android:

wrap_content"

text="

@string/txtPhoneNo"

/>

!

--text'

svaluedefineinres/values/strings.xml-->

EditTextandroid:

id="

@+id/edtPhoneNo"

@string/txtContent"

minLines="

3"

@+id/edtContent"

Buttonandroid:

@string/btnText"

@+id/btnSend"

/LinearLayout>

相应的要在res/values/strings.xm中添加上面定义的视图的text的值,如下:

resources>

stringname="

txtPhoneNo"

PleaseinputphoneNO:

/string>

txtContent"

PleaseinputSMS\'

scontent:

btnText"

send!

app_name"

SMS<

/resources>

2)、做完这些准备工作之后,我么要开始编写代码实现简单的短信发送了。

通过第一步我们构建好界面之后,现在要在上面的基础上编写业务逻辑了。

大致过程为:

在java源文件中,获取用户在edtPhoneNo中输入的电话号码,edtContent中输入要发送的内容;

然后点击btnSend按钮发送短信,要达到这个目的我们要设置btnSend的OnClickListener以达到当点击它触发发送短信的功能,而且要发送短信就要用到我们前面介绍的SmsManager类提供的方法接口。

设置btnSend的OnClickListener的代码如下:

btnSend.setOnClickListener(newView.OnClickListener(){

publicvoidonClick(Viewv){

StringphoneNo=edtPhoneNo.getText().toString();

Stringmessage=edtContent.getText().toString();

if(phoneNo.length()>

0&

&

message.length()>

0){

//callsendSMStosendmessagetophoneNo

sendSMS(phoneNo,message);

}

else

Toast.makeText(getBaseContext(),

"

Pleaseenterbothphonenumberandmessage."

Toast.LENGTH_SHORT).show();

}

});

发送短信的功能的代码如下:

privatevoidsendSMS(StringphoneNumber,Stringmessage){

//---sendsanSMSmessagetoanotherdevice---

SmsManagersms=SmsManager.getDefault();

PendingIntentpi=PendingIntent.getActivity(this,0,

newIntent(this,TextMessage.class),0);

//ifmessage'

slengthmorethan70,

//thencalldivideMessagetodivemessageintoseveralpart

//andcallsendTextMessage()

//elsedirectcallsendTextMessage()

if(message.length()>

70){

ArrayList<

msgs=sms.divideMessage(message);

for(Stringmsg:

msgs){

sms.sendTextMessage(phoneNumber,null,msg,pi,null);

}else{

sms.sendTextMessage(phoneNumber,null,message,pi,null);

Toast.makeText(TextMessage.this,"

短信发送完成"

Toast.LENGTH_LONG).show();

}

如果你已经看了第2节介绍的SmsManager类的介绍,代码应该很好理解。

在这里要说明的是,sendTextMessage方法中的第4个和第5个参数PendingIntent设为null,这样的话不能根据短信发出之后的状态做相应的事情,如短信发送失败后的提醒、接收者成功接收后的回执……完整的流程源码如下:

TextMessage.java源文件全部代码

3)运行前,还要在清单文件AndroidManifest.xml中加入允许发送短信的权限:

AndroidManifest.xml

3.1、运行SMS程序给另一个android模拟器发短信

运行上面我们编写的TextMessage程序,另外在Windows的命令行下切换到tools目录下,并输入emulator–datasmsReceiver,我的如下:

这样就会启动一个android模拟器,如下所示:

(注意它的编号:

5556,就是用这个编号与它通信的)

图2、通过emulator启动一个android模拟器

通过我们TextMessage程序启动的android模拟器,编写短信:

图3、TextMessage程序个5556模拟器发短信

点击发送之后,通过命令行启动的5556号android模拟器会收到我们刚才发送的短信,如下所示:

图4、收到短信的提示

tips:

如果通过命令行的emulator启动android模拟器提示“NODNSserversfound!

”,这时我们发的短信模拟器是收不到的。

∙在Windows下,如果电脑没有介入网络,即找不DNS服务器的话会出现这种情况!

∙在Mac下,如果提示这个警告的话,可以这样解决:

检查你是否有/etc/resolv.conf文件,如果没有的话,通过下面的命令行

ln-s/private/var/run/resolv.conf/etc/resolv.conf可以解决。

4、SMS增强

(一)

上面我们实现了一个简单的SMS程序,下面我们要对它进行增强!

你肯定已经注意到了,我们上面的SMS程序的sendTextMessage方法中的第4个和第5个参数PendingIntent设为null,即sentIntent和deliveryIntent。

第4个参数-sendIntent,当消息成功发送或发送失败都将被触发。

广播接收者的结果码,Activity.RESULT_OK表示成功,或RESULT_ERROR_GENERIC_FAILURE、RESULT_ERROR_RADIO_OFF、RESULT_ERROR_NULL_PDU之一表示错误。

第5个参数-deliveryIntent,仅当目标接收到你的SMS消息才触发。

为了跟踪发出的短信的状态,实现和注册BroadcastReceiver(广播接收者)监听传递给sendTextMessage方法的参数PendingIntents。

下面我们就实现和注册这个广播接收者:

StringSENT_SMS_ACTION="

SENT_SMS_ACTION"

;

StringDELIVERED_SMS_ACTION="

DELIVERED_SMS_ACTION"

//createthesentIntentparameter

IntentsentIntent=newIntent(SENT_SMS_ACTION);

PendingIntentsentPI=PendingIntent.getBroadcast(

this,

0,

sentIntent,

0);

//createthedeilverIntentparameter

IntentdeliverIntent=newIntent(DELIVERED_SMS_ACTION);

PendingIntentdeliverPI=PendingIntent.getBroadcast(

deliverIntent,

//registertheBroadcastReceivers

registerReceiver(newBroadcastReceiver(){

@Override

publicvoidonReceive(Context_context,Intent_intent)

{

switch(getResultCode()){

caseActivity.RESULT_OK:

Toast.makeText(getBaseContext(),

"

SMSsentsuccessactions"

Toast.LENGTH_SHORT).show();

break;

caseSmsManager.RESULT_ERROR_GENERIC_FAILURE:

SMSgenericfailureactions"

caseSmsManager.RESULT_ERROR_RADIO_OFF:

Toast.makeText(getBaseContext(),

SMSradioofffailureactions"

caseSmsManager.RESULT_ERROR_NULL_PDU:

SMSnullPDUfailureactions"

},

newIntentFilter(SENT_SMS_ACTION));

Toast.makeText(getBaseContext(),

SMSdeliveredactions"

newIntentFilter(DELIVERED_SMS_ACTION));

在基本完成了要做的工作,接下来要做的就是将sendTextMessage的第4个和第5个参数改为sentPI、deliverPI,这样工作基本完成,修改后的sendSMS方法如下:

修改后的sendSMS方法完整代码

运行之后的,发送短信成功的话就可以看到如下界面:

图5、增强SMS

(一)

5、SMS增强

(二)

下面这个增强是使SMS能够发送二进制数据。

要发送数据要使用SmsManager类的sendDataMessage方法,跟sendTextMessage方法类似,只不过该方法多了一个目标端口的参数,构建该SMS的过程跟前面的类似这里就不在累述。

本系列的其它文章:

∙Android开发之旅:

环境搭建及HelloWorld

HelloWorld项目的目录结构

android架构

应用程序基础及组件

应用程序基础及组件(续)

活动与任务

进程与线程

组件生命周期

(一)

组件生命周期

(二)

组件生命周期(三)

又见HelloWorld!

深入分析布局文件&

又是“HelloWorld!

view的几种布局方式及实践

短信的收发及在androi

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 外语学习 > 法语学习

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1