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