今天我和同學(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ā)送是否成功。 而接受成功表示接受者是否將這條消息收到。 - 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ā)送成功的廣播 - // 注冊(cè)廣播 發(fā)送消息
registerReceiver(sendMessage, new IntentFilter(SENT_SMS_ACTION));
registerReceiver(receiver, new IntentFilter(DELIVERED_SMS_ACTION));
復(fù)制代碼 注冊(cè)后 在BroadcaseRecevice中可以接收到發(fā)送 接收相關(guān)的廣播 - 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è)小例子的完整代碼 - 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)限噢。 - <!--取得發(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ā)送的短信了。 - 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)限噢。 - <!-- 發(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 |