SmsManager发短信(—)

SmsManager公有方法:

  • ArrayList<String> divideMessage(String text) 
    当短信超过SMS消息的最大长度时,将短信分割为几块。 
    参数text——初始的消息,不能为空 
    返回值:有序的ArrayList<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就广播。
    异常:如果destinationAddressdata是空时,抛出IllegalArgumentException异常。
  • void sendMultipartTextMessage(String destinationAddress, String scAddress, ArrayList<String> parts,ArrayList<PendingIntent> sentIntents, ArrayList<PendingIntent>  deliverIntents) 
    发送一个基于SMS的多部分文本,调用者应用已经通过调用divideMessage(String text)将消息分割成正确的大小。 
    参数: 
    1)、destinationAddress——消息的目标地址 
    2)、scAddress——服务中心的地址or为空使用当前默认的SMSC 
    3)、parts——有序的ArrayList<String>,可以重新组合为初始的消息 
    4)、sentIntents——跟SendDataMessage方法中一样,只不过这里的是一组PendingIntent 
    5)、deliverIntents——跟SendDataMessage方法中一样,只不过这里的是一组PendingIntent 
    异常:如果destinationAddressdata是空时,抛出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)


 

简单的SMS发送程序

1)、首先,编辑布局文件res/layout/main.xml,达到我们想要的结果,界面如下:


  android:id="@+id/widget1"
  android:background="@drawable/white"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  xmlns:android="http://schemas.android.com/apk/res/android"
  >
      android:id="@+id/widget27"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/str_textview"
    android:textSize="16sp"
    android:layout_x="0px"
    android:layout_y="12px"
  >
 
      android:id="@+id/myEditText1"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text=""
    android:textSize="18sp"
    android:layout_x="60px"
    android:layout_y="2px"
  >
 
      android:id="@+id/myEditText2"
    android:layout_width="fill_parent"
    android:layout_height="223px"
    android:text=""
    android:textSize="18sp"
    android:layout_x="0px"
    android:layout_y="52px"
  >
 
      android:id="@+id/myButton1"
    android:layout_width="162px"
    android:layout_height="wrap_content"
    android:text="@string/str_button1"
    android:layout_x="80px"
    android:layout_y="302px"
  >
 

Android 开发之旅:短信的收发及在android模拟器之间实践(一)

2010-06-14 16:44 by 吴秦, 13437 visits, 收藏, 编辑

引言

本文通过运行两个Android模拟器,介绍在Android中如何实现短信服务(SMS,short message service)的功能。通过这个例子,我想带给大家的是:更加熟悉之前介绍过的Android应用程序的概念及技术细节,且通过实例调度大家的兴趣。我之所以选择SMS为例子,主要原因是SMS已经非常成熟了,从中可以发掘更多的信息和技术细节,而且我相信大部分人发短信比打电话多。

本文的主要内容如下:

  • 1、温故知新
  • 2、准备工作:SMS涉及的主要类SmsManager
  • 3、简单的SMS发送程序
    • 3.1、运行SMS程序给另一个android模拟器发短
  • 4、SMS增强(一)
  • 5、SMS增强(二)
  • 6、SMS接收程序(下篇)
  • 7、emulator工具(下篇)
  • 8、…

1、温故知新

广播接收者:一个广播接收者是这样一个组件,它不做什么事,仅是接受广播公告并作出相应的反应。许多广播源自于系统代码,例如公告时区的改变、电池电量低、已采取图片、用户改变了语言偏好。应用程序也可以发起广播,例如为了他其他程序知道某些数据已经下载到设备且他们可以使用这些数据

BroadcastReceiver类:是接受sendBroadcast()发送的意图(intents)的基类。可以用Context.registerReceiver()动态地注册这个类的实例,或者通过AndroidManifest.xml标签静态发布。

广播接收者不显示一个用户界面。然而,它们启动一个活动去响应收到的信息,或者他们可能使用NotificationManager去通知用户。通知可以使用多种方式获得用户的注意——闪烁的背光、振动设备、播放声音等等。典型的是放在一个持久的图标在状态栏,用户可以打开获取信息。

2、准备工作:SMS涉及的主要类SmsManager

实现SMS主要用到SmsManager类,该类继承自java.lang.Object类,下面我们介绍一下该类的主要成员。

公有方法:

  • ArrayList<String> divideMessage(String text) 
    当短信超过SMS消息的最大长度时,将短信分割为几块。 
    参数text——初始的消息,不能为空 
    返回值:有序的ArrayList<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就广播。
    异常:如果destinationAddressdata是空时,抛出IllegalArgumentException异常。
  • void sendMultipartTextMessage(String destinationAddress, String scAddress, ArrayList<String> parts,ArrayList<PendingIntent> sentIntents, ArrayList<PendingIntent>  deliverIntents) 
    发送一个基于SMS的多部分文本,调用者应用已经通过调用divideMessage(String text)将消息分割成正确的大小。 
    参数: 
    1)、destinationAddress——消息的目标地址 
    2)、scAddress——服务中心的地址or为空使用当前默认的SMSC 
    3)、parts——有序的ArrayList<String>,可以重新组合为初始的消息 
    4)、sentIntents——跟SendDataMessage方法中一样,只不过这里的是一组PendingIntent 
    5)、deliverIntents——跟SendDataMessage方法中一样,只不过这里的是一组PendingIntent 
    异常:如果destinationAddressdata是空时,抛出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)

3、简单的SMS发送程序

1)、首先,编辑布局文件res/layout/main.xml,达到我们想要的结果,界面如下:


  android:id="@+id/widget1"
  android:background="@drawable/white"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  xmlns:android="http://schemas.android.com/apk/res/android"
  >
      android:id="@+id/widget27"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/str_textview"
    android:textSize="16sp"
    android:layout_x="0px"
    android:layout_y="12px"
  >
 
      android:id="@+id/myEditText1"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text=""
    android:textSize="18sp"
    android:layout_x="60px"
    android:layout_y="2px"
  >
 
      android:id="@+id/myEditText2"
    android:layout_width="fill_parent"
    android:layout_height="223px"
    android:text=""
    android:textSize="18sp"
    android:layout_x="0px"
    android:layout_y="52px"
  >
 
      android:id="@+id/myButton1"
    android:layout_width="162px"
    android:layout_height="wrap_content"
    android:text="@string/str_button1"
    android:layout_x="80px"
    android:layout_y="302px"
  >
 

2)、做完这些准备工作之后,我么要开始编写代码实现简单的短信发送了。

package irdc.EX05_03;

import android.app.Activity; /*必需引用PendingIntent类才能使用getBrocast()*/
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle; /*必需引用telephony.gsm.SmsManager类才能使用sendTextMessage()*/
import android.telephony.SmsManager;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class EX05_03 extends Activity
{
  /* 声明变量一个Button与两个EditText */
  private Button mButton1;
  private EditText mEditText1;
  private EditText mEditText2;

  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    /* 透过findViewById建构子来建构EditText1,EditText2与Button对象 */
    mEditText1 = (EditText) findViewById(R.id.myEditText1);
    mEditText2 = (EditText) findViewById(R.id.myEditText2);
    mButton1 = (Button) findViewById(R.id.myButton1);
    /* 将默认文字加载EditText中 */
    mEditText1.setText("请输入电话号码");
    mEditText2.setText("请输入短信内容!!");
    /* 设定onClickListener 让使用者点选EditText时做出反应 */
    mEditText1.setOnClickListener(new EditText.OnClickListener()
    {
      public void onClick(View v)
      {
        /* 点选EditText时清空内文 */
        mEditText1.setText("");
      }
    });
    /* 设定onClickListener 让使用者点选EditText时做出反应 */
    mEditText2.setOnClickListener(new EditText.OnClickListener()
    {
      public void onClick(View v)
      {
        /* 点选EditText时清空内文 */
        mEditText2.setText("");
      }
    });
    /* 设定onClickListener 让使用者点选Button时做出反应 */
    mButton1.setOnClickListener(new Button.OnClickListener()
    {

      @Override
      public void onClick(View v)
      {
        /* 由EditText1取得简讯收件人电话 */
        String strDestAddress = mEditText1.getText().toString();
        /* 由EditText2取得简讯文字内容 */
        String strMessage = mEditText2.getText().toString();
        /* 建构一取得default instance的 SmsManager对象 */
        SmsManager smsManager = SmsManager.getDefault();
        // TODO Auto-generated method stub
        /* 检查收件人电话格式与简讯字数是否超过70字符 */
        if (isPhoneNumberValid(strDestAddress) == true
            && iswithin70(strMessage) == true)
        {
          try
          {
            /*
             * 两个条件都检查通过的情况下,发送简讯 *
             * 先建构一PendingIntent对象并使用getBroadcast()方法进行Broadcast *
             * 将PendingIntent,电话,简讯文字等参数传入sendTextMessage()方法发送简讯
             */
            PendingIntent mPI = PendingIntent.getBroadcast(EX05_03.this, 0,
                new Intent(), 0);
            smsManager.sendTextMessage(strDestAddress, null, strMessage, mPI,
                null);
          } catch (Exception e)
          {
            e.printStackTrace();
          }
          Toast.makeText(EX05_03.this, "送出成功!!", Toast.LENGTH_SHORT).show();
          mEditText1.setText("");
          mEditText2.setText("");
        }
        /* 电话格式与简讯文字不符合条件时,使用Toast告知用户检查 */
        else
        {
          /* 电话格式不符 */
          if (isPhoneNumberValid(strDestAddress) == false)
          {
            /* 且字数超过70字符 */
            if (iswithin70(strMessage) == false)
            {
              Toast.makeText(EX05_03.this, "电话号码格式错误+短信内容超过70字,请检查!!",
                  Toast.LENGTH_SHORT).show();
            } else
            {
              Toast
                  .makeText(EX05_03.this, "电话号码格式错误,请检查!!", Toast.LENGTH_SHORT)
                  .show();
            }
          }
          /* 字数超过70字符 */
          else if (iswithin70(strMessage) == false)
          {
            Toast.makeText(EX05_03.this, "短信内容超过70字,请删除部分内容!!",
                Toast.LENGTH_SHORT).show();
          }
        }
      }
    });
  }

  /* 检查字符串是否为电话号码的方法,并回传true or false的判断值 */
  public static boolean isPhoneNumberValid(String phoneNumber)
  {
    boolean isValid = false;
    /*
     * 可接受的电话格式有: * ^\\(? : 可以使用 "(" 作为开头 * (\\d{3}): 紧接着三个数字 * \\)? : 可以使用")"接续
     * * [- ]? : 在上述格式后可以使用具选择性的 "-". * (\\d{3}) : 再紧接着三个数字 * [- ]? : 可以使用具选择性的
     * "-" 接续. * (\\d{4})$: 以四个数字结束. * 可以比对下列数字格式: * (123)456-7890,
     * 123-456-7890, 1234567890, (123)-456-7890
     */
    String expression = "^\\(?(\\d{3})\\)?[- ]?(\\d{3})[- ]?(\\d{4})$";
    /*
     * 可接受的电话格式有: * ^\\(? : 可以使用 "(" 作为开头 * (\\d{2}): 紧接着两个数字 * \\)? : 可以使用")"接续
     * * [- ]? : 在上述格式后可以使用具选择性的 "-". * (\\d{4}) : 再紧接着四个数字 * [- ]? : 可以使用具选择性的
     * "-" 接续. * (\\d{4})$: 以四个数字结束. * 可以比对下列数字格式: * (123)456-7890,
     * 123-456-7890, 1234567890, (123)-456-7890
     */
    String expression2 = "^\\(?(\\d{2})\\)?[- ]?(\\d{4})[- ]?(\\d{4})$";
    CharSequence inputStr = phoneNumber;
    /* 建立Pattern */Pattern pattern = Pattern.compile(expression);
    /* 将Pattern 以参数传入Matcher作Regular expression */
    Matcher matcher = pattern.matcher(inputStr);
    /* 建立Pattern2 */Pattern pattern2 = Pattern.compile(expression2);
    /* 将Pattern2 以参数传入Matcher2作Regular expression */
    Matcher matcher2 = pattern2.matcher(inputStr);
    if (matcher.matches() || matcher2.matches())
    {
      isValid = true;
    }
    return isValid;
  }

  public static boolean iswithin70(String text)
  {
    if (text.length() <= 70)
      return true;
    else
      return false;
  }
}

你可能感兴趣的:(android基础)