日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

短信的收發及在android模擬器之間實踐(1)

系統 2001 0

轉自: http://hi.baidu.com/coolnote/blog/item/a62d26fc66cee1ebfc037f32.html ?看不到的圖請到原文看.

1、溫故知新

廣播接收者 :一個廣播接收者是這樣一個組件,它不做什么事,僅是接受廣播公告并作出相應的反應。許多廣播源自于系統代碼,例如公告時區的改變、電池電量低、已采取圖片、用戶改變了語言偏好。應用程序也可以發起廣播,例如為了他其他程序知道某些數據已經下載到設備且他們可以使用這些數據

BroadcastReceiver 類:是接受 sendBroadcast() 發送的意圖(intents)的基類??梢杂? Context.registerReceiver() 動態地注冊這個類的實例,或者通過 AndroidManifest.xml 中<receiver>標簽靜態發布。

廣播接收者不顯示一個用戶界面。然而,它們啟動一個活動去響應收到的信息,或者他們可能使用 NotificationManager 去通知用戶。通知可以使用多種方式獲得用戶的注意——閃爍的背光、振動設備、播放聲音等等。典型的是放在一個持久的圖標在狀態欄,用戶可以打開獲取信息。

2、準備工作:SMS涉及的主要類SmsManager

實現SMS主要用到 SmsManager 類,該類繼承自 java.lang.Object 類,下面我們介紹一下該類的主要成員。

公有方法:

  • ArrayList < String > ? divideMessage (String text)?
    當短信超過SMS消息的最大長度時,將短信分割為幾塊。?
    參數 text ——初始的消息,不能為空?
    返回值 :有序的 ArrayList < String > ,可以重新組合為初始的消息
  • static ? SmsManager ? getDefault ()?
    獲取SmsManager的默認實例。?
    返回值 SmsManager 的默認實例
  • void ? SendDataMessage ( String ?destinationAddress , ? String ?scAddress , ? short ?destinationPort , ? byte[] ?data , ? 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 ?sendMultipartTextMessage ( String ?destinationAddress , ? String ?scAddress , ?ArrayList < String > ? parts , ?ArrayList < PendingIntent > ?sentIntents, ArrayList < PendingIntent > ? ? deliverIntents)?
    發送一個基于SMS的多部分文本,調用者應用已經通過調用 divideMessage (String text)將消息分割成正確的大小。?
    參數 :?
    1)、 destinationAddress ——消息的目標地址?
    2)、 scAddress ——服務中心的地址or為空使用當前默認的SMSC?
    3)、 parts ——有序的 ArrayList < String > ,可以重新組合為初始的消息?
    4)、 sentIntents ——跟 SendDataMessage 方法中一樣,只不過這里的是一組PendingIntent?
    5)、 deliverIntents ——跟 SendDataMessage 方法中一樣,只不過這里的是一組PendingIntent?
    異常 :如果 destinationAddress data 是空時,拋出IllegalArgumentException異常。
  • void ?sendTextMessage ( String ?destinationAddress,? String ?scAddress,? String ?text,? PendingIntent ?sentIntent,? PendingIntent ?deliveryIntent)?
    發送一個基于SMS的文本。參數的意義和異常前面的已存在的一樣,不再累述。

常量:

  • public static final int? RESULT_ERROR_GENERIC_FAILURE?
    表示普通錯誤,值為1(0x00000001)
  • public static final int? RESULT_ERROR_NO_SERVICE ?
    表示服務當前不可用,值為4 (0x00000004)
  • public static final int? RESULT_ERROR_NULL_PDU ?
    表示沒有提供pdu,值為3 (0x00000003)
  • public static final int? RESULT_ERROR_RADIO_OFF ?
    表示無線廣播被明確地關閉,值為2 (0x00000002)
  • public static final int? STATUS_ON_ICC_FREE ?
    表示自由空間,值為0 (0x00000000)
  • public static final int? STATUS_ON_ICC_READ ?
    表示接收且已讀,值為1 (0x00000001)
  • public static final int? STATUS_ON_ICC_SENT ?
    表示存儲且已發送,值為5 (0x00000005)
  • public static final int? STATUS_ON_ICC_UNREAD ?
    表示接收但未讀,值為3 (0x00000003)
  • public static final int? STATUS_ON_ICC_UNSENT ?
    表示存儲但為發送,值為7 (0x00000007)

3、簡單的SMS發送程序

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

image

圖1、程序運行界面

?

對應的xml代碼如下:

      
        <?
      
      xml version="1.0" encoding="utf-8"
      
        ?>
      
      
        <
      
      
        LinearLayout
      
      
        xmlns
      
      :
      
        android
      
      =
      
        "http://schemas.android.com/apk/res/android"
      
      
        android
      
      :
      
        orientation
      
      =
      
        "vertical"
      
      
        android
      
      :
      
        layout_width
      
      =
      
        "fill_parent"
      
      
        android
      
      :
      
        layout_height
      
      =
      
        "fill_parent"
      
      
        >
      
      
        <
      
      
        TextView
      
      
        android
      
      :
      
        layout_width
      
      =
      
        "fill_parent"
      
      
        android
      
      :
      
        layout_height
      
      =
      
        "wrap_content"
      
      
        
          android
        
        :
        
          text
        
        =
        
          "@string/txtPhoneNo"
        
        
          />
        
      
    
      
        
           <!-- text's value define in res/values/strings.xml -->
        
      
      
        <
      
      
        EditText
      
      
        android
      
      :
      
        layout_width
      
      =
      
        "fill_parent"
      
      
        android
      
      :
      
        layout_height
      
      =
      
        "wrap_content"
      
      
        android
      
      :
      
        id
      
      =
      
        "@+id/edtPhoneNo"
      
      
        />
      
      
        
        
        <
      
      
        TextView
      
      
        android
      
      :
      
        layout_width
      
      =
      
        "fill_parent"
      
      
        android
      
      :
      
        layout_height
      
      =
      
        "wrap_content"
      
      
        android
      
      :
      
        text
      
      =
      
        "@string/txtContent"
      
      
        />
      
      
        <
      
      
        EditText
      
      
        android
      
      :
      
        layout_width
      
      =
      
        "fill_parent"
      
      
        android
      
      :
      
        layout_height
      
      =
      
        "wrap_content"
      
      
        android
      
      :
      
        minLines
      
      =
      
        "3"
      
      
        android
      
      :
      
        id
      
      =
      
        "@+id/edtContent"
      
      
        />
      
      
        <
      
      
        Button
      
      
        android
      
      :
      
        layout_width
      
      =
      
        "wrap_content"
      
      
        android
      
      :
      
        layout_height
      
      =
      
        "wrap_content"
      
      
        
          android
        
        :
        
          text
        
        =
        
          "@string/btnText"
        
      
      
        android
      
      :
      
        id
      
      =
      
        "@+id/btnSend"
      
      
        />
      
      
        </
      
      
        LinearLayout
      
      
        >
      
    

?

?

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

      
        <?
      
      xml version="1.0" encoding="utf-8"
      
        ?>
      
      
        <
      
      
        resources
      
      
        >
      
      
        <
      
      
        string
      
      
        name
      
      =
      
        "txtPhoneNo"
      
      
        >
      
      Please input phone NO:
      
        </
      
      
        string
      
      
        >
      
      
        <
      
      
        string
      
      
        name
      
      =
      
        "txtContent"
      
      
        >
      
      Please input SMS\'s content:
      
        </
      
      
        string
      
      
        >
      
      
        <
      
      
        string
      
      
        name
      
      =
      
        "btnText"
      
      
        >
      
      send!
      
        </
      
      
        string
      
      
        >
      
      
        <
      
      
        string
      
      
        name
      
      =
      
        "app_name"
      
      
        >
      
      SMS
      
        </
      
      
        string
      
      
        >
      
      
        </
      
      
        resources
      
      
        >
      
    

?

?

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

通過第一步我們構建好界面之后,現在要在上面的基礎上編寫業務邏輯了。大致過程為:在java源文件中,獲取用戶在edtPhoneNo中輸入的電話號碼,edtContent中輸入要發送的內容;然后點擊btnSend按鈕發送短信,要達到這個目的我們要設置btnSend的OnClickListener以達到當點擊它觸發發送短信的功能,而且要發送短信就要用到我們前面介紹的 SmsManager 類提供的方法接口。

設置btnSend的OnClickListener的代碼如下:

      btnSend.setOnClickListener(
      
        new
      
       View.OnClickListener() {
 
      
        public
      
      
        void
      
       onClick(View v) {
  String phoneNo = edtPhoneNo.getText().toString();
  String message = edtContent.getText().toString();
  
      
        if
      
       (phoneNo.length() > 0 && message.length() > 0){
   
      
        //call sendSMS to send message to phoneNo
      
      
   sendSMS(phoneNo, message);
  }
  
      
        else
      
      
   Toast.makeText(getBaseContext(),
    "
      
        Please enter both phone number and message.
      
      ",
    Toast.LENGTH_SHORT).show();
 }
});
    

?

?

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

      
        private
      
      
        void
      
       sendSMS(String phoneNumber, String message) {
 
      
        // ---sends an SMS message to another device---
      
      
 SmsManager sms = SmsManager.getDefault();
 PendingIntent pi = PendingIntent.getActivity(
      
        this
      
      , 0, 
    
      
        new
      
       Intent(
      
        this
      
      ,TextMessage.
      
        class
      
      ), 0);
 
      
        //if message's length more than 70 ,
      
      
        //then call divideMessage to dive message into several part 
      
    
      
                //and call sendTextMessage()
      
      
        //else direct call sendTextMessage()
      
      
        if
      
       (message.length() > 70) {
  ArrayList<String> msgs = sms.divideMessage(message);
  
      
        for
      
       (String msg : msgs) {
   sms.sendTextMessage(phoneNumber, 
      
        null
      
      , msg, pi, 
      
        null
      
      );
  }
 } 
      
        else
      
       {
  sms.sendTextMessage(phoneNumber, 
      
        null
      
      , message, pi, 
      
        null
      
      );
 }
 Toast.makeText(TextMessage.
      
        this
      
      , "
      
        短信發送完成
      
      ", Toast.LENGTH_LONG).show();
}
    

?

?

如果你已經看了第2節介紹的 SmsManager 類的介紹,代碼應該很好理解。在這里要說明的是,sendTextMessage方法中的第4個和第5個參數PendingIntent設為null,這樣的話不能根據短信發出之后的狀態做相應的事情,如短信發送失敗后的提醒、接收者成功接收后的回執……完整的流程源碼如下:

      
      
        
          package
        
         skynet.com.cnblogs.www;


        
          import
        
         java.util.ArrayList;


        
          import
        
         android.app.Activity;

        
          import
        
         android.app.PendingIntent;

        
          import
        
         android.content.Intent;

        
          import
        
         android.os.Bundle;

        
          import
        
         android.telephony.SmsManager;

        
          import
        
         android.view.View;

        
          import
        
         android.widget.*;


        
          public
        
        
          class
        
         TextMessage 
        
          extends
        
         Activity {
 
        
          /** Called when the activity is first created. */
        
        
 @Override
 
        
          public
        
        
          void
        
         onCreate(Bundle savedInstanceState) {
  
        
          super
        
        .onCreate(savedInstanceState);

  setContentView(R.layout.main);
  btnSend = (Button) findViewById(R.id.btnSend);
  edtPhoneNo = (EditText) findViewById(R.id.edtPhoneNo);
  edtContent = (EditText) findViewById(R.id.edtContent);

  btnSend.setOnClickListener(
        
          new
        
         View.OnClickListener() {
   
        
          public
        
        
          void
        
         onClick(View v) {
    String phoneNo = edtPhoneNo.getText().toString();
    String message = edtContent.getText().toString();
    
        
          if
        
         (phoneNo.length() > 0 && message.length() > 0) {
     
        
          // call sendSMS to send message to phoneNo
        
        
     sendSMS(phoneNo, message);
    } 
        
          else
        
        
     Toast.makeText(getBaseContext(),
       "
        
          Please enter both phone number and message.
        
        ",
       Toast.LENGTH_SHORT).show();
   }
  });
 }

 
        
          private
        
         Button btnSend;
 
        
          private
        
         EditText edtPhoneNo;
 
        
          private
        
         EditText edtContent;

 
        
          private
        
        
          void
        
         sendSMS(String phoneNumber, String message) {
  
        
          // ---sends an SMS message to another device---
        
        
  SmsManager sms = SmsManager.getDefault();
  PendingIntent pi = PendingIntent.getActivity(
        
          this
        
        , 0, 
        
          new
        
         Intent(
        
          this
        
        ,
    TextMessage.
        
          class
        
        ), 0);
  
        
          // if message's length more than 70 ,
        
        
          // then call divideMessage to dive message into several part ,and call
        
        
          // sendTextMessage()
        
        
          // else direct call sendTextMessage()
        
        
          if
        
         (message.length() > 70) {
   ArrayList<String> msgs = sms.divideMessage(message);
   
        
          for
        
         (String msg : msgs) {
    sms.sendTextMessage(phoneNumber, 
        
          null
        
        , msg, pi, 
        
          null
        
        );
   }
  } 
        
          else
        
         {
   sms.sendTextMessage(phoneNumber, 
        
          null
        
        , message, pi, 
        
          null
        
        );
  }
  Toast.makeText(TextMessage.
        
          this
        
        , "
        
          短信發送完成
        
        ", Toast.LENGTH_LONG).show();
 }
}
      
    

?

?

3)運行前,還要在清單文件AndroidManifest.xml中加入允許發送短信的權限:

      
      
        <?xml version="
        
          1.0
        
        " encoding="
        
          utf-8
        
        "?>
<manifest xmlns:android="
        
          http://schemas.android.com/apk/res/android
        
        "
      
        
          package
        
        ="
        
          skynet.com.cnblogs.www
        
        "
      android:versionCode="
        
          1
        
        "
      android:versionName="
        
          1.0
        
        ">
    <application android:icon="
        
          @drawable/icon
        
        " android:label="
        
          @string/app_name
        
        ">
        <activity android:name="
        
          .TextMessage
        
        "
                  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>
 
        
          
            <uses-permission android:name="
            
              android.permission.SEND_SMS
            
            "/>
          
        
        
</manifest> 
      
    

短信的收發及在android模擬器之間實踐(1)


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。?!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 崇左市| 霍林郭勒市| 安图县| 多伦县| 南乐县| 河源市| 辉县市| 铜梁县| 太仆寺旗| 镇宁| 南郑县| 宝丰县| 木兰县| 嘉义市| 汤阴县| 水富县| 交城县| 莱西市| 陕西省| 龙江县| 六安市| 文昌市| 宁陕县| 镇康县| 蒙自县| 遵义市| 渝中区| 聂荣县| 汉寿县| 夏邑县| 海丰县| 祁门县| 六安市| 屏边| 太保市| 洛浦县| 宜宾县| 东明县| 新兴县| 包头市| 福建省|