天天看點

Android 開發之旅:短信的收發及在android模拟器之間實踐(一)

本文通過運作兩個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、…

<b> 廣播接收者</b>:一個廣播接收者是這樣一個元件,它不做什麼事,僅是接受廣播公告并作出相應的反應。許多廣播源自于系統代碼,例如公告

時區的改變、電池電量低、已采取圖檔、使用者改變了語言偏好。應用程式也可以發起廣播,例如為了他其他程式知道某些資料已經下載下傳到裝置且他們可以使用這些數

broadcastreceiver類:是接受sendbroadcast()發送的意圖(intents)的基類。可以用context.registerreceiver()動态地注冊這個類的執行個體,或者通過androidmanifest.xml中&lt;receiver&gt;标簽靜态釋出。

廣播接收者不顯示一個使用者界面。然而,它們啟動一個活動去響應收到的資訊,或者他們可能使用<code>notificationmanager</code>去通知使用者。通知可以使用多種方式獲得使用者的注意——閃爍的背光、振動裝置、播放聲音等等。典型的是放在一個持久的圖示在狀态欄,使用者可以打開擷取資訊。

實作sms主要用到smsmanager類,該類繼承自java.lang.object類,下面我們介紹一下該類的主要成員。

<b>公有方法:</b>

arraylist&lt;string&gt; <b>dividemessage</b>(string text)

當短信超過sms消息的最大長度時,将短信分割為幾塊。

參數:text——初始的消息,不能為空

傳回值:有序的arraylist&lt;string&gt;,可以重新組合為初始的消息

static smsmanager <b>getdefault</b>()

擷取smsmanager的預設執行個體。

傳回值:smsmanager的預設執行個體

void<b> senddatamessage</b>(string destinationaddress<b>,</b> string scaddress<b>,</b> short destinationport<b>,</b> byte[] data<b>,</b> 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就廣播。

異常:如果destinationaddress或data是空時,抛出illegalargumentexception異常。

void<b> sendmultiparttextmessage</b>(string destinationaddress<b>,</b> string scaddress<b>,</b> arraylist&lt;string&gt;<b> </b>parts<b>,</b> arraylist&lt;pendingintent&gt; sentintents, arraylist&lt;pendingintent&gt; <b> </b>deliverintents)

發送一個基于sms的多部分文本,調用者應用已經通過調用<b>dividemessage</b>(string text)将消息分割成正确的大小。

2)、scaddress——服務中心的位址or為空使用目前預設的smsc

3)、parts——有序的arraylist&lt;string&gt;,可以重新組合為初始的消息

4)、sentintents——跟<b>senddatamessage</b>方法中一樣,隻不過這裡的是一組pendingintent

5)、deliverintents——跟<b>senddatamessage</b>方法中一樣,隻不過這裡的是一組pendingintent

void<b> sendtextmessage</b>(string destinationaddress, string scaddress, string text, pendingintent sentintent, pendingintent deliveryintent)

發送一個基于sms的文本。參數的意義和異常前面的已存在的一樣,不再累述。

<b>常量:</b>

public static final int <b>result_error_generic_failure</b>

表示普通錯誤,值為1(0x00000001)

public static final int <b>result_error_no_service</b>

表示服務目前不可用,值為4 (0x00000004)

public static final int <b>result_error_null_pdu</b>

表示沒有提供pdu,值為3 (0x00000003)

public static final int <b>result_error_radio_off</b>

表示無線廣播被明确地關閉,值為2 (0x00000002)

public static final int <b>status_on_icc_free</b>

表示自由空間,值為0 (0x00000000)

public static final int <b>status_on_icc_read</b>

表示接收且已讀,值為1 (0x00000001)

public static final int <b>status_on_icc_sent</b>

表示存儲且已發送,值為5 (0x00000005)

public static final int <b>status_on_icc_unread</b>

表示接收但未讀,值為3 (0x00000003)

public static final int <b>status_on_icc_unsent</b>

表示存儲但為發送,值為7 (0x00000007)

1)、首先,編輯布局檔案res/layout/main.xml,達到我們想要的結果,界面如下:

Android 開發之旅:短信的收發及在android模拟器之間實踐(一)

圖1、程式運作界面

對應的xml代碼如下:

相應的要在res/values/strings.xm中添加上面定義的視圖的text的值,如下:

2)、做完這些準備工作之後,我麼要開始編寫代碼實作簡單的短信發送了。

通過第一步我們建構好界面之後,現在要在上面的基礎上編寫業務邏輯了。大緻過程為:在java源檔案中,擷取使用者在edtphoneno中輸入的電

話号碼,edtcontent中輸入要發送的内容;然後點選btnsend按鈕發送短信,要達到這個目的我們要設定btnsend的

onclicklistener以達到當點選它觸發發送短信的功能,而且要發送短信就要用到我們前面介紹的smsmanager類提供的方法接口。

設定btnsend的onclicklistener的代碼如下:

發送短信的功能的代碼如下:

如果你已經看了第2節介紹的smsmanager類的介紹,代碼應該

很好了解。在這裡要說明的是,sendtextmessage方法中的第4個和第5個參數pendingintent設為null,這樣的話不能根據短信

發出之後的狀态做相應的事情,如短信發送失敗後的提醒、接收者成功接收後的回執……完整的流程源碼如下: 

3)運作前,還要在清單檔案androidmanifest.xml中加入允許發送短信的權限:

運作上面我們編寫的textmessage程式,另外在windows的指令行下切換到tools目錄下,并輸入emulator –data smsreceiver,我的如下:

Android 開發之旅:短信的收發及在android模拟器之間實踐(一)

這樣就會啟動一個android模拟器,如下所示:(<b>注意它的編号:5556,就是用這個編号與它通信的</b>)

Android 開發之旅:短信的收發及在android模拟器之間實踐(一)

圖2、通過emulator啟動一個android模拟器

通過我們textmessage程式啟動的android模拟器,編寫短信:

Android 開發之旅:短信的收發及在android模拟器之間實踐(一)

圖3、textmessage程式個5556模拟器發短信

點選發送之後,通過指令行啟動的5556号android模拟器會收到我們剛才發送的短信,如下所示:

Android 開發之旅:短信的收發及在android模拟器之間實踐(一)

圖4、收到短信的提示

如果通過指令行的emulator啟動android模拟器提示“no dns servers found!”,這時我們發的短信模拟器是收不到的。

在windows下,如果電腦沒有介入網絡,即找不dns伺服器的話會出現這種情況!

在mac下,如果提示這個警告的話,可以這樣解決:檢查你是否有<code>/etc/resolv.conf</code>檔案,如果沒有的話,通過下面的指令行

上面我們實作了一個簡單的sms程式,下面我們要對它進行增強!你肯定已經注意到了,我們上面的sms程式的sendtextmessage方法中的第4個和第5個參數pendingintent設為null,即sentintent和deliveryintent。

第4個參數-sendintent,當消息成功發送或發送失敗都将被觸發。廣播接收者的結果碼,activity.result_ok表示成功,或

result_error_null_pdu之一表示錯誤。對應result_error_generic_failure,sentintent可能包括額外的“錯誤代碼”包含一個無線電廣播技術特定的值,通常隻在修複故障時有用。第5個參數-deliveryintent,僅當目标接收到你的sms消息才觸發。

為了跟蹤發出的短信的狀态,實作和注冊broadcast receiver(廣播接收者)監聽傳遞給sendtextmessage方法的參數pending intents。下面我們就實作和注冊這個廣播接收者:

在基本完成了要做的工作,接下來要做的就是将sendtextmessage的第4個和第5個參數改為sentpi、deliverpi,這樣工作基本完成,修改後的sendsms方法如下:

運作之後的,發送短信成功的話就可以看到如下界面:

Android 開發之旅:短信的收發及在android模拟器之間實踐(一)

圖5、增強sms(一)

下面這個增強是使sms能夠發送二進制資料。要發送資料要使用smsmanager類的senddatamessage方法,跟sendtextmessage方法類似,隻不過該方法多了一個目标端口的參數,建構該sms的過程跟前面的類似這裡就不在累述。

繼續閱讀