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

Android 使用SmsManager发送短信

2015-07-14 17:16 399 查看


[b]SmsManager[/b]公有方法:

ArrayList<</SPAN>String> divideMessage(String
text)

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

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

返回值:有序的ArrayList<</SPAN>String>,可以重新组合为初始的消息

static SmsManager
getDefault()

获取SmsManager的默认实例。

返回值:SmsManager的默认实例

void SendDataMessage(String destinationAddress,
String
scAddress, short destinationPort,
byte[] data,
PendingIntent sentIntent,
PendingIntent
deliveryIntent)

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

参数:

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

2)、scAddress——服务中心的地址or为空使用当前默认的SMSC
3)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异常。

void
sendMultipartTextMessage(String destinationAddress,
String
scAddress, ArrayList<</SPAN>String> parts,
ArrayList<</SPAN>PendingIntent> sentIntents, ArrayList<</SPAN>PendingIntent>
deliverIntents)

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

参数:

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

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

3)、parts——有序的ArrayList<</SPAN>String>,可以重新组合为初始的消息

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

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

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

void
sendTextMessage(String destinationAddress, String scAddress, String text, PendingIntent sentIntent, PendingIntent deliveryIntent)

发送一个基于SMS的文本。参数的意义和异常前面的已存在的一样,不再累述。

常量:

public static final int
RESULT_ERROR_GENERIC_FAILURE

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

public static final int
RESULT_ERROR_NO_SERVICE

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

public static final int
RESULT_ERROR_NULL_PDU

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

public static final int
RESULT_ERROR_RADIO_OFF

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

public static final int
STATUS_ON_ICC_FREE

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

public static final int
STATUS_ON_ICC_READ

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

public static final int
STATUS_ON_ICC_SENT

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

public static final int
STATUS_ON_ICC_UNREAD

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

public static final int
STATUS_ON_ICC_UNSENT

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

例子:

package lab.sodino.servicecenteraddress;

import android.app.Activity;

import android.app.PendingIntent;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.content.IntentFilter;

import android.os.Bundle;

import android.telephony.gsm.SmsManager;

import android.telephony.gsm.SmsMessage;

import android.view.Gravity;

import android.view.View;

import android.widget.Button;

import android.widget.LinearLayout;

import android.widget.TextView;

import android.widget.LinearLayout.LayoutParams;

public class ServiceCenterAddressAct extends Activity {

private static final String ACTION_SMS_SEND =
"lab.sodino.sms.send";

private static final String ACTION_SMS_DELIVERY =
"lab.sodino.sms.delivery";

private static final String ACTION_SMS_RECEIVER =
"android.provider.Telephony.SMS_RECEIVED";

private TextView serviceCenterAddressText;

private SMSReceiver sendReceiver;

private SMSReceiver deliveryReceiver;

private SMSReceiver smsReceiver;

@Override

public void onCreate(Bundle savedInstanceState) {


super.onCreate(savedInstanceState);

LinearLayout.LayoutParams
layParams = new LinearLayout.LayoutParams(


LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);

LinearLayout linearLay = new
LinearLayout(this);


linearLay.setOrientation(LinearLayout.VERTICAL);


linearLay.setLayoutParams(layParams);

TextView textView = new
TextView(this);


textView.setBackgroundColor(0xffffffff);


textView.setTextColor(0xff0000ff);


textView.setTextSize(20);


textView.setText("点击发送按钮将发送自定义字符串至10086");


textView.setGravity(Gravity.CENTER);


linearLay.addView(textView);

Button btnSend = new
Button(this);

// LinearLayout.LayoutParams
btnParams = new LinearLayout.LayoutParams(

//
LinearLayout.LayoutParams.FILL_PARENT,

//
LinearLayout.LayoutParams.WRAP_CONTENT);


btnSend.setText("发送");

btnSend.setOnClickListener(new
Button.OnClickListener() {

public void
onClick(View v) {


serviceCenterAddressText.setText("正在等待发送短信...");


sendSms();

}

});


linearLay.addView(btnSend);

serviceCenterAddressText = new
TextView(this);


serviceCenterAddressText.setText("正在等待发送短信...");


serviceCenterAddressText.setBackgroundColor(0xffffffff);


serviceCenterAddressText.setTextColor(0xff0000ff);


serviceCenterAddressText.setTextSize(20);


serviceCenterAddressText.setGravity(Gravity.LEFT);


linearLay.addView(serviceCenterAddressText);


setContentView(linearLay);

// 注册send

sendReceiver = new
SMSReceiver();

IntentFilter sendFilter = new
IntentFilter(ACTION_SMS_SEND);

registerReceiver(sendReceiver,
sendFilter);

// 注册delivery

deliveryReceiver = new
SMSReceiver();

IntentFilter deliveryFilter =
new IntentFilter(ACTION_SMS_DELIVERY);


registerReceiver(deliveryReceiver, deliveryFilter);

// 注册接收下行receiver

smsReceiver = new
SMSReceiver();

IntentFilter receiverFilter =
new IntentFilter(ACTION_SMS_RECEIVER);

registerReceiver(smsReceiver,
receiverFilter);

}

protected void onPause() {


unregisterReceiver(sendReceiver);


unregisterReceiver(deliveryReceiver);


unregisterReceiver(smsReceiver);

}

private void sendSms() {

String smsBody =
"lab.sodino.sms.test";

String smsAddress =
"10086";

SmsManager smsMag =
SmsManager.getDefault();

Intent sendIntent = new
Intent(ACTION_SMS_SEND);

PendingIntent sendPI =
PendingIntent.getBroadcast(this, 0, sendIntent,


0);

Intent deliveryIntent = new
Intent(ACTION_SMS_DELIVERY);

PendingIntent deliveryPI =
PendingIntent.getBroadcast(this, 0,


deliveryIntent, 0);


smsMag.sendTextMessage(smsAddress, null, smsBody, sendPI,
deliveryPI);

}

public class SMSReceiver extends BroadcastReceiver {

public void onReceive(Context
context, Intent intent) {

String
actionName = intent.getAction();

int
resultCode = getResultCode();

if
(actionName.equals(ACTION_SMS_SEND)) {


switch (resultCode) {


case Activity.RESULT_OK:


serviceCenterAddressText


.append("/n[Send]SMS Send:Successed!");


break;


case SmsManager.RESULT_ERROR_GENERIC_FAILURE:


serviceCenterAddressText


.append("/n[Send]SMS
Send:RESULT_ERROR_GENERIC_FAILURE!");


break;


case SmsManager.RESULT_ERROR_NO_SERVICE:


serviceCenterAddressText


.append("/n[Send]SMS Send:RESULT_ERROR_NO_SERVICE!");


break;


case SmsManager.RESULT_ERROR_NULL_PDU:


serviceCenterAddressText


.append("/n[Send]SMS Send:RESULT_ERROR_NULL_PDU!");


break;


case SmsManager.RESULT_ERROR_RADIO_OFF:


break;


}

} else if
(actionName.equals(ACTION_SMS_DELIVERY)) {


switch (resultCode) {


case Activity.RESULT_OK:


serviceCenterAddressText


.append("/n[Delivery]SMS Delivery:Successed!");


break;


case SmsManager.RESULT_ERROR_GENERIC_FAILURE:


serviceCenterAddressText


.append("/n[Delivery]SMS
Delivery:RESULT_ERROR_GENERIC_FAILURE!");


break;


case SmsManager.RESULT_ERROR_NO_SERVICE:


serviceCenterAddressText


.append("/n[Delivery]SMS
Delivery:RESULT_ERROR_NO_SERVICE!");


break;


case SmsManager.RESULT_ERROR_NULL_PDU:


serviceCenterAddressText


.append("/n[Delivery]SMS
Delivery:RESULT_ERROR_NULL_PDU!");


break;


case SmsManager.RESULT_ERROR_RADIO_OFF:


serviceCenterAddressText


.append("/n[Delivery]SMS
Delivery:RESULT_ERROR_RADIO_OFF!");


break;


}


serviceCenterAddressText.append("/n正在等待下行短信...");

} else if
(actionName.equals(ACTION_SMS_RECEIVER)) {


System.out.println("[Sodino]result = " + resultCode);


Bundle bundle = intent.getExtras();


if (bundle != null) {


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


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


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


messages[i] = SmsMessage


.createFromPdu((byte[]) myOBJpdus[i]);


}


SmsMessage message = messages[0];


serviceCenterAddressText.append("/n短信服务中心号码为:"


+ message.getServiceCenterAddress());


}

}

}

}

}

最后要在AndroidManifest.xml中添加下面两个权限:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: