《Android/OPhone開發完全講義》連載(8):收到簡訊了,我該做點什嗎?

來源:互聯網
上載者:User
本文為《Android/OPhone開發完全講義》一書的內容連載。轉載請註明出處

    簡訊是手機中經常使用到的一種服務。然而,當手機接收到簡訊時,也會向系統發送廣播。如果我們的應用程式要在手機接收到簡訊後做點什麼,那就需要接收這個系統廣播。
接收系統廣播的步驟我們已經熟悉了,下面就按步就班地來完成這兩個步驟。
1.編寫一個SMSReceiver類來接收系統廣播。

package net.blogjava.mobile.sms;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.gsm.SmsMessage;
import android.widget.Toast;

public class SMSReceiver extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        //  判斷接收到的廣播是否為收到簡訊的Broadcast Action
        if ("android.provider.Telephony.SMS_RECEIVED".equals(intent.getAction()))
        {
            StringBuilder sb = new StringBuilder();
            // 接收由SMS傳過來的資料
            Bundle bundle = intent.getExtras();
            // 判斷是否有資料
            if (bundle != null)
            {
                //  通過pdus可以獲得接收到的所有簡訊訊息
                Object[] objArray = (Object[]) bundle.get("pdus");
                //  構建簡訊對象array,並依據收到的對象長度來建立array的大小
                SmsMessage[] messages = new SmsMessage[objArray.length];
                for (int i = 0; i < objArray.length; i++)
                {
                    messages = SmsMessage.createFromPdu((byte[]) objArray);
                }
                //  將送來的簡訊合并自訂資訊於StringBuilder當中
                for (SmsMessage currentMessage : messages)
                {
                    sb.append("簡訊來源:");
                    // 獲得接收簡訊的電話號碼
                    sb.append(currentMessage.getDisplayOriginatingAddress());
                    sb.append("\n------簡訊內容------\n");
                    // 獲得簡訊的內容
                    sb.append(currentMessage.getDisplayMessageBody());
                }
            }
            Intent mainIntent = new Intent(context, Main.class);
            mainIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);            
            context.startActivity(mainIntent);
            //  使用Toast資訊氣球顯示接收到的簡訊內容
            Toast.makeText(context, sb.toString(), Toast.LENGTH_LONG).show();
        }
    }
}

在編寫SMSReceiver類時需要注意如下4點:

  • 接收簡訊的Broadcast Action是android.provider.Telephony.SMS_RECEIVED,因此,要在onReceiver方法的開始部分判斷接收到的是否是接收簡訊的Broadcast Action。
  • 需要通過Bundle.get("pdus")來獲得接收到的簡訊訊息。這個方法返回了一個表示簡訊內容的數組。每一個數組元素表示一條簡訊。這就意味著通過Bundle.get("pdus")可以返回多條系統接收到的簡訊內容。
  • 通過Bundle.get("pdus")返回的數組一般不能直接使用,需要使用SmsMessage.createFromPdu方法將這些數組元素轉換成SmsMessage對象才可以使用。每一個SmsMessage對象表示一條簡訊。
  • 通過SmsMessage類的getDisplayOriginatingAddress方法可以獲得傳送簡訊的電話號碼。通過getDisplayMessageBody方法可以獲得簡訊的內容。

2.  在AndroidManifest.xml檔案中配置SMSReceiver類,代碼如下:

<receiver android:name="SMSReceiver">            
    <intent-filter>
        <!--  指定SMSReceiver可以接收的Broadcast Action  -->
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
</receiver>

    為了使應用程式可以成功地接收SMS_RECEIVED廣播,還需要使用<uses-permission>標籤為應用程式開啟接收簡訊的許可權,代碼如下:

<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>

    現在啟動應用程式,介面上會顯示“等待接收簡訊...”的資訊。那麼這裡還有一個問題。如果我們在模擬器上測試這個程式呢?
    解決這個問題並不難,Android模擬器不僅可以類比程式的運行,還可以類比手機的很多動作,例如,發簡訊就是其中之一。要類比手機的動作,仍然要求助於DDMS透視圖。在DDMS透視圖中有一個【Emulator Control】視圖(如果DDMS中沒有這個視圖,請讀者通過Eclipse的【Window】>【Show View】功能表項目來顯示這個視圖)。在【Telephone Actions】群組方塊,選中SMS選項框,並在【Incomingnumber】文字框中輸入一個電話號,然後在【Message】文字框中輸入要發送的簡訊內容,最後單擊【Send】按鈕來類比傳送簡訊。輸入相應資訊後的【Emulator Control】視圖1所示。當單擊【Send】按鈕後,手機模擬器就會接收到簡訊,不管接收簡訊的應用程式是否啟動,都會顯示2所示的顯示簡訊內容的Toast資訊氣球。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.