位置:首页 > 手机开发 > Android开发在线教程 > Android发送短信/SMS

Android发送短信/SMS

有以下两种方式来使用 Android 设备发送短信:

  • 使用 SmsManager 发送短信

  • 使用内置 Intent 发送短信

使用SmsManager 发送短信

SmsManager管理,例如在给定的移动设备将数据发送到的SMS操作。可以创建此对象调用静态方法SmsManager.getDefault() 如下:

SmsManager smsManager = SmsManager.getDefault();

创建 SmsManager 对象之后,可以使用 sendDataMessage() 方法指定的手机号码发送短信,如下:

smsManager.sendTextMessage("phoneNo", null, "SMS text", null, null);

除了上述方法外,SmsManager类可供选择的其他几个重要的函数。下面列出了这些方法:

S.N. 方法和说明
1 ArrayList<String> divideMessage(String text) 
这个方法把一个消息文本分成几个片段,最大不能大于短信大小
2 static SmsManager getDefault() 
这个方法被用来获取 SmsManager 的默认实例
3 void sendDataMessage(String destinationAddress, String scAddress, short destinationPort, byte[] data, PendingIntent sentIntent, PendingIntent deliveryIntent) 
这个方法被用来发送一个基于数据 SMS 到特定的应用程序的端口
4 void sendMultipartTextMessage(String destinationAddress, String scAddress, ArrayList<String> parts, ArrayList<PendingIntent> sentIntents, ArrayList<PendingIntent> deliveryIntents) 
发送一个基于多部分文本短信
5 void sendTextMessage(String destinationAddress, String scAddress, String text, PendingIntent sentIntent, PendingIntent deliveryIntent) 
发送基于文本的短信

示例

下面的示例演示如何在实际中使用 SmsManager 对象给定的手机号码发送短信。

要尝试这个例子中,需要实际配备了最新 Android OS 的移动设备,否则仿真器可能无法正常工作。
步骤 描述
1 使用Android Studio 创建Android应用程序,并将它命名为SendSMSDemounder。在创建这个项目,确保目标 SDK 编译在Android SDK 的最新版本或使用更高级别的API
2 修改 src/MainActivity.java 文件,并添加所需的代码以发送短信
3 修改所需的布局XML文件 res/layout/activity_main.xml 添加任何GUI组件。加入了一个简单的GUI以输入手机号码并短信发送,以及一个简单的按钮发送短信。
4 修改 res/values/strings.xml 定义所需的常量值
5 修改  AndroidManifest.xml  如下所示
6 运行该应用程序启动Android模拟器并验证应用程序所做的修改结果。

以下是修改的主活动文件 src/com.yiibai.sendsmsdemo/MainActivity.java 的内容

package com.example.sendsmsdemo;

import android.os.Bundle;
import android.app.Activity;
import android.telephony.SmsManager;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {

   Button sendBtn;
   EditText txtphoneNo;
   EditText txtMessage;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      sendBtn = (Button) findViewById(R.id.btnSendSMS);
      txtphoneNo = (EditText) findViewById(R.id.editTextPhoneNo);
      txtMessage = (EditText) findViewById(R.id.editTextSMS);

      sendBtn.setOnClickListener(new View.OnClickListener() {
         public void onClick(View view) {
            sendSMSMessage();
         }
      });

   }
   protected void sendSMSMessage() {
      Log.i("Send SMS", "");

      String phoneNo = txtphoneNo.getText().toString();
      String message = txtMessage.getText().toString();

      try {
         SmsManager smsManager = SmsManager.getDefault();
         smsManager.sendTextMessage(phoneNo, null, message, null, null);
         Toast.makeText(getApplicationContext(), "SMS sent.",
         Toast.LENGTH_LONG).show();
      } catch (Exception e) {
         Toast.makeText(getApplicationContext(),
         "SMS faild, please try again.",
         Toast.LENGTH_LONG).show();
         e.printStackTrace();
      }
   }
   @Override
   public boolean onCreateOptionsMenu(Menu menu) {
      // Inflate the menu; this adds items to the action bar if it is present.
      getMenuInflater().inflate(R.menu.main, menu);
      return true;
   }
}

下面是 res/layout/activity_main.xml 文件的内容:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

   <TextView
   android:id="@+id/textViewPhoneNo"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:text="@string/phone_label" />

   <EditText
   android:id="@+id/editTextPhoneNo"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:inputType="phone"/>

   <TextView
   android:id="@+id/textViewMessage"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:text="@string/sms_label" />

   <EditText
   android:id="@+id/editTextSMS"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:inputType="textMultiLine"/>

   <Button android:id="@+id/btnSendSMS"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:text="@string/send_sms_label"/>

</LinearLayout>

下面文件 res/values/strings.xml 的内容中定义两个新的常量:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">SendSMSDemo</string>
    <string name="action_settings">Settings</string>
    <string name="hello_world">Hello world!</string>
    <string name="phone_label">Enter Phone Number:</string>
    <string name="sms_label">Enter SMS Message:</string>
    <string name="send_sms_label">Send SMS</string>
    
</resources>

以下是AndroidManifest.xml 文件的默认内容:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.yiibai.sendsmsdemo"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />
    <uses-permission android:name="android.permission.SEND_SMS" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.yiibai.sendsmsdemo.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

我们尝试运行 SendSMSDemo 应用程序。Eclipse的AVD上安装的应用程序,并启动它,如果一切的设置和应用代码都没有问题,它会显示以下模拟器窗口: 

Android Mobile Device

选择移动设备作为一个选项,然后检查移动设备,这将显示以下画面:

Android发送短信/SMS

现在可以输入手机号码及文本消息并发送。最后点击"Send SMS"按钮发送短信。请确保GSM连接工作正常,以及提供正确的短信收件人。

可以把一些短信用逗号分隔,在程序中把它解析为一个数组的字符串,最后可以使用一个循环来发送消息给所有给定的手机号码。下一节将学习如何使用现有的 SMS 客户端发送短信。

使用内置Intent发送短信

发送短信通过调用Android内置短信功能,可以使用Android的Intent。以下部分说明使用 Intent 对象发送短信的功能。

Intent对象 - 发送短信动作

使用ACTION_VIEW 动作启动 Android 设备上安装 SMS 客户端。以下是简单的语法来创建一个 Intent 来使用 ACTION_VIEW 动作

Intent smsIntent = new Intent(Intent.ACTION_VIEW);

Intent对象 - 数据/发送短信类型

要发送的短信需要使用SetData()方法指定 smsto: 作为URI和数据类型将使用 setType() 方法如下vnd.android-dir/mms-sms: 

smsIntent.setData(Uri.parse("smsto:"));
smsIntent.setType("vnd.android-dir/mms-sms");

Intent 对象- 附加发送短信

Android已经内置支持添加电话号码和短信发送短信如下:

smsIntent.putExtra("address"  , new String("0123456789;3393993300"));
smsIntent.putExtra("sms_body"  , "Test SMS to Angilla");
这里address 和sms_body是大小写敏感的,应以小字符指定。可以指定一个以上的号码在单串,但由分号(;) 隔开。

示例

下面的示例演示如何在实际使用Intent对象启动SMS客户端发送短信给定的收件人。

要尝试这个例子中,需要实际配备了最新的 Android OS的移动设备,否则仿真器可能无法正常工作。
步骤 描述
1 使用Android Studio创建Android应用程序,并将它命名为SendSMSDemounder,创建这个项目,确保目标 SDK编译在Android SDK的最新版本或使用更高级别的API。
2 修改src/MainActivity.java文件,并添加所需的代码,以发送短信。
3 修改所需的布局XML文件 res/layout/activity_main.xml  添加任何GUI组件。添加一个简单的按钮用来触发启动SMS客户端。
4 修改 res/values/strings.xml 定义所需的常量值
5 修改 AndroidManifest.xml 如下所示
6 运行该应用程序启动Android模拟器并验证应用程序所做的修改结果。

以下是修改主活动文件 src/com.yiibai.sendsmsdemo/MainActivity.java 的内容

package com.example.sendsmsdemo;

import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {

   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      Button startBtn = (Button) findViewById(R.id.sendSMS);
      startBtn.setOnClickListener(new View.OnClickListener() {
         public void onClick(View view) {
         sendSMS();
      }
   });

   }
   protected void sendSMS() {
      Log.i("Send SMS", "");

      Intent smsIntent = new Intent(Intent.ACTION_VIEW);
      smsIntent.setData(Uri.parse("smsto:"));
      smsIntent.setType("vnd.android-dir/mms-sms");

      smsIntent.putExtra("address"  , new String ("0123456789"));
      smsIntent.putExtra("sms_body"  , "Test SMS to Angilla");
      try {
         startActivity(smsIntent);
         finish();
         Log.i("Finished sending SMS...", "");
      } catch (android.content.ActivityNotFoundException ex) {
         Toast.makeText(MainActivity.this, 
         "SMS faild, please try again later.", Toast.LENGTH_SHORT).show();
      }
   }
   @Override
   public boolean onCreateOptionsMenu(Menu menu) {
      // Inflate the menu; this adds items to the action bar if it is present.
      getMenuInflater().inflate(R.menu.main, menu);
      return true;
   }
}

下面是 res/layout/activity_main.xml 文件的内容:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   android:orientation="vertical" >

   <Button android:id="@+id/sendSMS"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:text="@string/compose_sms"/>
    
</LinearLayout>

下面文件 res/values/strings.xml 的内容中定义两个新的常量:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">SendSMSDemo</string>
    <string name="hello_world">Hello world!</string>
    <string name="action_settings">Settings</string>
    <string name="compose_sms">Compose SMS</string>

</resources>

以下是AndroidManifest.xml 文件的默认内容:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.yiibai.sendsmsdemo"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.yiibai.sendsmsdemo.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

我们尝试运行 SendSMSDemo 应用程序。 Eclipse AVD安装的应用程序,并启动它,如果一切设置和应用都没有问题,它会显示以下模拟器窗口: 

Android Mobile Device

选择移动设备作为一个选项,然后检查移动设备,这将显示以下画面:

Android发送短信/SMS

现在使用Compose SMS“按钮推出Android内置的SMS客户端,如下图所示:

Android发送短信/SMS

可以修改默认字段最后使用发送短信按钮(标有红色矩形)提到收件人发送短信。

以上示例代码下载:http://pan.baidu.com/s/1c0Ah508