Android 使用SmsManager发送短信

来源:互联网 发布:linux应用程序开发详解 编辑:程序博客网 时间:2024/06/16 17:15

SmsManager公有方法:

  • ArrayList<</SPAN>String> divideMessage(Stringtext)
    当短信超过SMS消息的最大长度时,将短信分割为几块。
    参数text——初始的消息,不能为空
    返回值:有序的ArrayList<</SPAN>String>,可以重新组合为初始的消息
  • static SmsManagergetDefault()
    获取SmsManager的默认实例。
    返回值SmsManager的默认实例
  • void SendDataMessage(String destinationAddress,StringscAddress, short destinationPort,byte[] data,PendingIntent sentIntent,PendingIntentdeliveryIntent)
    发送一个基于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就广播。
    异常:如果destinationAddressdata是空时,抛出IllegalArgumentException异常。
  • voidsendMultipartTextMessage(String destinationAddress,StringscAddress, ArrayList<</SPAN>String> parts,ArrayList<</SPAN>PendingIntent> sentIntents, ArrayList<</SPAN>PendingIntent> deliverIntents)
    发送一个基于SMS的多部分文本,调用者应用已经通过调用divideMessage(Stringtext)将消息分割成正确的大小。
    参数
    1)、destinationAddress——消息的目标地址
    2)、scAddress——服务中心的地址or为空使用当前默认的SMSC
    3)、parts——有序的ArrayList<</SPAN>String>,可以重新组合为初始的消息
    4)、sentIntents——跟SendDataMessage方法中一样,只不过这里的是一组PendingIntent
    5)、deliverIntents——跟SendDataMessage方法中一样,只不过这里的是一组PendingIntent
    异常:如果destinationAddressdata是空时,抛出IllegalArgumentException异常。
  • voidsendTextMessage(String destinationAddress, String scAddress, String text, PendingIntent sentIntent, PendingIntent deliveryIntent)
    发送一个基于SMS的文本。参数的意义和异常前面的已存在的一样,不再累述。

常量:

  • public static final intRESULT_ERROR_GENERIC_FAILURE
    表示普通错误,值为1(0x00000001)
  • public static final intRESULT_ERROR_NO_SERVICE
    表示服务当前不可用,值为4 (0x00000004)
  • public static final intRESULT_ERROR_NULL_PDU
    表示没有提供pdu,值为3 (0x00000003)
  • public static final intRESULT_ERROR_RADIO_OFF
    表示无线广播被明确地关闭,值为2 (0x00000002)
  • public static final intSTATUS_ON_ICC_FREE
    表示自由空间,值为0 (0x00000000)
  • public static final intSTATUS_ON_ICC_READ
    表示接收且已读,值为1 (0x00000001)
  • public static final intSTATUS_ON_ICC_SENT
    表示存储且已发送,值为5 (0x00000005)
  • public static final intSTATUS_ON_ICC_UNREAD
    表示接收但未读,值为3 (0x00000003)
  • public static final intSTATUS_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.LayoutParamslayParams = new LinearLayout.LayoutParams(
    LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
   LinearLayout linearLay = newLinearLayout(this);
  linearLay.setOrientation(LinearLayout.VERTICAL);
  linearLay.setLayoutParams(layParams);
   TextView textView = newTextView(this);
  textView.setBackgroundColor(0xffffffff);
  textView.setTextColor(0xff0000ff);
  textView.setTextSize(20);
  textView.setText("点击发送按钮将发送自定义字符串至10086");
  textView.setGravity(Gravity.CENTER);
  linearLay.addView(textView);
   Button btnSend = newButton(this);
   // LinearLayout.LayoutParamsbtnParams = new LinearLayout.LayoutParams(
   //LinearLayout.LayoutParams.FILL_PARENT,
   //LinearLayout.LayoutParams.WRAP_CONTENT);
  btnSend.setText("发送");
   btnSend.setOnClickListener(newButton.OnClickListener() {
    public voidonClick(View v) {
    serviceCenterAddressText.setText("正在等待发送短信...");
    sendSms();
    }
   });
  linearLay.addView(btnSend);
   serviceCenterAddressText = newTextView(this);
  serviceCenterAddressText.setText("正在等待发送短信...");
  serviceCenterAddressText.setBackgroundColor(0xffffffff);
  serviceCenterAddressText.setTextColor(0xff0000ff);
  serviceCenterAddressText.setTextSize(20);
  serviceCenterAddressText.setGravity(Gravity.LEFT);
  linearLay.addView(serviceCenterAddressText);
  setContentView(linearLay);
   // 注册send
   sendReceiver = newSMSReceiver();
   IntentFilter sendFilter = newIntentFilter(ACTION_SMS_SEND);
   registerReceiver(sendReceiver,sendFilter);
   // 注册delivery
   deliveryReceiver = newSMSReceiver();
   IntentFilter deliveryFilter =new IntentFilter(ACTION_SMS_DELIVERY);
  registerReceiver(deliveryReceiver, deliveryFilter);
   // 注册接收下行receiver
   smsReceiver = newSMSReceiver();
   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 = newIntent(ACTION_SMS_SEND);
   PendingIntent sendPI =PendingIntent.getBroadcast(this, 0, sendIntent,
    0);
   Intent deliveryIntent = newIntent(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(Contextcontext, Intent intent) {
    StringactionName = intent.getAction();
    intresultCode = 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]SMSSend: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]SMSDelivery:RESULT_ERROR_GENERIC_FAILURE!");
     break;
    case SmsManager.RESULT_ERROR_NO_SERVICE:
     serviceCenterAddressText
       .append("/n[Delivery]SMSDelivery:RESULT_ERROR_NO_SERVICE!");
     break;
    case SmsManager.RESULT_ERROR_NULL_PDU:
     serviceCenterAddressText
       .append("/n[Delivery]SMSDelivery:RESULT_ERROR_NULL_PDU!");
     break;
    case SmsManager.RESULT_ERROR_RADIO_OFF:
     serviceCenterAddressText
       .append("/n[Delivery]SMSDelivery: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中添加下面两个权限:
   
   

0 0
原创粉丝点击