android短信常用到的表结构如下:
Sms表:
_id:Integer
thread_id:Integer 同一会话中他们的值相同,也就是说通过thread_id来确定谁和谁在聊天
address:Text 发送人地址,即手机号
person:Integer 发件人,如果发件人在通信录,则显示姓名,陌生人为null
date:Integer 接收或发送的时间
date_send:Ingter 发送的时间
protocol:Integer 协议 0:SMS_RPOTO短信协议 1:MMS_PROTO彩信
read:Integer 0:未读 1:已读
status:Integer 短信状态 -1:接收 0:完成 64:正在发送 128:失败
type:Integer 1:接收 2:发出
reply_path_present:Integer
subject:Text 主题
body:Text 内容
service_center:Text 短信服务中心号码编号
locked:Integer
error_code:Integer
send:Integer
threads表:
_id:Integer
date:Integer 接收或发送的时间
message_count:Integer 信息数量
recipient_ids:Text 联系人ID 指向canonical_address表
snippet:Text 最后接收或发送的内容
snippet_cs:Integer 编码
read:Integer 0:未读 1:已读
type:Integer 1:接收 2:发出
error:Integer
has_attachment:Integer 是否有附件
canonical_address表:
_id:Integer
address:Text发送或接收到的电话号码
raw表:
_id:Integer
date:Integer
reference_number:Integer
count:Integer
sequence:Integer
destination_port:Integer
address:Text
pdu:Text
addr表:彩信地址
_id:
msg_id:Integer
contact_id:
address:Text
type:Integer
charset:Integer
发送短息实现如下:
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
registerReceiver(sentMessage, new IntentFilter("SENT_SMS_ACTION"));
registerReceiver(deliveryMessage, new IntentFilter("DELIVER_SMS_ACTION"));
}
private void sendSms(String number,String body){
SmsManager smsManager=SmsManager.getDefault();
Intent sentIntent=new Intent("SENT_SMS_ACTION");
PendingIntent sentPI=PendingIntent.getBroadcast(this, 0, sentIntent, 0);
Intent deliverIntent=new Intent("DELIVER_SMS_ACTION");
PendingIntent deliverPI=PendingIntent.getBroadcast(this, 1, deliverIntent, 0);
//大于70个字符需要拆分成多条短信
if(body.length()>70){
ArrayList<String> msgs=smsManager.divideMessage(body);
for(String msg:msgs){
//is the service center address
smsManager.sendTextMessage(number, null, msg, sentPI, deliverPI);
}
}else{
smsManager.sendTextMessage(number, null, body, sentPI, deliverPI);
}
//插入到数据库中
ContentValues values=new ContentValues();
values.put("date", System.currentTimeMillis());
values.put("read", 1);
values.put("type", 2);
values.put("address", number);
values.put("body", body);
getContentResolver().insert(Uri.parse("content://sms"), values);
}
private BroadcastReceiver sentMessage=new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
//是否发送成功
switch(getResultCode()){
case 0:
break;
}
}
};
private BroadcastReceiver deliveryMessage=new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
//接收成功
}
};
代码中注册了两个广播:
SENT_SMS_ACTION:发送成功广播,即手机发送后,不管接收到是否接收到。
DELIVER_SMS_ACTION:接收成功广播,即接收端接收到短信。