android 发送短信的方法
方法一:调用系统的短信APP,发送短信。
Intent smsIntent = new Intent(Intent.ACTION_VIEW);
smsIntent.setData(Uri.parse("smsto:"));
smsIntent.setType("vnd.android-dir/mms-sms");//必须指定type
smsIntent.putExtra("address", new String("15050524563"));//address字段不能改
smsIntent.putExtra("sms_body", "测试");//sms_body 不能改
startActivity(smsIntent);
或者
<span style="white-space:pre"> </span> Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse("smsto:"+ "15050524525"));
intent.putExtra("sms_body", "测试");
startActivity(intent);
方法二:调用系统发送短信接口(此方法可以实现短信发送成功后回调)
利用SmsManager 发送短信参数说明。
SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage(String destinationAddress, String scAddress, String text,PendingIntent sentIntent, PendingIntent deliveryIntent);
/**
* 参数说明
* destinationAddress:收信人的手机号码
* scAddress:发信人的手机号码
* text:发送信息的内容
* sentIntent:发送是否成功的回执,用于监听短信是否发送成功。
* DeliveryIntent:接收是否成功的回执,用于监听短信对方是否接收成功。
*/
注册监听器:定义IntentFilter,注册BroadcastReceiver.
private void initBroadcastReceiver() {
//发送短信状态
IntentFilter sendIntentFilter = new IntentFilter();
sendIntentFilter.addAction(SENT_SMS_ACTION);
sendBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("发送短信状态");
switch (getResultCode()) {
case Activity.RESULT_OK:
Toast.makeText(context, "短信发送成功", Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
break;
case SmsManager.RESULT_ERROR_RADIO_OFF:
break;
case SmsManager.RESULT_ERROR_NULL_PDU:
break;
}
}
};
registerReceiver(sendBroadcastReceiver, sendIntentFilter);
//接收短信状态
IntentFilter deliverIntentFilter = new IntentFilter();
deliverIntentFilter.addAction(DELIVERED_SMS_ACTION);
deliverBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("接收短信状态");
Toast.makeText(context, "收信人已经成功接收", Toast.LENGTH_SHORT).show();
}
};
registerReceiver(deliverBroadcastReceiver, deliverIntentFilter);
}
点击按钮发送短信: 定义了发送状态和接收状态的PendingIntent。调用sendTextMessage 方法。
protected void sendMessageByInterface1() {
String phoneNumber = vSendNo.getText().toString().trim();
String message = vSendContent.getText().toString().trim();
SmsManager sms = SmsManager.getDefault();
Intent sentIntent = new Intent(SENT_SMS_ACTION);
PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, sentIntent, 0);
Intent deliverIntent = new Intent(DELIVERED_SMS_ACTION);
PendingIntent deliverPI = PendingIntent.getBroadcast(this, 0, deliverIntent, 0);
if (message.length() > 70) {
ArrayList<String> msgs = sms.divideMessage(message);
for (String msg : msgs) {
sms.sendTextMessage(phoneNumber, null, msg, sentPI, deliverPI);
}
} else {
sms.sendTextMessage(phoneNumber, null, message, sentPI, deliverPI);
}
}
另外一种发送短信的接口:
protected void sendMessageByInterface2() {
String phoneNumber = vSendNo.getText().toString().trim();
String message = vSendContent.getText().toString().trim();
SmsManager sms = SmsManager.getDefault();
Intent sentIntent = new Intent(SENT_SMS_ACTION);
PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, sentIntent, 0);
Intent deliverIntent = new Intent(DELIVERED_SMS_ACTION);
PendingIntent deliverPI = PendingIntent.getBroadcast(this, 0, deliverIntent, 0);
if (message.length() > 70) {
ArrayList<String> msgs = sms.divideMessage(message);
ArrayList<PendingIntent> sentIntents = new ArrayList<PendingIntent>();
for(int i = 0;i<msgs.size();i++){
sentIntents.add(sentPI);
}
sms.sendMultipartTextMessage(phoneNumber, null, msgs, sentIntents, null);
} else {
sms.sendTextMessage(phoneNumber, null, message, sentPI, deliverPI);
}
}
两种发送短信接口的区别在于,如果发送内容多余70字节。会发送长短信。
第一种方法发送短信,是将短信分割成多条短信,分别发给接收方。第二种方法是将短信内容一次性发给接收方。在接收方的短信列表中,显示的是一条短信,但是实际上还是按多条短信计费。
群发短信
for (int i = 0; i < contactList.size(); i++) { // contactList 发送人列表
Intent itSend = new Intent(SENT_SMS_ACTION); // 自定义 Intent Action
itSend.putExtra(KEY_PHONENUM, contactList.get(i)); // KEY_PHONENUM: 携带数据,收件人KEY 。
PendingIntent mSendPI = PendingIntent.getBroadcast(getApplicationContext(), i , itSend, PendingIntent.FLAG_ONE_SHOT );
//这里requestCode和flag的设置很重要,影响数据KEY_PHONENUM的传递。用循环I值作为了requestCode。
String content = mContext.getString(R.string.test); // 短信内容
smsManager.sendTextMessage(contactList.get(i), null, content, mSendPI, null); //smsManager 发送短信Manager
}
根据联系人循环发送短信。注意定义PendingIntent的时候,注意 requestCode 和 Flags 。