Android Manager之 SmsManager(短信管理器)
SmsManager(短信管理器)是Android提供的另一个非常常见的服务。
1.调起系统发送短信页面功能
1.1.设置权限
注意1:此处只为了演示调起发送短信功能 所以没有考虑Android 6.0及以上敏感权限问题
资料1:Android 6.0以上 需要运行时申请的权限(一)
资料2:Android 6.0以上 需要运行时申请的权限(二)
1.2.调起
Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse("smsto:"+"17710029800"));
intent.putExtra("sms_body", "我要给你发送短信了。");
startActivity(intent);
注意2:要判断手机号是否合法以及短信长度问题。
1.3.结果:
2.使用SmsManager提供的系列sendXxxMessage()方法直接发送短信
2.1. sendTextMessage(destinationAddress, scAddress, text, sentIntent, deliverIntent)方法。
作用:直接发送短信
参数1:destinationAddress:收信人的电话号码。
参数2:scAddress:短信中心的号码,null的话使用当前默认的短信服务中心。一般为null。
参数3:text:短信内容。
参数4:sentIntent:短信发送状态的信息:(发送状态的Intent) 如果不为null,当消息成功发送或失败这个PendingIntent就广播。
结果代码
Activity.RESULT_OK:表示成功
RESULT_ERROR_GENERIC_FAILURE:普通错误
RESULT_ERROR_RADIO_OFF:无线广播被明确地关闭
RESULT_ERROR_NULL_PDU :没有提供pdu
之一表示错误。
对应RESULT_ERROR_GENERIC_FAILURE
sentIntent可能包括额外的"错误代码"包含一 个无线电广播技术特定的值,通常只在修复故障时有用。每 一个基于SMS的应用程序控制检测sentIntent。 如果sentIntent是空,调用者将检测所有未知的应用程 序,这将导致在检测的时候发送较小数量的SMS。
参数5:deliverIntent:短信是否被对方收到的状态信息:(接收状态的Intent) 如果不为null,当这个短信发送到接收者那里,这个PendtingIntent会被广播, 状态报告生成的pdu(指对等层次之间传递的数据单位)会拓展到数据("pdu")。2.2.divideMessage (String text)方法。
作用:当短信内容太长时,分割短信。
返回值:ArrayList<String>。
2.3.Demo演示
String msg="这是一条短信!!!";
/**
* 1.获取SmsManager对象
* */
SmsManager smsManager=SmsManager.getDefault();
/**
* 2.处理返回的发送状态
* */
String SENT_SMS_ACTION = "SENT_SMS_ACTION";
Intent sentIntent = new Intent(SENT_SMS_ACTION);
PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, sentIntent, 0);
//注册发送信息的广播接收者
registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context _context, Intent _intent) {
switch (getResultCode()) {
case Activity.RESULT_OK:
Toast.makeText(SmsActivity.this, "短信发送成功!", Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE: //普通错误
break;
case SmsManager.RESULT_ERROR_RADIO_OFF: //无线广播被明确地关闭
break;
case SmsManager.RESULT_ERROR_NULL_PDU: //没有提供pdu
break;
case SmsManager.RESULT_ERROR_NO_SERVICE: //服务当前不可用
break;
}
}
}, new IntentFilter(SENT_SMS_ACTION));/**
* 3.处理返回的接收状态
* */
String DELIVERED_SMS_ACTION = "DELIVERED_SMS_ACTION";
//创建接收返回的接收状态的Intent
Intent deliverIntent = new Intent(DELIVERED_SMS_ACTION);
PendingIntent deliverPI = PendingIntent.getBroadcast(this, 0,deliverIntent, 0);
registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context _context, Intent _intent) {
Toast.makeText(SmsActivity.this,"收信人已经成功接收!", Toast.LENGTH_SHORT).show();
}
}, new IntentFilter(DELIVERED_SMS_ACTION));/**
* 发送短信
* */
//发送短信1 内容长度较短sendTextMessage方法
smsManager.sendTextMessage("11111111",null,msg,sentPI,deliverPI);
//发送短信2 内容较长先切割短信再发送
List<String> divideContents = smsManager.divideMessage(msg);
for (String text : divideContents) {
smsManager.sendTextMessage("11111111", null, text, sentPI, deliverPI);
}3.获取当前设备收到短信内容
3.1.代码
public void getSmsFromPhone() {
ContentResolver cr = getContentResolver();
String[] projection = new String[] {"_id", "address", "person","body", "date", "type" };
Cursor cur = cr.query(SMS_INBOX, projection, null, null, "date desc");
if (null == cur) {
return;
}StringBuilder stringBuilder=new StringBuilder();
while(cur.moveToNext()) {
String _id = cur.getString(cur.getColumnIndex("_id"));//_id
String number = cur.getString(cur.getColumnIndex("address"));//手机号
String name = cur.getString(cur.getColumnIndex("person"));//联系人姓名列表
String body = cur.getString(cur.getColumnIndex("body"));//短信内容
String date = cur.getString(cur.getColumnIndex("date"));//日期
String type = cur.getString(cur.getColumnIndex("type"));//类型
stringBuilder.append("_id:"+_id+"\n"+"手机号:"+number+"\n"+"姓名:"+name+"\n"+"内容:"+body+"\n"+"日期:"+date+"\n"+"类型:"+type+"\n");
}Log.d("TAG","结果:"+stringBuilder.toString());
}
3.2.结果
String number = cur.getString(cur.getColumnIndex("想获得的属性")); //获取方法
附1:
SmsManager官方文档:
Android 官方网址:http://androiddoc.qiniudn.com/reference/android/telephony/SmsManager.html
附2: