点击发送后,模拟器中就可以看到自己收到了一条消息 发件人的号码为123456 发送内容为hello。收到短信后会将这条信息写入系统的短信库,下面我们分析分析Android系统的短信库的结构。
系统的短信库存在data/data/com.android.providers.telephony/databases/mmssms.db 下图蓝框中就是模拟器的短信库,我们将它打开看看里面存的是什么东东。
我给12345回一条消息我们会看的更清楚这些节点的意义。
这么看来如果须要短信库中的数据就去访问数据库中的这两张表,sms表 uri 指向的是 "content://mms-sms/" thread表 uri指向的是"content://mms-sms/threadID" 具体访问的方法请看Android游戏开发之数据库SQLite 详细介绍(十七) 这里就不详细的说了。
下面进入本章代码部分的正题,调用系统方法给联系人号码发送消息
/**
* 参数说明
* destinationAddress:收信人的手机号码
* scAddress:发信人的手机号码
* text:发送信息的内容
* sentIntent:发送是否成功的回执,用于监听短信是否发送成功。
* DeliveryIntent:接收是否成功的回执,用于监听短信对方是否接收成功。
*/
这里我主要说一下最后两个参数, SentIntent 这个intent用于接收这条信息自己发送成功还是自己发送失败, DeliveryIntent这个intent用于对方是否接受成功。 发送成功和接受成功是不一样的,发送只是把消息发到手机移动或联通运行商那里叫发送成功,至于以后怎么处理它不关心,只管发送是否成功。 而接受成功表示接受者是否将这条消息收到。
- 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);
- //如果短信内容超过70个字符 将这条短信拆成多条短信发送出去
- 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);
- }
- }
注册 接收成功 或者发送成功的广播
- // 注册广播 发送消息
- registerReceiver(sendMessage, new IntentFilter(SENT_SMS_ACTION));
- registerReceiver(receiver, new IntentFilter(DELIVERED_SMS_ACTION));
注册后 在BroadcaseRecevice中可以接收到发送 接收相关的广播
- private BroadcastReceiver sendMessage = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- //判断短信是否发送成功
- switch (getResultCode()) {
- case Activity.RESULT_OK:
- Toast.makeText(context, "短信发送成功", Toast.LENGTH_SHORT).show();
- break;
- default:
- Toast.makeText(mContext, "发送失败", 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();
- }
- };
下面给出这个小例子的完整代码
- 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 {
-
-
- /**发送按钮**/
- Button button = null;
-
- /**收件人电话**/
- EditText mNumber = null;
-
- /**编辑信息**/
- EditText mMessage = null;
-
- /**发送与接收的广播**/
- 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();
- /** 拿到输入的短信内容 **/
- String text = mMessage.getText().toString();
-
- /** 手机号码 与输入内容 必需不为空 **/
- if (!TextUtils.isEmpty(number) && !TextUtils.isEmpty(text)) {
- sendSMS(number, text);
- }
- }
- });
-
-
- // 注册广播 发送消息
- 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) {
- //判断短信是否发送成功
- switch (getResultCode()) {
- case Activity.RESULT_OK:
- Toast.makeText(context, "短信发送成功", Toast.LENGTH_SHORT).show();
- break;
- default:
- Toast.makeText(mContext, "发送失败", 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();
- }
- };
-
- /**
- * 参数说明
- * destinationAddress:收信人的手机号码
- * scAddress:发信人的手机号码
- * text:发送信息的内容
- * sentIntent:发送是否成功的回执,用于监听短信是否发送成功。
- * DeliveryIntent:接收是否成功的回执,用于监听短信对方是否接收成功。
- */
- 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);
-
- //如果短信内容超过70个字符 将这条短信拆成多条短信发送出去
- 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);
- }
- }
-
- }
- <!--取得发短信的权限 -->
- <uses-permission android:name="android.permission.SEND_SMS" />
- button.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View view) {
- /** 拿到输入的手机号码 **/
- String number = mNumber.getText().toString();
- /** 拿到输入的短信内容 **/
- String text = mMessage.getText().toString();
- /** 手机号码 与输入内容 必需不为空 **/
- if (!TextUtils.isEmpty(number) && !TextUtils.isEmpty(text)) {
- sendSMS(number, text);
- /**将发送的短信插入数据库**/
- ContentValues values = new ContentValues();
- //发送时间
- values.put("date", System.currentTimeMillis());
- //阅读状态
- values.put("read", 0);
- //1为收 2为发
- values.put("type", 2);
- //送达号码
- values.put("address", number);
- //送达内容
- values.put("body", text);
- //插入短信库
- getContentResolver().insert(Uri.parse("content://sms"),values);
- }
- }
- });
- <!-- 发送消息-->
- <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" />
老规矩每篇文章都会附带源代码,最后如果你还是觉得我写的不够详细 看的不够爽 不要紧我把源代码的下载地址贴出来 欢迎大家一起讨论学习雨松MOMO希望可以和大家一起进步。