短信的拦截可以用来拦截垃圾短信或者加入黑名单联系人的短信。
短信可以直接从数据库中获取
创建短信查询工具类,需要短信读权限
public class SmsUtils {
public static boolean backUp(Context context){
/**
* 目的:备份短信
* 1、判断当前用户的手机上面是否有sd卡
* 2、权限---
* 使用内容观察者
* 3、写短信到sd卡
*/
//address手机号码,type:1表示接受的短信,2表示发送的短信,body短信内容
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){//判断是否存在sd卡
ContentResolver resolver = context.getContentResolver();
Uri uri = Uri.parse("content://sms/");
Cursor cursor = resolver.query(uri, new String[]{"address", "date", "type", "body"}, null, null, null);
while(cursor.moveToNext()){
String address = cursor.getString(0);
String date = cursor.getString(1);
String type = cursor.getString(2);
String body = cursor.getString(3);
System.out.println("------------华丽的分割线-----------");
System.out.println("address:"+address);
System.out.println("date:"+date);
System.out.println("type:"+type);
System.out.println("body:"+body);
}
}
return false;
}
}
public class SmsReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
Object[] objects = (Object[]) intent.getExtras().get("pdus");
for (Object object : objects) {
//最多140个字节,超出的话,会分为多条短信发送,所以是一个数组,一般短信很短,for循环只执行一次
SmsMessage message = SmsMessage.createFromPdu((byte[]) object);
String originatingAddress = message.getOriginatingAddress();// 短信来源号码
String messageBody = message.getMessageBody();// 拿到短信内容
System.out.println(originatingAddress + ":" + messageBody);
短信的备份
public class SmsUtils {
public static boolean backUp(Context context) {
/**
* 目的:备份短信
* 1、判断当前用户的手机上面是否有sd卡
* 2、权限---
* 可以使用内容观察者
* 3、写短信到sd卡
*/
//address手机号码,date时间,type:1表示接受的短信,2表示发送的短信,body短信内容
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {//判断是否存在sd卡
ContentResolver resolver = context.getContentResolver();
Uri uri = Uri.parse("content://sms/");
Cursor cursor = resolver.query(uri, new String[]{"address", "date", "type", "body"}, null, null, null);
//以xml文件备份到sd卡
try {
File file = new File(Environment.getExternalStorageDirectory(), "backup.xml");
System.out.println(Environment.getExternalStorageDirectory());
FileOutputStream fos = new FileOutputStream(file);
//得到序列化器
XmlSerializer serializer = Xml.newSerializer();
serializer.setOutput(fos, "utf-8");
serializer.startDocument("utf-8", true);
serializer.startTag(null, "smss");
while (cursor.moveToNext()) {
String address = cursor.getString(0);
String date = cursor.getString(1);
String type = cursor.getString(2);
String body = cursor.getString(3);
// System.out.println("------------华丽的分割线-----------");
// System.out.println("address:" + address);
// System.out.println("date:" + date);
// System.out.println("type:" + type);
// System.out.println("body:" + body);
serializer.startTag(null, "sms");
serializer.startTag(null, "address");
serializer.text(address);
serializer.endTag(null, "address");
serializer.startTag(null, "date");
serializer.text(date);
serializer.endTag(null, "date");
serializer.startTag(null, "type");
serializer.text(type);
serializer.endTag(null, "type");
serializer.startTag(null, "body");
serializer.text(body);
serializer.endTag(null, "body");
serializer.endTag(null, "sms");
}
cursor.close();
serializer.endTag(null, "smss");
serializer.endDocument();
fos.flush();
fos.close();
return true;
} catch (Exception e) {
e.printStackTrace();
}
}
return false;
}
}
中间犯了个错误,跑到mnt中去找备份的文件结果发现老找不到,打印了一下保存的外部存储的地址是/storage/17F4-1012,应该是我用的API23外部存储换地方了吧。。。