1.界面设计
?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"
android:orientation="vertical"
tools:context=".MainActivity">
<Button
android:id="@+id/button1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="读取显示" />
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text=" " />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/button2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:text="XML保存" />
</RelativeLayout>
</LinearLayout>
2.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; }
}
3.修改MainActivity代码
public class MainActivity extends Activity {
private Button button;
private Button button2;
private TextView textView;
private List<SmsInfo> smsInfoList;
private String text=" ";
static final String[] PERMISSION=new String[]{
Manifest.permission.READ_SMS,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
};
private void init() {
button=(Button)findViewById(R.id.button1);
button2=(Button)findViewById(R.id.button2);
textView=(TextView)findViewById(R.id.textView);
smsInfoList=new ArrayList<SmsInfo>();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout);
init();
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) { MyPermission1(); }
});
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MyPermission2();
try{
XmlSerializer serial = Xml.newSerializer();
String sd_path=getExternalFilesDir(null).getAbsolutePath();
File file = new File(sd_path, "mes.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 : smsInfoList ){
serial.startTag(null, "sms");
serial.attribute(null, "id", info.getId() + "");
serial.startTag(null, "body");
serial.text(info.getBody());
serial.endTag(null, "body");
serial.startTag(null, "address");
serial.text(info.getAddress());
serial.endTag(null, "address");
serial.startTag(null, "type");
serial.text(info.getType() + "");
serial.endTag(null, "type");
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();
textView.setText(textView.getText()+"\n"+"短信备份成功");
}catch (Exception e){
e.printStackTrace();
textView.setText(textView.getText()+"\n"+"短信备份失败");
}
}
});
}
//读取权限
public void MyPermission1() {
if(ContextCompat.checkSelfPermission(this,Manifest.permission.READ_SMS)!= PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_SMS},1);
}else{
getSms();
Toast.makeText(this,"读取成功",Toast.LENGTH_SHORT).show();
}
}
public void MyPermission2() {
if(ContextCompat.checkSelfPermission(this,Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},2);
}
}
//读取
public void getSms() {
Uri uri=Uri.parse("content://sms/");
ContentResolver contentResolver=getContentResolver();
Cursor cursor=contentResolver.query(uri,new String[]{"_id","address","date","type","body"},
null,null,null);
if(cursor!=null&&cursor.getCount()>0){
textView.setVisibility(View.VISIBLE);
if(smsInfoList!=null)smsInfoList.clear();
text=" ";
while (cursor.moveToNext()){
int _id=cursor.getInt(0);
String address=cursor.getString(1);
long date=cursor.getLong(2);
int type=cursor.getInt(3);
String body=cursor.getString(4);
SmsInfo smsInfo=new SmsInfo(address,date,type,body,_id);
smsInfoList.add(smsInfo);
}
cursor.close();
}
for(int i=0;i<smsInfoList.size();i++){
text+="手机号:"+smsInfoList.get(i).getAddress()+"\n";
text+="短信内容"+smsInfoList.get(i).getBody()+"\n\n";
}
textView.setText(text);
}
@Override
public void onRequestPermissionsResult(int requestCode,String[] permissions,int[] grantResults){
super.onRequestPermissionsResult(requestCode,permissions,grantResults);
switch (requestCode){
case 1:
for(int i=0;i<permissions.length;i++){
if(grantResults[i]==PackageManager.PERMISSION_GRANTED){
getSms();
Toast.makeText(this,""+"权限"+permissions[i]+"申请成功,读取短信",Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(this,""+"权限"+permissions[i]+"申请失败,读取短信失败",Toast.LENGTH_SHORT).show();
}
}
break;
case 2:
for(int i=0;i<permissions.length;i++){
if(grantResults[i]==PackageManager.PERMISSION_GRANTED){
Toast.makeText(this,""+"权限"+permissions[i]+"申请成功,能够使用SD卡",Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(this,""+"权限"+permissions[i]+"申请失败,不能够使用SD卡",Toast.LENGTH_SHORT).show();
}
}
break;
}
}
}
4.结果展示
安卓6.0以上需要获取虚拟机的动态权限。本文已经对动态权限进行了访问,进入虚拟机会主动询问是否获取权限。由于我第一次运行已经同意申请权限,所以后续的运行不在弹出对话框。
文本框里面显示通讯录信息,点击XML保存之后,添加了“短信备份成功”这句话。
mes.xml
怎么查看mes.xml文件,ContentResolver系统短信备份_啦啦嘿呀的博客-CSDN博客
这篇博客内有介绍。