短信的发送
两种发送方式:
一、利用系统的短信发送程序
1.Intent 发送一个隐式意图
Intent intent=new Intent(Intent.ACTION_SENDTO);
Uri data=Uri.parse("smsto:"+"号码:例如15555215556");
intent.setData(data);
intent.putExtra("sms_body",etContent.getText().toString());
starActivity(intent);
2.另外一种隐式意图
Intent intent =new Intent(Intent.ACTION_VIEW);
intent.setType('address","15555215556");
intent.putExtra("sms_body",etContent.geText().toString());//获得的发送的信息
startActivity(intent);
二、利用代码来发送短信消息
1.简单一些的写法
SmsManager manager=SmsManager.getDefault();
manager.senTextMessage(对方手机号码,null,短信正文,null,null);
添加上两个PendingIntent,可以获得短信的发送状态
//发送信息时间
Intent intent=new Intent("com.tarena.SENT");
PendingIntent pi1=PendingIntent.getBroadcast(this, 0, intent, 0);
//信息到达对方手机时间
Intent intent2=new Intent("com.tarena.DELIVERY");
PendingIntent pi2=PendingIntent.getBroadcast(this,0, intent2, 0);
利用代码发送短信,有两点要注意:
1) 申请权限SEND_SMS
2) 利用代码发送短信,短信是不会被系统写入数据表
短信的接收
安卓系统后台有一个服务(Service),专门用来接收短信消息,当有新的消息到达时,Service会发送一个广播,广播的Action是
“android.provider.Telephony.SMS_RECEIVED”并且将收到短消息作为广播Intent的一部分(Intent的Extra)发送出去,先到先得!
步骤:
1.注册广播接收器,接收“android.provider.Telephony.SMS_RECEIVED”广播
在onResume中注册:重写方法和onPause配套使用
MyReceiver receiver=new MyReceiver();//自己创建的一个类,继承BroadcastReceiver
IntentFilter filter=new IntentFilter();
filter.addAction("com.tarena.SENT");
filter.addAction("com.tarena.DELIVERY");
filter.addAction("android.provider.Telephony.SMS_RECEIVED");
filter.setPriority(1001);
registerReceiver(receiver, filter);
在MyReceive中:
if("android.provider.Telephony.SMS_RECEIVED".equals(action)){
//可以处理短消息
Bundle bundle=intent.getExtras();
Object[] pdus=(Object[]) bundle.get("pdus");
StringBuilder sb=new StringBuilder();
String phoneNumber="";
//把一个一个pdus转为一段的短消息
for (int i = 0; i < pdus.length; i++) {
SmsMessage message=SmsMessage.createFromPdu((byte[])pdus[i]);
sb.append(message.getDisplayMessageBody());
phoneNumber=message.getDisplayOriginatingAddress();
}
Log.i("TAG", "发送方电话:"+phoneNumber+",发送内容:"+sb);
//“有短信”这条广播不在继续下发
abortBroadcast();
}
在onPause()中注销:
unregisterReceive
2.必须设定权限RECEIVE_SMS
3.设定较高的优先级(1000左右)
filter.setPriority(1001);
4.如果不希望系统的短信程序接收短信,就执行abortBroadcast();,广播停止下发
问题:如果系统短信接收程序收不到短信了,那么这条短信也不会被写入数据库