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

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

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

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

綜合交流 / 評測 / 活動區(qū)

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

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

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

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

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

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2013-8-28 16:27 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
今天我和同學(xué)們討論一下Android平臺下如何調(diào)用系統(tǒng)方法發(fā)送短信、接收短信、系統(tǒng)的短信庫相關(guān)的問題。進(jìn)入正題,我們先使用Eclipse工具模擬給自己的模擬器發(fā)送一條短信。在Eclipse下打開DDMS   
   
   
Incoming number: 這里須要填寫的是發(fā)件人的手機(jī)號碼,這里只能輸入數(shù)字否則會無法發(fā)送。   
Message: 這里為發(fā)送的內(nèi)容   
send: 上面兩項(xiàng)都填寫完畢點(diǎn)擊發(fā)送鍵可以給模擬器發(fā)送短信。   
   
     
   
點(diǎn)擊發(fā)送后,模擬器中就可以看到自己收到了一條消息 發(fā)件人的號碼為123456 發(fā)送內(nèi)容為hello。收到短信后會將這條信息寫入系統(tǒng)的短信庫,下面我們分析分析Android系統(tǒng)的短信庫的結(jié)構(gòu)。   
     
   
系統(tǒng)的短信庫存在data/data/com.android.providers.telephony/databases/mmssms.db 下圖藍(lán)框中就是模擬器的短信庫,我們將它打開看看里面存的是什么東東。   
     
打開mmssms.db  在打開sms表 因?yàn)樗卸绦艛?shù)據(jù)都儲存在這張表上,下面分析一下這張表的字段。   
_id 不用說了吧,標(biāo)示它的唯一性   
thread_id :這個字段很重要,同一個會話中他們的thread_id是一樣的,也就是說通過thread_id就可以知道A與B在聊天 還是 A與C在聊天   
date :這條消息發(fā)送或接收的時間   
read:  0 表示未讀 1表示已讀   
type : 1表示接收 2 表示發(fā)出   
body  表示 消息的內(nèi)容   
     
   
我給12345回一條消息我們會看的更清楚這些節(jié)點(diǎn)的意義。   
     
我們在看看thread_id指向的thread表   
上圖中可以清晰的看到 收到消息與回復(fù)消息的thread_id都為1 ,那么在thread_id這張表中   
   
_id 不用說了吧,標(biāo)示它的唯一性   
date:表示最后接收或者發(fā)送消息的時間   
message_count:表示發(fā)送消息的數(shù)量,這里我接收到了一條消息 也回復(fù)了一條消息那么它的數(shù)量就為2   
recipient_ids:聯(lián)系人ID,指向表 canonical_addresses 里的id。   
snippet :最后收到或者發(fā)送的消息內(nèi)容,就是上圖body中存的東西   
     
這么看來如果須要短信庫中的數(shù)據(jù)就去訪問數(shù)據(jù)庫中的這兩張表,sms表 uri 指向的是 "content://mms-sms/" thread表 uri指向的是 "content://mms-sms/threadID" 具體訪問的方法請看Android游戲開發(fā)之?dāng)?shù)據(jù)庫SQLite 詳細(xì)介紹(十七) 這里就不詳細(xì)的說了。   
   
下面進(jìn)入本章代碼部分的正題,調(diào)用系統(tǒng)方法給聯(lián)系人號碼發(fā)送消息   
   
    /**   
     * 參數(shù)說明   
     * destinationAddress:收信人的手機(jī)號碼   
     * scAddress:發(fā)信人的手機(jī)號碼   
     * text:發(fā)送信息的內(nèi)容   
     * sentIntent:發(fā)送是否成功的回執(zhí),用于監(jiān)聽短信是否發(fā)送成功。   
     * DeliveryIntent:接收是否成功的回執(zhí),用于監(jiān)聽短信對方是否接收成功。   
     */   
   
這里我主要說一下最后兩個參數(shù), SentIntent 這個intent用于接收這條信息自己發(fā)送成功還是自己發(fā)送失敗, DeliveryIntent這個intent用于對方是否接受成功。 發(fā)送成功和接受成功是不一樣的,發(fā)送只是把消息發(fā)到手機(jī)移動或聯(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)容超過70個字符 將這條短信拆成多條短信發(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ù)制代碼
注冊 接收成功 或者發(fā)送成功的廣播   
  1.         // 注冊廣播 發(fā)送消息   
            registerReceiver(sendMessage, new IntentFilter(SENT_SMS_ACTION));   
            registerReceiver(receiver, new IntentFilter(DELIVERED_SMS_ACTION));
復(fù)制代碼
注冊后 在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) {   
                //表示對方成功收到短信   
                Toast.makeText(mContext, "對方接收成功",Toast.LENGTH_LONG).show();   
            }   
        };
復(fù)制代碼
下面給出這個小例子的完整代碼   
  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ī)號碼 **/   
                    String number = mNumber.getText().toString();   
                    /** 拿到輸入的短信內(nèi)容 **/   
                    String text = mMessage.getText().toString();   
       
                    /** 手機(jī)號碼 與輸入內(nèi)容 必需不為空 **/   
                    if (!TextUtils.isEmpty(number) && !TextUtils.isEmpty(text)) {   
                        sendSMS(number, text);   
                    }   
                }   
            });   
       
               
            // 注冊廣播 發(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) {   
                //表示對方成功收到短信   
                Toast.makeText(mContext, "對方接收成功",Toast.LENGTH_LONG).show();   
            }   
        };   
          
            /**   
             * 參數(shù)說明   
             * destinationAddress:收信人的手機(jī)號碼   
             * scAddress:發(fā)信人的手機(jī)號碼   
             * text:發(fā)送信息的內(nèi)容   
             * sentIntent:發(fā)送是否成功的回執(zhí),用于監(jiān)聽短信是否發(fā)送成功。   
             * DeliveryIntent:接收是否成功的回執(zhí),用于監(jiān)聽短信對方是否接收成功。   
             */   
        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)容超過70個字符 將這條短信拆成多條短信發(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ā)送完消息后打開手機(jī)的發(fā)信箱發(fā)現(xiàn)沒有看到剛才發(fā)的消息,這是為什么呢? 是這樣的。調(diào)用sendTextMessage 確實(shí)是發(fā)送消息 ,但是系統(tǒng)的短信庫中沒有這條消息 所以就看不到了。如果想要在系統(tǒng)的短信庫中看到消息就必需把這條消息插到系統(tǒng)的短信庫。   
   
   
下面這段代碼在發(fā)短信的同時也將短信內(nèi)容寫入系統(tǒng)庫,這樣在發(fā)件箱中就可以看到我們發(fā)送的短信了。   
  1.         button.setOnClickListener(new OnClickListener() {   
       
                @Override   
                public void onClick(View view) {   
       
                    /** 拿到輸入的手機(jī)號碼 **/   
                    String number = mNumber.getText().toString();   
                    /** 拿到輸入的短信內(nèi)容 **/   
                    String text = mMessage.getText().toString();   
       
                    /** 手機(jī)號碼 與輸入內(nèi)容 必需不為空 **/   
                    if (!TextUtils.isEmpty(number) && !TextUtils.isEmpty(text)) {   
                        sendSMS(number, text);   
                      
                        /**將發(fā)送的短信插入數(shù)據(jù)庫**/   
                        ContentValues values = new ContentValues();   
                        //發(fā)送時間   
                        values.put("date", System.currentTimeMillis());   
                        //閱讀狀態(tài)   
                        values.put("read", 0);   
                        //1為收 2為發(fā)   
                        values.put("type", 2);   
                        //送達(dá)號碼   
                        values.put("address", number);   
                        //送達(dá)內(nèi)容   
                        values.put("body", text);   
                        //插入短信庫   
                        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"/>   
            <!--  寫入消息-->   
            <uses-permission android:name="android.permission.WRITE_SMS" />   
            <!-- 接收消息 -->   
            <uses-permission android:name="android.permission.RECEIVE_SMS" />
復(fù)制代碼
規(guī)矩每篇文章都會附帶源代碼,最后如果你還是覺得我寫的不夠詳細(xì) 看的不夠爽 不要緊我把源代碼的下載地址貼出來 歡迎大家一起討論學(xué)習(xí)   
第三十講 給聯(lián)系人發(fā)送短信.rar(124.34 KB, 下載次數(shù): 1342)[/I]2011-9-3 01:25 上傳點(diǎn)擊文件名   下載積分: 下載豆 -2

上一篇:android TextView 垂直自動滾動
下一篇:listview學(xué)習(xí)
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

GMT+8, 2024-10-20 20:47 , Processed in 0.070401 second(s), 13 queries , Redis On.

Powered by Discuz!

監(jiān)督舉報:report#znds.com (請將#替換為@)

© 2007-2024 ZNDS.Com

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