今天我和同學(xué)們討論一下Android平臺下如何調(diào)用系統(tǒng)方法發(fā)送短信、接收短信、系統(tǒng)的短信庫相關(guān)的問題。進入正題,我們先使用Eclipse工具模擬給自己的模擬器發(fā)送一條短信。在Eclipse下打開DDMS
Incoming number: 這里須要填寫的是發(fā)件人的手機號碼,這里只能輸入數(shù)字否則會無法發(fā)送。
Message: 這里為發(fā)送的內(nèi)容
send: 上面兩項都填寫完畢點擊發(fā)送鍵可以給模擬器發(fā)送短信。
點擊發(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 下圖藍框中就是模擬器的短信庫,我們將它打開看看里面存的是什么東東。
打開mmssms.db 在打開sms表 因為所有短信數(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é)點的意義。
我們在看看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 詳細介紹(十七) 這里就不詳細的說了。
下面進入本章代碼部分的正題,調(diào)用系統(tǒng)方法給聯(lián)系人號碼發(fā)送消息
/**
* 參數(shù)說明
* destinationAddress:收信人的手機號碼
* scAddress:發(fā)信人的手機號碼
* text:發(fā)送信息的內(nèi)容
* sentIntent:發(fā)送是否成功的回執(zhí),用于監(jiān)聽短信是否發(fā)送成功。
* DeliveryIntent:接收是否成功的回執(zhí),用于監(jiān)聽短信對方是否接收成功。
*/
這里我主要說一下最后兩個參數(shù), SentIntent 這個intent用于接收這條信息自己發(fā)送成功還是自己發(fā)送失敗, DeliveryIntent這個intent用于對方是否接受成功。 發(fā)送成功和接受成功是不一樣的,發(fā)送只是把消息發(fā)到手機移動或聯(liá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)容超過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ā)送成功的廣播 - // 注冊廣播 發(fā)送消息
registerReceiver(sendMessage, new IntentFilter(SENT_SMS_ACTION));
registerReceiver(receiver, new IntentFilter(DELIVERED_SMS_ACTION));
復(fù)制代碼 注冊后 在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) {
//表示對方成功收到短信
Toast.makeText(mContext, "對方接收成功",Toast.LENGTH_LONG).show();
}
};
復(fù)制代碼 下面給出這個小例子的完整代碼 - 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) {
/** 拿到輸入的手機號碼 **/
String number = mNumber.getText().toString();
/** 拿到輸入的短信內(nèi)容 **/
String text = mMessage.getText().toString();
/** 手機號碼 與輸入內(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:收信人的手機號碼
* scAddress:發(fā)信人的手機號碼
* 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)限噢。 - <!--取得發(fā)短信的權(quán)限 -->
<uses-permission android:name="android.permission.SEND_SMS" />
復(fù)制代碼 發(fā)送完消息后打開手機的發(fā)信箱發(fā)現(xiàn)沒有看到剛才發(fā)的消息,這是為什么呢? 是這樣的。調(diào)用sendTextMessage 確實是發(fā)送消息 ,但是系統(tǒng)的短信庫中沒有這條消息 所以就看不到了。如果想要在系統(tǒng)的短信庫中看到消息就必需把這條消息插到系統(tǒng)的短信庫。
下面這段代碼在發(fā)短信的同時也將短信內(nèi)容寫入系統(tǒng)庫,這樣在發(fā)件箱中就可以看到我們發(fā)送的短信了。 - button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
/** 拿到輸入的手機號碼 **/
String number = mNumber.getText().toString();
/** 拿到輸入的短信內(nèi)容 **/
String text = mMessage.getText().toString();
/** 手機號碼 與輸入內(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);
//送達號碼
values.put("address", number);
//送達內(nèi)容
values.put("body", text);
//插入短信庫
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"/>
<!-- 寫入消息-->
<uses-permission android:name="android.permission.WRITE_SMS" />
<!-- 接收消息 -->
<uses-permission android:name="android.permission.RECEIVE_SMS" />
復(fù)制代碼 規(guī)矩每篇文章都會附帶源代碼,最后如果你還是覺得我寫的不夠詳細 看的不夠爽 不要緊我把源代碼的下載地址貼出來 歡迎大家一起討論學(xué)習(xí)
第三十講 給聯(lián)系人發(fā)送短信.rar(124.34 KB, 下載次數(shù): 1342)[/I]2011-9-3 01:25 上傳點擊文件名 下載積分: 下載豆 -2 |