android中短信的获取、拦截以及备份

本文介绍了在Android系统中如何实现短信的获取、拦截和备份操作。通过数据库查询获取短信,使用权限管理拦截不需要的短信,并详细讨论了在API23及以上版本中备份短信时遇到的路径问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

短信的拦截可以用来拦截垃圾短信或者加入黑名单联系人的短信。

短信可以直接从数据库中获取
这里写图片描述

创建短信查询工具类,需要短信读权限

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外部存储换地方了吧。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值