[android] 短信的备份

使用ddms给模拟器发送几条短信,找到短信数据库导出

/data/data/com.android.providers.telephony/databases/mmssms.db

数据库字段:address(手机号),date(日期),type(1接收,2发送),body(内容)

在系统的全部源代码中找到packages/providers/TelephonyProvider

查看清单文件,找到provider节点,

看到android:readPermisssion=”android.permission.READ_SMS”

android:writePermission=”android.permission.WRITE_SMS” 权限

找到TelephonyProvider类里的satic静态代码块,看到规则部分,最简单的content://sms/

调用Uri类的parse(string) 方法,获取到Uri对象

调用getContentResolver()方法,获取ContentResolver对象,中间人对象

调用ContentResolver对象的query(uri,projection,selection,selectArgs,sortOrder)方法,得到Cursor对象,参数:projection是String[] 查询字段,条件,参数,排序

while循环Cursor对象,调用Cursor对象的moveToNext() ,调用Cursor对象的getString(),调用Cursor对象的getClumnIndex()

数据中日期date字段是时间戳毫秒值

在清单文件中定义一下权限

当短信内容比较少的时候没问题,多的时候会有问题,应该是遍读遍备份。

根据xml文件的序列化那节,完成保存到文件中。保存到sd卡的时候也要权限

activity:

package com.tsh.backsmstrue;

import java.util.ArrayList;
import java.util.List;

import com.tsh.backsmstrue.domain.SmsInfo;
import com.tsh.backsmstrue.utils.SmsUtil;

import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;

public 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){
        Uri uri=Uri.parse("content://sms/");
        ContentResolver resolver=getContentResolver();
        String[] projection=new String[]{"address","date","type","body"};
        Cursor cursor=resolver.query(uri, projection, null, null, null);
        List<SmsInfo> smss=new ArrayList<SmsInfo>();
        while(cursor.moveToNext()){
            String body=cursor.getString(cursor.getColumnIndex("body"));
            System.out.println(body);
            System.out.println("===========");
            SmsInfo smsinfo=new SmsInfo();
            smsinfo.setAddress("110");
            smsinfo.setMessage(body);
            smss.add(smsinfo);
        }
        SmsUtil.backSms2(smss, this);
        cursor.close();
    }
}

工具类:

package com.tsh.backsmstrue.utils;

import java.io.File;
import java.io.FileOutputStream;
import java.util.List;

import org.xmlpull.v1.XmlSerializer;

import com.tsh.backsmstrue.domain.SmsInfo;

import android.content.Context;
import android.os.Environment;
import android.util.Xml;
import android.view.View;
import android.widget.Toast;


public class SmsUtil {
    /**
     * 备份短信第二种
     * @param v
     */
    public static void backSms2(List<SmsInfo> smsInfos,Context context){
        XmlSerializer serializer=Xml.newSerializer();
        try {
            File file=new File(Environment.getExternalStorageDirectory(),"backup2.xml");
            FileOutputStream os=new FileOutputStream(file);
            serializer.setOutput(os, "utf-8");
            serializer.startDocument("utf-8", true);
            serializer.startTag(null, "smss");
            for(SmsInfo sms:smsInfos){
                serializer.startTag(null, "sms");
                serializer.attribute(null, "tel", sms.getAddress());
                serializer.text(sms.getMessage());
                serializer.endTag(null, "sms");
            }
            serializer.endTag(null, "smss");
            serializer.endDocument();
            os.close();
            Toast.makeText(context, "保存成功", 0).show();
        } catch (Exception e) {
            Toast.makeText(context, "保存失败", 0).show();
        }
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏SAMshare

Machine Learning-模型评估与调参 ——管道工作流

“管道工作流”这个概念可能有点陌生,其实可以理解为一个容器,然后把我们需要进行的操作都封装在这个管道里面进行操作,比如数据标准化、特征降维、主成分分析、模型预测...

8330
来自专栏自然语言处理(NLP)论文速递

「自然语言处理(NLP)速递」ACL--FaceBook(上下文自适应Attention跨度)&& 树Transformer

本次的两篇文章主要和Attention相关。第一篇是FaceBook AI团队基于Transformer提出的一种自适应注意力跨度算法,该算法在Tran...

15520
来自专栏终身学习者

使用 CSS Grid Generator来快速使用及学习 Grid 布局

CSS Grid Generator是一个由Sarah Drasner创建的免费工具。它是一个可视化设计工具,允许咱们创建一个基本的 grid 布局,然后就可以...

7520
来自专栏前端达人

「css基础」一次搞懂CSS 字体单位:px、em、rem 和 %

对于绘图和印刷而言,「单位」相当重要的,然而在网页排版里,单位也是同样具有重要性,在CSS3 普及以来,更添加了一些方便好用的单位( em、rem.. .等),...

11320
来自专栏蚂蚁开源社区

【前端艺术】html5和css3响应式全屏滚动页面切换源码

这是一款全屏响应式的HTML5和CSS3页面切换效果。这个页面布局效果对于那些页面要求固定100%高度和宽度的网站和APP来说是十分有用的。

21920
来自专栏Java后端生活

随便讲讲WEB前端

很久之前有人和说前端是直接接触用户,给到用户输入输出的东西,一个系统的门面,像人与人直接的交流,所以前端也可以看成是个‘人’。它具有身躯(HTML)、外貌和衣服...

9920
来自专栏前端入门学习

WEB前端学习:JS实现中文简体繁体切换

Web前端开发工程师是一个很新的职业,是从事Web前端开发工作的工程师。主要进行网站开发,优化,完善的工作。网页制作是Web 1.0时代的产物,那时网站的主要内...

18220
来自专栏博客同步

深入解析CSS样式优先级

作为前端多多少少都会对CSS样式的权重有一定的了解。最常用的方法就是对不同的选择器分配不同的权重比,常见的就是

6820
来自专栏蚂蚁开源社区

【前端艺术】HTML5 Canvas和jQuery实时动态天气预报

这是一款非常有意思的纯CSS3扁平风格天气预报卡片动画特效。该天气预报特效将各种天气制作为卡片形式,包括下雨,闪电,白天,夜间和下雪。卡片使用扁平化风格,并使用...

34630
来自专栏前端入门学习

现在这么多人转行学web前端开发,那么web前端到底能干嘛?

现在很多人说学习web前端,很多人只知道web前端薪资高?那么你太low了,web前端在各行各业都有着运用,可以说是无所不能,web前端到底能干嘛?

10230

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励