监听系统短信、备份短信、自动发送短信

操作系统短信的uri: content://sms/

查询联系人: raw_contacts, data

查询:
1. 去raw_contacts表中取所有联系人的_id

2.data表中根据上面取到的_id查询对应id的数据.

content://com.android.contacts/raw_contacts
content://com.android.contacts/data


添加:
1. 在raw_contacts表中添加一个记录

2. 根据上面添加记录的id, 取data表中添加三条数据

内容观察者:
发件箱的uri: content://sms/outbox

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 监听系统短信 获取内容提供者       
        ContentResolver resolver = getContentResolver();

        /**
         * 
         * 当内容观察者 观察到是数据库的内容变了,调用这个方法
         * 观察到 消息邮箱里面有一条数据库内容变化的通知
         * 
         * 参数:
         * uri,
         * true,只要前缀相同就监听,false:只有完全匹配才监听
         * 
         * 
         */
        // 注册一个内容观察者观察短信数据库
        resolver.registerContentObserver(Uri.parse("content://sms/"), true, new MyContentObserver(new Handler()));
    }

    /**
     * @author andong
     * 内容观察者
     */
    class MyContentObserver extends ContentObserver {

        private static final String TAG = "MyContentObserver";

        public MyContentObserver(Handler handler) {
            super(handler);
        }

        /**
         * 当被监听的内容发生改变时回调
         */
        @Override
        public void onChange(boolean selfChange) {
            Log.i(TAG, "短信改变了");
            Uri uri = Uri.parse("content://sms/outbox");    // 发件箱的uri

            // 查询发件箱的内容
            Cursor cursor = getContentResolver().query(uri, new String[]{"address", "date", "body"}, null, null, null);
            if(cursor != null && cursor.getCount() > 0) {

                String address;
                long date;
                String body;
                while(cursor.moveToNext()) {
                    address = cursor.getString(0);
                    date = cursor.getLong(1);
                    body = cursor.getString(2);

                    Log.i(TAG, "号码: " + address + ", 日期: " + date + ", 内容: " + body);
                }
                cursor.close();
            }
        }
    }
}


//添加权限
  <uses-permission android:name="android.permission.READ_SMS"/>
ublic class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }

    /**
     * 备份短信
     * @param v
     */
    public void backupSms(View v) {
        // 1. 查出所有的短信
        Uri uri = Uri.parse("content://sms/");

        ContentResolver resolver = getContentResolver();
        Cursor cursor = resolver.query(uri, new String[]{"_id", "address", "date", "type", "body"}, null, null, null);

        if(cursor != null && cursor.getCount() > 0) {
            List<SmsInfo> smsList = new ArrayList<SmsInfo>();
            SmsInfo sms;

            while(cursor.moveToNext()) {    // 控制游标结果集的指针向下移一位, 当到最后一位, 停止.返回false
                sms = new SmsInfo();
                sms.setId(cursor.getInt(0));    // 设置短信的id
                sms.setAddress(cursor.getString(1));    // 设置短信的号码
                sms.setDate(cursor.getLong(2)); // 设置短信的日期
                sms.setType(cursor.getInt(3));  // 设置短信的类型, 接收1还是发送2
                sms.setBody(cursor.getString(4)); // 设置短信的内容
                smsList.add(sms);
            }
            cursor.close();

            // 2. 序列化到本地
            writeToLocal(smsList);
        }
    }

    /**
     * 序列化到本地
     */
    private void writeToLocal(List<SmsInfo> smsList) {

        try {
            XmlSerializer serializer = Xml.newSerializer(); // 得到序列化对象
            // 指定输出位置
            FileOutputStream fos = new FileOutputStream("/mnt/sdcard/sms.xml");
            serializer.setOutput(fos, "utf-8");

            serializer.startDocument("utf-8", true);

            serializer.startTag(null, "smss");

            for (SmsInfo smsInfo : smsList) {
                serializer.startTag(null, "sms");
                serializer.attribute(null, "id", String.valueOf(smsInfo.getId()));

                // 写号码
                serializer.startTag(null, "address");
                serializer.text(smsInfo.getAddress());
                serializer.endTag(null, "address");

                // 写时间
                serializer.startTag(null, "date");
                serializer.text(String.valueOf(smsInfo.getDate()));
                serializer.endTag(null, "date");

                //写类型
                serializer.startTag(null, "type");
                serializer.text(String.valueOf(smsInfo.getType()));
                serializer.endTag(null, "type");

                // 写内容
                serializer.startTag(null, "body");
                serializer.text(smsInfo.getBody());
                serializer.endTag(null, "body");

                serializer.endTag(null, "sms");
            }

            serializer.endTag(null, "smss");

            serializer.endDocument();

            Toast.makeText(this, "备份成功", 0).show();
        } catch (Exception e) {
            Toast.makeText(this, "备份失败", 0).show();
            e.printStackTrace();
        }

    }
}
//自动发送短信
public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 停30秒钟, 想系统短信数据库中写一条短信
        new Thread(new Runnable() {
            @Override
            public void run() {
                SystemClock.sleep(10 * 1000);

                Uri uri = Uri.parse("content://sms/");  // 操作sms表的uri

                ContentValues values = new ContentValues();
                values.put("address", "95555");
                values.put("type", "1");
                values.put("body", "您的尾号为8890的账户, 收到100, 000, 000, 000.00元的转账. 活期余额为: 899, 777, 000, 111, 000.00元");
                getContentResolver().insert(uri, values);
            }
        }).start();
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值