Android 使用SmsManager发送短信
2015-07-14 17:16
399 查看
[b]SmsManager[/b]公有方法:
ArrayList<</SPAN>String> divideMessage(Stringtext)
当短信超过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中添加下面两个权限:
相关文章推荐
- Android&nbsp;申请签名证书详解
- Android&nbsp;复制文件的一种方法
- Android&nbsp;解析XML
- Android&nbsp;读取系统日志LogCat
- Android&nbsp;蓝牙编程
- Android&nbsp;设置全屏及自定义标题栏
- Android&nbsp;List与数组的相互转化
- Android&nbsp;监听EditText的状态改变
- Android 调用照相机拍照把照片转化为字节数组
- Android 解决Error generating final archive: Debug Certificate 问题
- Android ScrollView与ListView一起(嵌套)使用解决ListView自动滚动的几点方案
- Android SQLite中表自动生成字段的方法
- Android环境配置
- Android 如何使用draw9patch,介绍的很详细,图文并茂,收藏下,备忘!
- Android 设置Dialog不允许返回或搜索键消除
- Android&nbsp;获取手机IMEI
- Android 在代码中设置打开关闭GPS不必用户操作
- Android TextView自动换行文字排版参差不齐的原因
- Android 在OnCreate()中获取控件高度与宽度
- Android为Spinner填充数据后设置默认值的问题