Android 短信應用——短信信息實時獲取

我們知道,隻需通過代碼就可以讀到收件箱中的短信,發件箱中的短信;但是卻沒辦法在短信發來的瞬間獲取;如果我們在短信發來的一瞬間能得到相應的信息內容,那麼我們就可以依次來展開很多應用瞭——也就是通過短信去遠程操作一部手機。
 
如果想實時獲取,就需要調用receiver瞭,寫一個監聽類,這樣我們就可以實時獲取短息信息瞭。
  
預覽圖:

 

還是來看看代碼吧。

 

 

首先,我們需要創建一個監聽類SMSBroadcastReceiver,讓他去繼承BroadcastReceiver。

 

再來初始化一個常量ACTION,並賦短信相關參數值。

[java] android.provider.Telephony.SMS_RECEIVED 
android.provider.Telephony.SMS_RECEIVED
 

接著創建onReceive方法。

 

然後用getAction去監聽手機短信相關動態,利用StringBuffer來保存短信信息。

 

再然後主要代碼瞭。

[java] @Override
    public void onReceive(Context context, Intent intent) { 
        if (intent.getAction().equals(ACTION)) { 
            StringBuffer SMSAddress = new StringBuffer(); 
            StringBuffer SMSContent = new StringBuffer(); 
            Bundle bundle = intent.getExtras(); 
            if (bundle != null) { 
                Object[] pdusObjects = (Object[]) bundle.get("pdus"); 
                SmsMessage[] messages = new SmsMessage[pdusObjects.length]; 
                for (int i = 0; i < pdusObjects.length; i++) { 
                    messages[i] = SmsMessage 
                            .createFromPdu((byte[]) pdusObjects[i]); 
                } 
                for (SmsMessage message : messages) { 
                    SMSAddress.append(message.getDisplayOriginatingAddress()); 
                    SMSContent.append(message.getDisplayMessageBody()); 
                } 
            } 
        } 
    } 
@Override
 public void onReceive(Context context, Intent intent) {
  if (intent.getAction().equals(ACTION)) {
   StringBuffer SMSAddress = new StringBuffer();
   StringBuffer SMSContent = new StringBuffer();
   Bundle bundle = intent.getExtras();
   if (bundle != null) {
    Object[] pdusObjects = (Object[]) bundle.get("pdus");
    SmsMessage[] messages = new SmsMessage[pdusObjects.length];
    for (int i = 0; i < pdusObjects.length; i++) {
     messages[i] = SmsMessage
       .createFromPdu((byte[]) pdusObjects[i]);
    }
    for (SmsMessage message : messages) {
     SMSAddress.append(message.getDisplayOriginatingAddress());
     SMSContent.append(message.getDisplayMessageBody());
    }
   }
  }
 }
代碼中的SMSAddress為發送短信的號碼,SMSContent為短信內容。

 

要想看到是否成功獲取,最簡單的方法就是把這兩個參數打印出來。

[html] System.out.println("發送號碼:" + SMSAddress + "\n" + "短信內容:" 
                            + SMSContent); 
System.out.println("發送號碼:" + SMSAddress + "\n" + "短信內容:"
       + SMSContent);
 
不過要把他們加入for循環中,因為當新信息發來時,SMSAddress和SMSContent將被替換。

因此如果要是做應用時,也是在for循環中判斷的。

 

最後要記得在Manifest.xml中註冊監聽器。

[java] <receiver android:name="cn.etzmico.SMSBroadcastReceiver"> 
        <intent-filter> 
            <action android:name="android.provider.Telephony.SMS_RECEIVED"></action> 
        </intent-filter> 
    </receiver> 
 <receiver android:name="cn.etzmico.SMSBroadcastReceiver">
   <intent-filter>
    <action android:name="android.provider.Telephony.SMS_RECEIVED"></action>
   </intent-filter>
  </receiver>

同時要加上權限。

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

這樣,我們運行程序後,隻要有短信接收,SMSAddress和SMSContent就會被賦值。

 

 

這裡順便補充一個知識點,關於Eclipse程序的。

相信很多初學者不知道,Eclipse自帶一個發短信插件,可以實現給虛擬機發送短信。這樣,我們在做短信應用的時候,就不用同時啟動多臺虛擬機瞭……

如何操作呢?方法如下。

1.點擊菜單欄中的 Window 窗口。

2.找到哦啊其中的 Show View 目錄。

3. 選擇 Other…。

  

 

然後我們發現會彈出一個窗口。

  

 

4,為瞭便於操作,我們在彈出的窗口的搜索欄中,直接輸入 Emulator Control。

  

 

5.點擊列表中的 Emulator Control,再點OK;或者直接雙擊。

 

這樣就出現瞭一個窗口,其中有很多參數。

其他的以後有機會再做介紹,我們這次至用到其中4個。

  

 

如圖所示,我們隻需要輸入對應的參數,選擇需要的類型,最後點發送就可以瞭。

 

PS:有的人奇怪為什麼灰色,沒法輸入,沒法選擇,那是因為你沒有選中模擬器。這個插件隻能同時給一個模擬器發送消息。關於模擬器的選擇,和調用Emulator Control的方法差不多,區別隻是在輸入Emulator Control的時候輸入 Devices 就可以瞭。你當前選中哪個模擬器瞭,就會給哪個模擬器發送消息,不需要輸入模擬器號碼。

 

Demo資源:http://up.aiwalls.com/2012/0308/20120308012041937.zip
 

 摘自 Etzmico 

發佈留言