首頁(yè) 收藏 QQ群
 網(wǎng)站導(dǎo)航

ZNDS智能電視網(wǎng) 推薦當(dāng)貝市場(chǎng)

TV應(yīng)用下載 / 資源分享區(qū)

軟件下載 | 游戲 | 討論 | 電視計(jì)算器

綜合交流 / 評(píng)測(cè) / 活動(dòng)區(qū)

交流區(qū) | 測(cè)硬件 | 網(wǎng)站活動(dòng) | Z幣中心

新手入門 / 進(jìn)階 / 社區(qū)互助

新手 | 你問(wèn)我答 | 免費(fèi)刷機(jī)救磚 | ROM固件

查看: 11410|回復(fù): 0
上一主題 下一主題
[教程]

Android軟件開(kāi)發(fā)之發(fā)送短信與系統(tǒng)短信庫(kù)解析(三十)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2013-8-28 16:27 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
今天我和同學(xué)們討論一下Android平臺(tái)下如何調(diào)用系統(tǒng)方法發(fā)送短信、接收短信、系統(tǒng)的短信庫(kù)相關(guān)的問(wèn)題。進(jìn)入正題,我們先使用Eclipse工具模擬給自己的模擬器發(fā)送一條短信。在Eclipse下打開(kāi)DDMS   
   
   
Incoming number: 這里須要填寫(xiě)的是發(fā)件人的手機(jī)號(hào)碼,這里只能輸入數(shù)字否則會(huì)無(wú)法發(fā)送。   
Message: 這里為發(fā)送的內(nèi)容   
send: 上面兩項(xiàng)都填寫(xiě)完畢點(diǎn)擊發(fā)送鍵可以給模擬器發(fā)送短信。   
   
     
   
點(diǎn)擊發(fā)送后,模擬器中就可以看到自己收到了一條消息 發(fā)件人的號(hào)碼為123456 發(fā)送內(nèi)容為hello。收到短信后會(huì)將這條信息寫(xiě)入系統(tǒng)的短信庫(kù),下面我們分析分析Android系統(tǒng)的短信庫(kù)的結(jié)構(gòu)。   
     
   
系統(tǒng)的短信庫(kù)存在data/data/com.android.providers.telephony/databases/mmssms.db 下圖藍(lán)框中就是模擬器的短信庫(kù),我們將它打開(kāi)看看里面存的是什么東東。   
     
打開(kāi)mmssms.db  在打開(kāi)sms表 因?yàn)樗卸绦艛?shù)據(jù)都儲(chǔ)存在這張表上,下面分析一下這張表的字段。   
_id 不用說(shuō)了吧,標(biāo)示它的唯一性   
thread_id :這個(gè)字段很重要,同一個(gè)會(huì)話中他們的thread_id是一樣的,也就是說(shuō)通過(guò)thread_id就可以知道A與B在聊天 還是 A與C在聊天   
date :這條消息發(fā)送或接收的時(shí)間   
read:  0 表示未讀 1表示已讀   
type : 1表示接收 2 表示發(fā)出   
body  表示 消息的內(nèi)容   
     
   
我給12345回一條消息我們會(huì)看的更清楚這些節(jié)點(diǎn)的意義。   
     
我們?cè)诳纯磘hread_id指向的thread表   
上圖中可以清晰的看到 收到消息與回復(fù)消息的thread_id都為1 ,那么在thread_id這張表中   
   
_id 不用說(shuō)了吧,標(biāo)示它的唯一性   
date:表示最后接收或者發(fā)送消息的時(shí)間   
message_count:表示發(fā)送消息的數(shù)量,這里我接收到了一條消息 也回復(fù)了一條消息那么它的數(shù)量就為2   
recipient_ids:聯(lián)系人ID,指向表 canonical_addresses 里的id。   
snippet :最后收到或者發(fā)送的消息內(nèi)容,就是上圖body中存的東西   
     
這么看來(lái)如果須要短信庫(kù)中的數(shù)據(jù)就去訪問(wèn)數(shù)據(jù)庫(kù)中的這兩張表,sms表 uri 指向的是 "content://mms-sms/" thread表 uri指向的是 "content://mms-sms/threadID" 具體訪問(wèn)的方法請(qǐng)看Android游戲開(kāi)發(fā)之?dāng)?shù)據(jù)庫(kù)SQLite 詳細(xì)介紹(十七) 這里就不詳細(xì)的說(shuō)了。   
   
下面進(jìn)入本章代碼部分的正題,調(diào)用系統(tǒng)方法給聯(lián)系人號(hào)碼發(fā)送消息   
   
    /**   
     * 參數(shù)說(shuō)明   
     * destinationAddress:收信人的手機(jī)號(hào)碼   
     * scAddress:發(fā)信人的手機(jī)號(hào)碼   
     * text:發(fā)送信息的內(nèi)容   
     * sentIntent:發(fā)送是否成功的回執(zhí),用于監(jiān)聽(tīng)短信是否發(fā)送成功。   
     * DeliveryIntent:接收是否成功的回執(zhí),用于監(jiān)聽(tīng)短信對(duì)方是否接收成功。   
     */   
   
這里我主要說(shuō)一下最后兩個(gè)參數(shù), SentIntent 這個(gè)intent用于接收這條信息自己發(fā)送成功還是自己發(fā)送失敗, DeliveryIntent這個(gè)intent用于對(duì)方是否接受成功。 發(fā)送成功和接受成功是不一樣的,發(fā)送只是把消息發(fā)到手機(jī)移動(dòng)或聯(lián)通運(yùn)行商那里叫發(fā)送成功,至于以后怎么處理它不關(guān)心,只管發(fā)送是否成功。 而接受成功表示接受者是否將這條消息收到。   
  1.     private void sendSMS(String phoneNumber, String message) {   
            // ---sends an SMS message to another device---   
            SmsManager sms = SmsManager.getDefault();   
       
            // create the sentIntent parameter   
            Intent sentIntent = new Intent(SENT_SMS_ACTION);   
            PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, sentIntent,   
                    0);   
       
            // create the deilverIntent parameter   
            Intent deliverIntent = new Intent(DELIVERED_SMS_ACTION);   
            PendingIntent deliverPI = PendingIntent.getBroadcast(this, 0,   
                    deliverIntent, 0);   
       
            //如果短信內(nèi)容超過(guò)70個(gè)字符 將這條短信拆成多條短信發(fā)送出去   
            if (message.length() > 70) {   
                ArrayList<String> msgs = sms.divideMessage(message);   
                for (String msg : msgs) {   
                    sms.sendTextMessage(phoneNumber, null, msg, sentPI, deliverPI);   
                }   
            } else {   
                sms.sendTextMessage(phoneNumber, null, message, sentPI, deliverPI);   
            }   
        }
復(fù)制代碼
注冊(cè) 接收成功 或者發(fā)送成功的廣播   
  1.         // 注冊(cè)廣播 發(fā)送消息   
            registerReceiver(sendMessage, new IntentFilter(SENT_SMS_ACTION));   
            registerReceiver(receiver, new IntentFilter(DELIVERED_SMS_ACTION));
復(fù)制代碼
注冊(cè)后 在BroadcaseRecevice中可以接收到發(fā)送 接收相關(guān)的廣播   
  1.     private BroadcastReceiver sendMessage = new BroadcastReceiver() {   
       
            @Override   
            public void onReceive(Context context, Intent intent) {   
                //判斷短信是否發(fā)送成功   
                switch (getResultCode()) {   
                case Activity.RESULT_OK:   
                    Toast.makeText(context, "短信發(fā)送成功", Toast.LENGTH_SHORT).show();   
                    break;   
                default:   
                    Toast.makeText(mContext, "發(fā)送失敗", Toast.LENGTH_LONG).show();   
                    break;   
                }   
            }   
        };   
          
          
        private BroadcastReceiver receiver = new BroadcastReceiver() {   
       
            @Override   
            public void onReceive(Context context, Intent intent) {   
                //表示對(duì)方成功收到短信   
                Toast.makeText(mContext, "對(duì)方接收成功",Toast.LENGTH_LONG).show();   
            }   
        };
復(fù)制代碼
下面給出這個(gè)小例子的完整代碼   
  1. import java.util.ArrayList;   
       
    import android.app.Activity;   
    import android.app.PendingIntent;   
    import android.content.BroadcastReceiver;   
    import android.content.Context;   
    import android.content.Intent;   
    import android.content.IntentFilter;   
    import android.os.Bundle;   
    import android.telephony.SmsManager;   
    import android.text.TextUtils;   
    import android.view.View;   
    import android.view.View.OnClickListener;   
    import android.widget.Button;   
    import android.widget.EditText;   
    import android.widget.Toast;   
       
    public class ContactsActivity extends Activity {   
       
       
        /**發(fā)送按鈕**/   
        Button button = null;   
          
        /**收件人電話**/   
        EditText mNumber = null;   
          
        /**編輯信息**/   
        EditText mMessage = null;   
          
        /**發(fā)送與接收的廣播**/   
        String SENT_SMS_ACTION = "SENT_SMS_ACTION";   
        String DELIVERED_SMS_ACTION = "DELIVERED_SMS_ACTION";   
       
          
          
        Context mContext = null;   
        @Override   
        public void onCreate(Bundle savedInstanceState) {   
            super.onCreate(savedInstanceState);   
            setContentView(R.layout.message);   
       
            button = (Button) findViewById(R.id.button);   
            mNumber = (EditText) findViewById(R.id.number);   
            mMessage = (EditText) findViewById(R.id.message);   
       
            mContext = this;   
            button.setOnClickListener(new OnClickListener() {   
       
                @Override   
                public void onClick(View view) {   
       
                    /** 拿到輸入的手機(jī)號(hào)碼 **/   
                    String number = mNumber.getText().toString();   
                    /** 拿到輸入的短信內(nèi)容 **/   
                    String text = mMessage.getText().toString();   
       
                    /** 手機(jī)號(hào)碼 與輸入內(nèi)容 必需不為空 **/   
                    if (!TextUtils.isEmpty(number) && !TextUtils.isEmpty(text)) {   
                        sendSMS(number, text);   
                    }   
                }   
            });   
       
               
            // 注冊(cè)廣播 發(fā)送消息   
            registerReceiver(sendMessage, new IntentFilter(SENT_SMS_ACTION));   
            registerReceiver(receiver, new IntentFilter(DELIVERED_SMS_ACTION));   
       
        }   
          
        private BroadcastReceiver sendMessage = new BroadcastReceiver() {   
       
            @Override   
            public void onReceive(Context context, Intent intent) {   
                //判斷短信是否發(fā)送成功   
                switch (getResultCode()) {   
                case Activity.RESULT_OK:   
                    Toast.makeText(context, "短信發(fā)送成功", Toast.LENGTH_SHORT).show();   
                    break;   
                default:   
                    Toast.makeText(mContext, "發(fā)送失敗", Toast.LENGTH_LONG).show();   
                    break;   
                }   
            }   
        };   
          
          
        private BroadcastReceiver receiver = new BroadcastReceiver() {   
       
            @Override   
            public void onReceive(Context context, Intent intent) {   
                //表示對(duì)方成功收到短信   
                Toast.makeText(mContext, "對(duì)方接收成功",Toast.LENGTH_LONG).show();   
            }   
        };   
          
            /**   
             * 參數(shù)說(shuō)明   
             * destinationAddress:收信人的手機(jī)號(hào)碼   
             * scAddress:發(fā)信人的手機(jī)號(hào)碼   
             * text:發(fā)送信息的內(nèi)容   
             * sentIntent:發(fā)送是否成功的回執(zhí),用于監(jiān)聽(tīng)短信是否發(fā)送成功。   
             * DeliveryIntent:接收是否成功的回執(zhí),用于監(jiān)聽(tīng)短信對(duì)方是否接收成功。   
             */   
        private void sendSMS(String phoneNumber, String message) {   
            // ---sends an SMS message to another device---   
            SmsManager sms = SmsManager.getDefault();   
       
            // create the sentIntent parameter   
            Intent sentIntent = new Intent(SENT_SMS_ACTION);   
            PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, sentIntent,   
                    0);   
       
            // create the deilverIntent parameter   
            Intent deliverIntent = new Intent(DELIVERED_SMS_ACTION);   
            PendingIntent deliverPI = PendingIntent.getBroadcast(this, 0,   
                    deliverIntent, 0);   
       
            //如果短信內(nèi)容超過(guò)70個(gè)字符 將這條短信拆成多條短信發(fā)送出去   
            if (message.length() > 70) {   
                ArrayList<String> msgs = sms.divideMessage(message);   
                for (String msg : msgs) {   
                    sms.sendTextMessage(phoneNumber, null, msg, sentPI, deliverPI);   
                }   
            } else {   
                sms.sendTextMessage(phoneNumber, null, message, sentPI, deliverPI);   
            }   
        }   
       
    }
復(fù)制代碼
一定要在AndroidManifest.xml中添加發(fā)送短信的權(quán)限噢。   
  1.     <!--取得發(fā)短信的權(quán)限 -->   
        <uses-permission android:name="android.permission.SEND_SMS" />
復(fù)制代碼
發(fā)送完消息后打開(kāi)手機(jī)的發(fā)信箱發(fā)現(xiàn)沒(méi)有看到剛才發(fā)的消息,這是為什么呢? 是這樣的。調(diào)用sendTextMessage 確實(shí)是發(fā)送消息 ,但是系統(tǒng)的短信庫(kù)中沒(méi)有這條消息 所以就看不到了。如果想要在系統(tǒng)的短信庫(kù)中看到消息就必需把這條消息插到系統(tǒng)的短信庫(kù)。   
   
   
下面這段代碼在發(fā)短信的同時(shí)也將短信內(nèi)容寫(xiě)入系統(tǒng)庫(kù),這樣在發(fā)件箱中就可以看到我們發(fā)送的短信了。   
  1.         button.setOnClickListener(new OnClickListener() {   
       
                @Override   
                public void onClick(View view) {   
       
                    /** 拿到輸入的手機(jī)號(hào)碼 **/   
                    String number = mNumber.getText().toString();   
                    /** 拿到輸入的短信內(nèi)容 **/   
                    String text = mMessage.getText().toString();   
       
                    /** 手機(jī)號(hào)碼 與輸入內(nèi)容 必需不為空 **/   
                    if (!TextUtils.isEmpty(number) && !TextUtils.isEmpty(text)) {   
                        sendSMS(number, text);   
                      
                        /**將發(fā)送的短信插入數(shù)據(jù)庫(kù)**/   
                        ContentValues values = new ContentValues();   
                        //發(fā)送時(shí)間   
                        values.put("date", System.currentTimeMillis());   
                        //閱讀狀態(tài)   
                        values.put("read", 0);   
                        //1為收 2為發(fā)   
                        values.put("type", 2);   
                        //送達(dá)號(hào)碼   
                        values.put("address", number);   
                        //送達(dá)內(nèi)容   
                        values.put("body", text);   
                        //插入短信庫(kù)   
                        getContentResolver().insert(Uri.parse("content://sms"),values);   
       
                    }   
                }   
            });
復(fù)制代碼
還是一定要在AndroidManifest.xml中添加相關(guān)的權(quán)限噢。   
  1.     <!--  發(fā)送消息-->   
            <uses-permission android:name="android.permission.SEND_SMS"/>   
            <!--  閱讀消息-->   
            <uses-permission android:name="android.permission.READ_SMS"/>   
            <!--  寫(xiě)入消息-->   
            <uses-permission android:name="android.permission.WRITE_SMS" />   
            <!-- 接收消息 -->   
            <uses-permission android:name="android.permission.RECEIVE_SMS" />
復(fù)制代碼
規(guī)矩每篇文章都會(huì)附帶源代碼,最后如果你還是覺(jué)得我寫(xiě)的不夠詳細(xì) 看的不夠爽 不要緊我把源代碼的下載地址貼出來(lái) 歡迎大家一起討論學(xué)習(xí)   
第三十講 給聯(lián)系人發(fā)送短信.rar(124.34 KB, 下載次數(shù): 1342)[/I]2011-9-3 01:25 上傳點(diǎn)擊文件名   下載積分: 下載豆 -2

上一篇:android TextView 垂直自動(dòng)滾動(dòng)
下一篇:listview學(xué)習(xí)

本版積分規(guī)則

Archiver|新帖|標(biāo)簽|軟件|Sitemap|ZNDS智能電視網(wǎng) ( 蘇ICP備2023012627號(hào) )

網(wǎng)絡(luò)信息服務(wù)信用承諾書(shū) | 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證:蘇B2-20221768 丨 蘇公網(wǎng)安備 32011402011373號(hào)

GMT+8, 2024-12-28 00:58 , Processed in 0.064219 second(s), 13 queries , Redis On.

Powered by Discuz!

監(jiān)督舉報(bào):report#znds.com (請(qǐng)將#替換為@)

© 2007-2024 ZNDS.Com

快速回復(fù) 返回頂部 返回列表