Android软件开发13-结束Android软件开发之发送短信与系统短信库解析(十三)今天我和同学们讨论一下Android平台下如何调用系统方法发送短信、接收短信、系统的短信库相关的问题。进入正题,我们先使用Eclipse工具模拟给自己的模拟器发送一条短信。在Eclipse下打开DDMSIncomingnumber:这里须要填写的是发件人的手机号码,这里只能输入数字否则会无法发送。Message:这里为发送的内容send:上面两项都填写完毕点击发送键可以给模拟器发送短信。点击发送后,模拟器中就可以看到自己收到了一条消息发件人的号码为123456发送内容为hello。收到短信后会将这条信息写入系统的短信库,下面我们分析分析Android系统的短信库的结构。系统的短信库存在data/data/com.android.providers.telephony/databases/mmssms.db下图蓝框中就是模拟器的短信库,我们将它打开看看里面存的是什么东东。打开mmssms.db在打开sms表因为所有短信数据都储存在这张表上,下面分析一下这张表的字段。_id不用说了吧,标示它的唯一性thread_id:这个字段很重要,同一个会话中他们的thread_id是一样的,也就是说通过thread_id就可以知道A与B在聊天还是A与C在聊天date:这条消息发送或接收的时间read:0表示未读1表示已读type:1表示接收2表示发出body表示消息的内容我给12345回一条消息我们会看的更清楚这些节点的意义。我们在看看thread_id指向的thread表上图中可以清晰的看到收到消息与回复消息的thread_id都为1,那么在thread_id这张表中_id不用说了吧,标示它的唯一性date:表示最后接收或者发送消息的时间message_count:表示发送消息的数量,这里我接收到了一条消息也回复了一条消息那么它的数量就为2recipient_ids:联系人ID,指向表canonical_addresses里的id。snippet:最后收到或者发送的消息内容,就是上图body中存的东西这么看来如果须要短信库中的数据就去访问数据库中的这两张表,sms表uri指向的是content://mms-sms/thread表uri指向的是content://mms-sms/threadID具体访问的方法请看Android游戏开发之数据库SQLite详细介绍(十七)这里就不详细的说了。下面进入本章代码部分的正题,调用系统方法给联系人号码发送消息/***参数说明*destinationAddress:收信人的手机号码*scAddress:发信人的手机号码*text:发送信息的内容*sentIntent:发送是否成功的回执,用于监听短信是否发送成功。*DeliveryIntent:接收是否成功的回执,用于监听短信对方是否接收成功。*/这里我主要说一下最后两个参数,SentIntent这个intent用于接收这条信息自己发送成功还是自己发送失败,DeliveryIntent这个intent用于对方是否接受成功。发送成功和接受成功是不一样的,发送只是把消息发到手机移动或联通运行商那里叫发送成功,至于以后怎么处理它不关心,只管发送是否成功。而接受成功表示接受者是否将这条消息收到。privatevoidsendSMS(StringphoneNumber,Stringmessage){//---sendsanSMSmessagetoanotherdevice---SmsManagersms=SmsManager.getDefault();//createthesentIntentparameterIntentsentIntent=newIntent(SENT_SMS_ACTION);PendingIntentsentPI=PendingIntent.getBroadcast(this,0,sentIntent,0);//createthedeilverIntentparameterIntentdeliverIntent=newIntent(DELIVERED_SMS_ACTION);PendingIntentdeliverPI=PendingIntent.getBroadcast(this,0,deliverIntent,0);//如果短信内容超过70个字符将这条短信拆成多条短信发送出去if(message.length()70){ArrayListStringmsgs=sms.divideMessage(message);for(Stringmsg:msgs){sms.sendTextMessage(phoneNumber,null,msg,sentPI,deliverPI);}}else{sms.sendTextMessage(phoneNumber,null,message,sentPI,deliverPI);}}注册接收成功或者发送成功的广播//注册广播发送消息registerReceiver(sendMessage,newIntentFilter(SENT_SMS_ACTION));registerReceiver(receiver,newIntentFilter(DELIVERED_SMS_ACTION));注册后在BroadcaseRecevice中可以接收到发送接收相关的广播privateBroadcastReceiversendMessage=newBroadcastReceiver(){@OverridepublicvoidonReceive(Contextcontext,Intentintent){//判断短信是否发送成功switch(getResultCode()){caseActivity.RESULT_OK:Toast.makeText(context,短信发送成功,Toast.LENGTH_SHORT).show();break;default:Toast.makeText(mContext,发送失败,Toast.LENGTH_LONG).show();break;}}};privateBroadcastReceiverreceiver=newBroadcastReceiver(){@OverridepublicvoidonReceive(Contextcontext,Intentintent){//表示对方成功收到短信Toast.makeText(mContext,对方接收成功,Toast.LENGTH_LONG).show();}};下面给出这个小例子的完整代码importjava.util.ArrayList;importandroid.app.Activity;importandroid.app.PendingIntent;importandroid.content.BroadcastReceiver;importandroid.content.Context;importandroid.content.Intent;importandroid.content.IntentFilter;importandroid.os.Bundle;importandroid.telephony.SmsManager;importandroid.text.TextUtils;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.Button;importandroid.widget.EditText;importandroid.widget.Toast;publicclassContactsActivityextendsActivity{/**发送按钮**/Buttonbutton=null;/**收件人电话**/EditTextmNumber=null;/**编辑信息**/EditTextmMessage=null;/**发送与接收的广播**/StringSENT_SMS_ACTION=SENT_SMS_ACTION;StringDELIVERED_SMS_ACTION=DELIVERED_SMS_ACTION;ContextmContext=null;@OverridepublicvoidonCreate(BundlesavedInstanceState){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(newOnClickListener(){@OverridepublicvoidonClick(Viewview){/**拿到输入的手机号码**/Stringnumber=mNumber.getText().toString();/**拿到输入的短信内容**/Stringtext=mMessage.getText().toString();/**手机号码与输入内容必需不为空**/if(!TextUtils.isEmpty(number)&&!TextUtils.isEmpty(text)){sendSMS(number,text);}}});//注册广播发送消息registerReceiver(sendMessage,newIntentFilter(SENT_SMS_ACTION));registerReceiver(receiver,newIntentFilter(DELIVERED_SMS_ACTION));}privateBroadcastReceiversendMessage=newBroadcastReceiver(){@OverridepublicvoidonReceive(Contextcontext,Intentintent){//判断短信是否发送成功switch(getResultCode()){caseActivity.RESULT_OK:Toast.makeText(context,短信发送成功,Toast.LENGTH_SHORT).show();break;default:Toast.makeText(mContext,发送失败,Toast.LENGTH_LONG).show();break;}}};privateBroadcastReceiverreceiver=newBroadcastReceiver(){@OverridepublicvoidonReceive(Contextcontext,Intentintent){//表示对方成功收到短信Toast.makeText(mContext,对方接收成功,Toast.LENGTH_LONG).show();}};/***参数说明*destinationAddress:收信人的手机号码*scAddress:发信人的手机号码*text:发送信息的内容*sentIntent:发送是否成功的回执,用于监听短信是否发送成功。*DeliveryIntent:接收是否成功的回执,用于监听短信对方是否接收成功。*/privatevoidsendSMS(StringphoneNumber,Stringmessage){//---sendsanSMSmessagetoanotherdevice---SmsManagersms=SmsManager.getDefault();//createthesentIntentpara