[android] 短信的备份详解手机开发

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

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

数据库字段:address(手机号),date(日期),type1接收,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对象,参数:projectionString[] 查询字段,条件,参数,排序

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(); 
        } 
    } 
}

 

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/5488.html

(0)
上一篇 2021年7月16日
下一篇 2021年7月16日

相关推荐

发表回复

登录后才能评论