使用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@H_301_174@ com.tsh.backsmstrue; @H_301_174@import@H_301_174@ java.util.ArrayList; @H_301_174@ java.util.List; @H_301_174@ com.tsh.backsmstrue.domain.SmsInfo; @H_301_174@ com.tsh.backsmstrue.utils.SmsUtil; @H_301_174@ android.app.Activity; @H_301_174@ android.content.ContentResolver; @H_301_174@ android.database.Cursor; @H_301_174@ android.net.Uri; @H_301_174@ android.os.Bundle; @H_301_174@ android.view.View; @H_301_174@public @H_301_174@class MainActivity @H_301_174@extends@H_301_174@ Activity { @Override @H_301_174@protected @H_301_174@void@H_301_174@ onCreate(Bundle savedInstanceState) { @H_301_174@super@H_301_174@.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } /**@H_301_174@ * 备份短信 * @param@H_301_174@ v @H_301_174@*/ @H_301_174@ backupSms(View v){ Uri uri=Uri.parse("content://sms/"@H_301_174@); ContentResolver resolver=@H_301_174@getContentResolver(); String[] projection=@H_301_174@new String[]{"address","date","type","body"@H_301_174@}; Cursor cursor=resolver.query(uri,@H_301_174@null,1)">null@H_301_174@); List<SmsInfo> smss=@H_301_174@new ArrayList<SmsInfo>@H_301_174@(); @H_301_174@while@H_301_174@(cursor.moveToNext()){ String body=cursor.getString(cursor.getColumnIndex("body"@H_301_174@)); System.out.println(body); System.out.println("==========="@H_301_174@); SmsInfo smsinfo=@H_301_174@new@H_301_174@ SmsInfo(); smsinfo.setAddress("110"@H_301_174@); smsinfo.setMessage(body); smss.add(smsinfo); } SmsUtil.backSms2(smss,@H_301_174@this@H_301_174@); cursor.close(); } }
工具类:
@H_301_174@ com.tsh.backsmstrue.utils; @H_301_174@ java.io.File; @H_301_174@ java.io.FileOutputStream; @H_301_174@ org.xmlpull.v1.XmlSerializer; @H_301_174@ com.tsh.backsmstrue.domain.SmsInfo; @H_301_174@ android.content.Context; @H_301_174@ android.os.Environment; @H_301_174@ android.util.Xml; @H_301_174@ android.view.View; @H_301_174@ android.widget.Toast; @H_301_174@class@H_301_174@ SmsUtil { @H_301_174@ * 备份短信第二种 * static @H_301_174@void backSms2(List<SmsInfo>@H_301_174@ smsInfos,Context context){ XmlSerializer serializer=@H_301_174@Xml.newSerializer(); @H_301_174@try@H_301_174@ { File file=@H_301_174@new File(Environment.getExternalStorageDirectory(),"backup2.xml"@H_301_174@); FileOutputStream os=@H_301_174@ FileOutputStream(file); serializer.setOutput(os,"utf-8"@H_301_174@); serializer.startDocument("utf-8",1)">true@H_301_174@); serializer.startTag(301_174@); @H_301_174@for@H_301_174@(SmsInfo sms:smsInfos){ serializer.startTag(301_174@); serializer.attribute(301_174@,sms.getAddress()); serializer.text(sms.getMessage()); serializer.endTag(@H_301_174@); } serializer.endTag(@H_301_174@); serializer.endDocument(); os.close(); Toast.makeText(context,"保存成功",0@H_301_174@).show(); } @H_301_174@catch@H_301_174@ (Exception e) { Toast.makeText(context,"保存失败",1)">).show(); } } }