短信发送
发短信第一件事是在manifest文件中添加权限
<uses-permission android:name="android.permission.SEND_SMS" />
第一方法:调用系统发短信的应用
/**
* 调起系统功能发短信
* @param phoneNumber
* @param message
*/
public void doSendSMSTo(String phoneNumber,String message){
if(PhoneNumberUtils.isGlobalPhoneNumber(phoneNumber)){
Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse("smsto:"+phoneNumber));
intent.putExtra("sms_body", message);
startActivity(intent);
}
}
第二:调用系统短信接口发送短信
// 对短信发送状态监听的广播接收器
private SmsStatusReceiver mSmsStatusReceiver;
//对短信接受状态监听的广播接收器
private SmsDeliveryStatusReceiver mSmsDeliveryStatusReceiver;
// 调用系统短信接口发送短信初始化
private void initSendSms() {
// TODO Auto-generated method stub
smsPhone = (EditText) findViewById(R.id.to);
SmsContent = (EditText) findViewById(R.id.content_sms_content);
send = (Button) findViewById(R.id.send_sms);
// 注册短信发送成功后的广播接收器Action
final String SMS_SEND_ACTIOIN = "SMS_SEND";
final String SMS_DELIVERED_ACTION = "SMS_DELIVERED";
mSmsStatusReceiver = new SmsStatusReceiver();
registerReceiver(mSmsStatusReceiver, new IntentFilter(SMS_SEND_ACTIOIN));
mSmsDeliveryStatusReceiver = new SmsDeliveryStatusReceiver();
registerReceiver(mSmsDeliveryStatusReceiver, new IntentFilter(
SMS_DELIVERED_ACTION));
// 发送短信
send.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//这个意图包装了对短信发送状态回调的处理逻辑
PendingIntent sentIntent = PendingIntent.getBroadcast(
SmsActivity.this, 1, new Intent(SMS_SEND_ACTIOIN), 0);
//这个意图包装了对短信接受状态回调的处理逻辑
PendingIntent deliveryIntent = PendingIntent.getBroadcast(
SmsActivity.this, 2, new Intent(SMS_DELIVERED_ACTION),
0);
SmsManager manager = SmsManager.getDefault();
manager.sendTextMessage(smsPhone.getText().toString(), null,
SmsContent.getText().toString(), sentIntent,
deliveryIntent);
}
});
}
//对于发送状态和接受状态的广播接收器的处理逻辑
/**
* 短信发送后的发送状态广播接收器
*
* @author cindy
*
*/
public class SmsStatusReceiver extends BroadcastReceiver {
private static final String TAG = "SmsStatusReceiver";
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "SmsStatusReceiver onReceive.");
switch (getResultCode()) {
case Activity.RESULT_OK:
Log.d(TAG, "Activity.RESULT_OK");
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
Log.d(TAG, "RESULT_ERROR_GENERIC_FAILURE");
break;
case SmsManager.RESULT_ERROR_NO_SERVICE:
Log.d(TAG, "RESULT_ERROR_NO_SERVICE");
break;
case SmsManager.RESULT_ERROR_NULL_PDU:
Log.d(TAG, "RESULT_ERROR_NULL_PDU");
break;
case SmsManager.RESULT_ERROR_RADIO_OFF:
Log.d(TAG, "RESULT_ERROR_RADIO_OFF");
break;
}
}
}
/**
* 短信发送到对方后,对返回的对方接受状态的处理逻辑
*
* @author cindy
*
*/
public class SmsDeliveryStatusReceiver extends BroadcastReceiver {
private static final String TAG = "SmsDeliveryStatusReceiver";
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "SmsDeliveryStatusReceiver onReceive.");
switch (getResultCode()) {
case Activity.RESULT_OK:
Log.i(TAG, "RESULT_OK");
break;
case Activity.RESULT_CANCELED:
Log.i(TAG, "RESULT_CANCELED");
break;
}
}
}
smsManager.sendTextMessage(destinationAddress, scAddress, text, sentIntent, deliveryIntent)
//关于这个方法参数的说明
– destinationAddress:目标电话号码
– scAddress:短信中心号码,测试可以不填
– text: 短信内容
– sentIntent:发送 –>中国移动 –> 中国移动发送失败 –> 返回发送成功或失败信号 –> 后续处理 即,这个意图包装了短信发送状态的信息
– deliveryIntent: 发送 –>中国移动 –> 中国移动发送成功 –> 返回对方是否收到这个信息 –> 后续处理 即:这个意图包装了短信是否被对方收到的状态信息(供应商已经发送成功,但是对方没有收到)。
监听短信
也有两种方法,一种通过监听系统发出的广播监听新短信到来,action=android.provider.Telephony.SMS_RECEIVED
下面是这个broadcastReceiver的onreceive方法,
package com.vincent.org.networkapp.broadcastreceiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;
/**
* 当系统接收到一个新消息时候系统发送一条action="android.provider.Telephony.SMS_RECEIVED"的广播。
* 这是一条有序广播可能被截断,所以这个广播方式只对新短信有效,同时未必有效,可能被系统切断了就收不到了有新短信的广播。
*
* @author cindy
*
*/
public class SmsReceiver extends BroadcastReceiver {
private static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED";
private static final String TAG = "SmsReceiver";
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
//获取到这个intent的action是不是android.provider.Telephony.SMS_RECEIVED
Log.i(TAG, "action: " + intent.getAction());
if (SMS_RECEIVED_ACTION.equals(intent.getAction())) {
StringBuilder builder = new StringBuilder();//用于存储短信内容
String sender = null;
Bundle bundle = intent.getExtras();
if (bundle != null) {
Object[] pdus = (Object[]) bundle.get("pdus");// 根据pdus key获取短信消息mesg数组,
//数组每一个元素表示一个SMS消息。将每个pdu字节数组转化成SmsMessage对象,调用SmsMessage.createFromPdu,传入每个字节数组
for (Object object : pdus) {
SmsMessage message = SmsMessage
.createFromPdu((byte[]) object);
sender = message.getOriginatingAddress();
builder.append(message.getMessageBody());
Log.i(TAG, "sender: " + sender + " builder: " + builder);
}
if (!builder.toString().isEmpty()) {
//如果短信不为空,发送一个自定义广播,把信息传递到activity上面显示
Log.d(TAG, "send message broadcast ,action=sms_received");
Intent intentbroadCast = new Intent();
intentbroadCast.putExtra("content", builder.toString());
//发送人
intentbroadCast.putExtra("sender", sender);
//短信内容体
intentbroadCast.setAction("sms_received");
context.sendBroadcast(intentbroadCast);// 发送一个sms_received的广播
}
}
}
}
}
自定义广播接收器
class MessageReceiver extends BroadcastReceiver {
private static final String SMS_RECEIVED_ACTION = "sms_received";
private static final String TAG = "MessageReceiver";
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Log.i(TAG, intent.getAction());
// 是不是接收到我们自定义发送的广播?
if (SMS_RECEIVED_ACTION.equals(intent.getAction())) {
Log.i(TAG, "动态注册自定义广播接收器");
Bundle bundle = intent.getExtras();
//将接受短信的对方号码和短信内容输出到UI界面。
sender.setText(bundle.getString("sender"));
content.setText(bundle.getString("content"));
}
}
}
// 注册广播接收器
filter = new IntentFilter();
filter.addAction("sms_received");
receiver = new MessageReceiver();
registerReceiver(receiver, filter);
ondestry()方法内注销动态注册的广播接收器
unregisterReceiver(receiver);
通过短信数据库获取短信内容
//sms信箱唯一路径
private final Uri SMS_INBOX = Uri.parse("content://sms/");
private final Handler smsHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
}
};
private SmsObserver smsObserver;
// 短信数据库的观察者,当短信数据库发生改变时候就触发这个类的onchange方法
// 当数据库发生改变时候,将触发这个类的onchange方法
class SmsObserver extends ContentObserver {
private static final String TAG = "SmsObserver";
public SmsObserver(Handler handler) {
super(handler);
// TODO Auto-generated constructor stub
}
//当短信数据库发送改变是回调这个方法
@Override
public void onChange(boolean selfChange) {
// TODO Auto-generated method stub
super.onChange(selfChange);
List<SmsBean> list = getSmsFromPhone();
if (list != null) {
content.setText(list.toString());
sender.setText(list.get(0).getNumber());
Log.i(TAG, content.getText().toString());
}
}
// 只是获取到address为15622204503的号码短信
private List<SmsBean> getSmsFromPhone() {
// TODO Auto-generated method stub
ContentResolver cResolver = getContentResolver();
String[] projection = new String[] { "body", "address", "person" };// 返回的列名
long data = System.currentTimeMillis() - 10 * 60 * 1000;
String where = " address= '15622204503' AND date > " + data;//构建where语句
Cursor cursor = cResolver.query(SMS_INBOX, projection, where, null,
"date desc");
if (null == cursor) {
return null;
}
List<SmsBean> list = new ArrayList<SmsBean>();
if (cursor.moveToNext()) {
Log.i(TAG, "address: " + cursor.getColumnIndex("address") + "");
String number = cursor.getString(cursor
.getColumnIndex("address"));// 手机号
String name = cursor.getString(cursor.getColumnIndex("person"));// 联系人名称
String body = cursor.getString(cursor.getColumnIndex("body"));
list.add(new SmsBean(number, name, body));
}
cursor.close();
return list;
}
}
// 通过查询短信数据库获取短信数据
//获取一个观察者实例,注册到SMS_INBOX上面,只要有短信到来就会触发smsObserver实例的onchange方法执行。
smsObserver = new SmsObserver(smsHandler);
getContentResolver().registerContentObserver(SMS_INBOX, true,
smsObserver);
参考文献:
Android开发之监听或获取手机短信内容
监听SMS消息