1.布局界面(layout.xml)
添加一个按钮组件,单击按钮以后会读取系统短信并在SD卡下保存一个文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".MainActivity"
android:orientation="vertical">
<Button
android:id="@+id/button1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="短信备份"/>
</LinearLayout>
2.编写SmsInfo类
因为获取到的短信较多,需要使用到 list ,而且每条短信包含的内容较多,如信息内容、时间、类型、发送地址,此时就需要一个类来封装这些信息,这样能够减少代码量,使代码更加容易理解。
class SmsInfo {
private String address;
private long date;
private int type;
private String body;
private int id;
public SmsInfo(String address,long date,int type,String body){
this.address=address;
this.date=date;
this.type=type;
this.body=body;
}
public SmsInfo(String address,long date,int type,String body,int id){
this.address=address;
this.date=date;
this.type=type;
this.body=body;
this.id=id;
}
public void setAddress(String address){ this.address=address; }
public String getAddress(){ return address; }
public void setDate(long date){ this.date=date; }
public long getDate(){ return date; }
public void setBody(String body){ this.body=body; }
public String getBody(){ return body; }
public void setId(int id){ this.id=id; }
public int getId(){return id; }
public void setType(int type){ this.type=type;}
public int getType(){return type; }
}
上述就是 SmsInfo JavaBean 对象的具体代码,其中封装了 date 、 type 、 address 、 body 以及 id 属性。
3.创建 XML 文件生成类Sms_Xml . java
该类负责把获取到的信息保存成一个 mes .xml 文件,存放在 SD 卡下。
public class Sms_Xml {
public static void beifen_sms(List<SmsInfo>list, Context context){
try {
XmlSerializer serial = Xml.newSerializer();
File file = new File(context.getExternalFilesDir(null), "mes.xml");
//初始化序列号器,指定xml数据写入到那个文件及编码
FileOutputStream fi_out = new FileOutputStream(file);
serial.setOutput(fi_out, "utf-8");
serial.startDocument("utf-8", true);
//根结点
serial.startTag(null, "smss");
for (SmsInfo info : list) {
//构建父结点
serial.startTag(null, "sms");
serial.attribute(null, "id", info.getId() + "");
//body
serial.startTag(null, "body");
serial.text(info.getBody());
serial.endTag(null, "body");
//adress
serial.startTag(null, "address");
serial.text(info.getAddress());
serial.endTag(null, "address");
//type
serial.startTag(null, "type");
serial.text(info.getType() + "");
serial.endTag(null, "type");
//date
serial.startTag(null, "date");
serial.text(info.getDate() + "");
serial.endTag(null, "date");
//父节点结束
serial.endTag(null, "sms");
}
serial.endTag(null, "smss");
serial.endDocument();
fi_out.close();
Toast.makeText(context, "短信备份成功", Toast.LENGTH_SHORT).show();
}catch (Exception e){
e.printStackTrace();
Toast.makeText(context, "短信备份失败", Toast.LENGTH_SHORT).show();
}
}
}
4.MainActivity代码
负责实现短信备份功能,初始化组件,为其添加事件,负责读取短信内容并储存。
public class MainActivity extends AppCompatActivity {
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout);
button=findViewById(R.id.button1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Uri uri=Uri.parse("content://sms/");
ContentResolver contentResolver=getContentResolver();
Cursor cursor=contentResolver.query(uri,new String[]{"address","date","type","body"},null,null,null);
List<SmsInfo>list=new ArrayList<SmsInfo>();
while (cursor.moveToNext()){
String address=cursor.getString(0);
long date=cursor.getLong(1);
int type=cursor.getInt(2);
String body=cursor.getString(3);
SmsInfo smsInfo=new SmsInfo(address,date,type,body);
list.add(smsInfo);
}
cursor.close();
Sms_Xml.beifen_sms(list,MainActivity.this);
}
});
}
}
5.添加权限
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
6.结果展示
1)打开虚拟机,创建联系人,并发送短信
2)点击按钮,显示备份成功
3)在SD卡目录下打开mes.xml文件