您的位置:首页 > 移动开发 > Android开发

Android-短信的接收和发送

2013-11-18 17:20 357 查看
短信是手机中经常使用到的一种服务。然而,当手机接收到短信时,也会向系统发送广播。如果我们的应用程序要在手机接收到短信后做点什么,那就需要接收这个系统广播;短信的发送要比短信的接收简单的多。下面我就简单的对实现步骤进行描述:

A:接收短信

1.编写一个SMSReceiver类来接收系统广播。

package net.blogjava.mobile.sms;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.os.Bundle;

import android.telephony.gsm.SmsMessage;

import android.widget.Toast;

public class SMSReceiver extends BroadcastReceiver

{

@Override

public void onReceive(Context context, Intent intent)

{

// 判断接收到的广播是否为收到短信的Broadcast Action

if ("android.provider.Telephony.SMS_RECEIVED".equals(intent.getAction()))

{

StringBuilder sb = new StringBuilder();

// 接收由SMS传过来的数据

Bundle bundle = intent.getExtras();

// 判断是否有数据

if (bundle != null)

{

// 通过pdus可以获得接收到的所有短信消息

Object[] objArray = (Object[]) bundle.get("pdus");

// 构建短信对象array,并依据收到的对象长度来创建array的大小

SmsMessage[] messages = new SmsMessage[objArray.length];

for (int i = 0; i < objArray.length; i++)

{

messages = SmsMessage.createFromPdu((byte[]) objArray);

}

// 将送来的短信合并自定义信息于StringBuilder当中

for (SmsMessage currentMessage : messages)

{

sb.append("短信来源:");

// 获得接收短信的电话号码

sb.append(currentMessage.getDisplayOriginatingAddress());

sb.append("\n------短信内容------\n");

// 获得短信的内容

sb.append(currentMessage.getDisplayMessageBody());

}

}

Intent mainIntent = new Intent(context, Main.class);

mainIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

context.startActivity(mainIntent);

// 使用Toast信息提示框显示接收到的短信内容

Toast.makeText(context, sb.toString(), Toast.LENGTH_LONG).show();

}

}

}

在编写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类,代码如下:

<receiver android:name="SMSReceiver">

<intent-filter>

<!-- 指定SMSReceiver可以接收的Broadcast Action -->

<action android:name="android.provider.Telephony.SMS_RECEIVED" />

</intent-filter>

</receiver>

B:发送短信

PendingIntent pintent = PendingIntent.getBroadcast(MainActivity.this, 0, new Intent(), 0);

SmsManager smsManager = SmsManager.getDefault();

smsManager.sendTextMessage("1**68885227", null, "test", pintent, null);

ContentValues values = new ContentValues();

values.put("address", "1**68885227");

values.put("body", "test");

getContentResolver().insert(Uri.parse("content://sms/sent"), values);

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

<uses-permission android:name="android.permission.RECEIVE_SMS"/>

<uses-permission android:name="android.permission.SEND_SMS"/>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: