隨筆 - 312, 文章 - 14, 評論 - 1393, 引用 - 0

          導(dǎo)航

          <2010年9月>
          2930311234
          567891011
          12131415161718
          19202122232425
          262728293012
          3456789

          公告

          關(guān)注我的新浪微博

          我的著作









          常用鏈接

          留言簿(126)

          我參與的團(tuán)隊(duì)

          隨筆分類(818)

          隨筆檔案(310)

          文章分類(1)

          文章檔案(8)

          相冊

          ADSL、3G查詢

          CSDN

          eclipse

          ibm

          Java EE

          Linux

          Web

          云服務(wù)

          代理網(wǎng)站

          關(guān)注的網(wǎng)站

          協(xié)議

          喜歡的Blog

          國內(nèi)廣告平臺

          圖書出版

          在線培訓(xùn)

          開發(fā)工具

          微博客戶端

          手機(jī)鈴聲

          操作系統(tǒng)

          • ReactOS
          • 一個與windowXP/2003兼容的操作系統(tǒng)

          數(shù)學(xué)

          文件格式

          源碼資源

          移動(Mobile)

          編程語言

          英語學(xué)習(xí)

          最新隨筆

          搜索

          •  

          積分與排名

          • 積分 - 1974691
          • 排名 - 6

          最新評論

          閱讀排行榜

          評論排行榜

          《Android/OPhone開發(fā)完全講義》連載(8):收到短信了,我該做點(diǎn)什么?

          本文為《Android/OPhone開發(fā)完全講義》一書的內(nèi)容連載。轉(zhuǎn)載請注明出處

              短信是手機(jī)中經(jīng)常使用到的一種服務(wù)。然而,當(dāng)手機(jī)接收到短信時,也會向系統(tǒng)發(fā)送廣播。如果我們的應(yīng)用程序要在手機(jī)接收到短信后做點(diǎn)什么,那就需要接收這個系統(tǒng)廣播。
          接收系統(tǒng)廣播的步驟我們已經(jīng)熟悉了,下面就按步就班地來完成這兩個步驟。
          1.編寫一個SMSReceiver類來接收系統(tǒng)廣播。

          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傳過來的數(shù)據(jù)
                      Bundle bundle = intent.getExtras();
                      
          // 判斷是否有數(shù)據(jù)
                      if (bundle != null)
                      {
                          
          //  通過pdus可以獲得接收到的所有短信消息
                          Object[] objArray = (Object[]) bundle.get("pdus");
                          
          //  構(gòu)建短信對象array,并依據(jù)收到的對象長度來創(chuàng)建array的大小
                          SmsMessage[] messages = new SmsMessage[objArray.length];
                          
          for (int i = 0; i < objArray.length; i++)
                          {
                              messages 
          = SmsMessage.createFromPdu((byte[]) objArray);
                          }
                          
          //  將送來的短信合并自定義信息于StringBuilder當(dāng)中
                          for (SmsMessage currentMessage : messages)
                          {
                              sb.append(
          "短信來源:");
                              
          // 獲得接收短信的電話號碼
                              sb.append(currentMessage.getDisplayOriginatingAddress());
                              sb.append(
          "\n------短信內(nèi)容------\n");
                              
          // 獲得短信的內(nèi)容
                              sb.append(currentMessage.getDisplayMessageBody());
                          }
                      }
                      Intent mainIntent 
          = new Intent(context, Main.class);
                      mainIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);            
                      context.startActivity(mainIntent);
                      
          //  使用Toast信息提示框顯示接收到的短信內(nèi)容
                      Toast.makeText(context, sb.toString(), Toast.LENGTH_LONG).show();
                  }
              }
          }

          在編寫SMSReceiver類時需要注意如下4點(diǎn):
          • 接收短信的Broadcast Action是android.provider.Telephony.SMS_RECEIVED,因此,要在onReceiver方法的開始部分判斷接收到的是否是接收短信的Broadcast Action。
          • 需要通過Bundle.get("pdus")來獲得接收到的短信消息。這個方法返回了一個表示短信內(nèi)容的數(shù)組。每一個數(shù)組元素表示一條短信。這就意味著通過Bundle.get("pdus")可以返回多條系統(tǒng)接收到的短信內(nèi)容。
          • 通過Bundle.get("pdus")返回的數(shù)組一般不能直接使用,需要使用SmsMessage.createFromPdu方法將這些數(shù)組元素轉(zhuǎn)換成SmsMessage對象才可以使用。每一個SmsMessage對象表示一條短信。
          • 通過SmsMessage類的getDisplayOriginatingAddress方法可以獲得發(fā)送短信的電話號碼。通過getDisplayMessageBody方法可以獲得短信的內(nèi)容。
          2.  在AndroidManifest.xml文件中配置SMSReceiver類,代碼如下:

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

              為了使應(yīng)用程序可以成功地接收SMS_RECEIVED廣播,還需要使用<uses-permission>標(biāo)簽為應(yīng)用程序打開接收短信的權(quán)限,代碼如下:

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

              現(xiàn)在啟動應(yīng)用程序,界面上會顯示“等待接收短信...”的信息。那么這里還有一個問題。如果我們在模擬器上測試這個程序呢?
              解決這個問題并不難,Android模擬器不僅可以模擬程序的運(yùn)行,還可以模擬手機(jī)的很多動作,例如,發(fā)短信就是其中之一。要模擬手機(jī)的動作,仍然要求助于DDMS透視圖。在DDMS透視圖中有一個【Emulator Control】視圖(如果DDMS中沒有這個視圖,請讀者通過Eclipse的【Window>Show View】菜單項(xiàng)來顯示這個視圖)。在【Telephone Actions】分組框,選中SMS選項(xiàng)框,并在【Incomingnumber】文本框中輸入一個電話號,然后在【Message】文本框中輸入要發(fā)送的短信內(nèi)容,最后單擊【Send】按鈕來模擬發(fā)送短信。輸入相應(yīng)信息后的【Emulator Control】視圖如圖1所示。當(dāng)單擊【Send】按鈕后,手機(jī)模擬器就會接收到短信,不管接收短信的應(yīng)用程序是否啟動,都會顯示如圖2所示的顯示短信內(nèi)容的Toast信息提示框。












          Android開發(fā)完全講義(第2版)(本書版權(quán)已輸出到臺灣)

          http://product.dangdang.com/product.aspx?product_id=22741502



          Android高薪之路:Android程序員面試寶典 http://book.360buy.com/10970314.html


          新浪微博:http://t.sina.com.cn/androidguy   昵稱:李寧_Lining

          posted on 2010-09-13 16:59 銀河使者 閱讀(2917) 評論(1)  編輯  收藏 所屬分類: java 原創(chuàng)移動(mobile)Android/OPhone

          評論

          # re: 《Android/OPhone開發(fā)完全講義》連載(8):收到短信了,我該做點(diǎn)什么?  回復(fù)  更多評論   

          來打打醬油。
          2010-09-27 09:37 | 阿蜜果
          主站蜘蛛池模板: 怀宁县| 沂水县| 芜湖县| 锡林浩特市| 琼中| 黄梅县| 朝阳县| 岚皋县| 沁阳市| 江达县| 广灵县| 宜城市| 孝感市| 丘北县| 海门市| 瑞昌市| 尚志市| 商水县| 富锦市| 东明县| 安图县| 麦盖提县| 伊宁市| 陇南市| 宝兴县| 海安县| 汾阳市| 商洛市| 福建省| 沙湾县| 临海市| 伊吾县| 崇义县| 丁青县| 镇宁| 佛学| 衡阳县| 湖北省| 红安县| 禹州市| 上犹县|