Android 应用程序间数据共享(查看、备份系统短信)
Android 应用程序间数据共享(查看、备份系统短信)
一、实现步骤
1、 用户交互界面的设计与实现:activity_main.xml文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginStart="15dp"
android:layout_marginTop="15dp"
android:layout_marginEnd="15dp"
android:layout_marginBottom="15dp"
android:orientation="vertical">
<TextView
android:id="@+id/tv_des"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="读取到的系统短信信息如下:"
android:textSize="20sp"
android:visibility="gone" />
<TextView
android:id="@+id/tv_sms"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:lines="20"
android:textSize="16sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginBottom="30dp"
android:layout_marginRight="5dp"
android:layout_marginLeft="5dp"
android:padding="5dp">
<Button
android:id="@+id/btn1"
android:layout_width="0dp"
android:layout_height="50dp"
android:layout_weight="1"
android:text="查看短信"
tools:ignore="TouchTargetSizeCheck" />
<Button
android:id="@+id/btn2"
android:layout_width="0dp"
android:layout_height="50dp"
android:layout_weight="1"
android:text="备份短信"
tools:ignore="TouchTargetSizeCheck" />
</LinearLayout>
</RelativeLayout>

2、新建实体类(SmsInfo.java)
【系统短消息包含短息的_id,短信地址,短信内容,收发类型,发送时间等。】
package com.example.shortmessage;
public class SmsInfo
{
private int _id;//主键
private String address;//发送地址
private long date;//发送时间
private int type;//类型
private String body;//内容
private int id;
//构造方法
public SmsInfo(int _id,String address, long date, int type, String body) {
this._id = _id;
this.address = address;
this.date = date;
this.type = type;
this.body = body;
}
public String getAddress()
{
return address;
}
public String getBody()
{
return body;
}
public int getFormatType()
{
return type;
}
public long getFormatDate()
{
return date;
}
}
3、按钮功能的设计与实现(MainActivity.java文件)
【按运行时权限处理模板进行读取短消息权限处理。 getSms()方法用于获取系统短信的信息,首先获取系统短信的 Uri 对象,然后利用 ContentResolver,调用其 query()方法查询系统短信息,对查询到的结果集 cursor 进行处理,放到集合 smsInfos 中。最后,对集合 smsInfos 进行处理,将其显示到主界面。】
package com.example.shortmessage;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import android.Manifest;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MainActivity extends AppCompatActivity
{
private TextView tvSms, tvDes;
private Button button1,button2;
private String text = "";
private List<SmsInfo> smsinfos;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
private void init()
{
//绑定标签
tvSms = (TextView) findViewById(R.id.tv_sms);
tvDes = (TextView) findViewById(R.id.tv_des);
button1 = (Button) findViewById(R.id.btn1);
button2 = (Button) findViewById(R.id.btn2);
smsinfos = new ArrayList<SmsInfo>();
//为保存短信按钮设置监听器
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_SMS)
!= PackageManager.PERMISSION_GRANTED) {//运行时权限处理
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.READ_SMS}, 1);
} else {
getSms();
}
}
});
//为备份短信按钮设置监听器
/// 备份信息,采用SharedPreferences,在路径data/data/之下
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SharedPreferences shared = getSharedPreferences("data", MODE_PRIVATE);
SharedPreferences.Editor editor = shared.edit();
// System.out.println(111);
/// 由于前面的键不能同一个名字,所以才到后面加上一个i
for (int i = 0; i < smsinfos.size(); ++i) {
editor.putString("number" + i, smsinfos.get(i).getAddress());
editor.putString("content" + i, smsinfos.get(i).getBody());
editor.putInt("type" + i, smsinfos.get(i).getFormatType());
editor.putLong("time" + i, smsinfos.get(i).getFormatDate());
// System.out.println(info.get(i).getFormatDate());
}
editor.commit();///提交数据
Toast.makeText(MainActivity.this, "备份成功", Toast.LENGTH_LONG).show();// toast长时间文本
}
});
}
public void getSms()
{
Uri uri = Uri.parse("content://sms/"); //获取系统信息的 uri
//获取 ContentResolver 对象
ContentResolver resolver = getContentResolver();
//通过 ContentResolver 对象查询系统短信
Cursor cursor = resolver.query(uri, new String[]{"_id", "address",
"body","type","date"}, null, null, null);
if (cursor != null && cursor.getCount() > 0) {
tvDes.setVisibility(View.VISIBLE);
if (smsinfos!=null)smsinfos.clear();//清除集合中的数据
text = "";//清空 text 中原有的数据
while (cursor.moveToNext()) {
int _id = cursor.getInt(0);
String address = cursor.getString(1);
String body = cursor.getString(2);
int type = cursor.getInt(3);
long date=cursor.getLong(4);
SmsInfo smsInfo = new SmsInfo(_id, address, date,type,body);
smsinfos.add(smsInfo);
}
cursor.close();
}
//将查询到的短信内容显示到界面上
for (int i = 0; i < smsinfos.size(); i++) {
text += "手机号码:" + smsinfos.get(i).getAddress() + "\n";
text += "短信内容:" + smsinfos.get(i).getBody() + "\n";
text += "短信类型:" + smsinfos.get(i).getFormatType() + "\n";
text += "短信发送时间:" + smsinfos.get(i).getFormatDate() + "\n\n";
}
tvSms.setText(text);
}
//运行时权限处理的回调,处理用户授权结果
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 1:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
getSms();
} else {
Toast.makeText(this, "You denied the permission", Toast.LENGTH_SHORT).show();
}
break;
default:
}
}
}
4、添加读取短信权限:在清单文件中添加读取系统短信的权限。
<uses-permission android:name="android.permission.READ_SMS" />
二、效果展示
1、查看短信
(若消息太多则显示前四个)
【先准备好系统短信,在模拟机上发送一些短信】


2、查看备份的短信




三、拓展(只备份发送的短消息 、或只备份接收的短消息)
1、activity_main.xml文件中新增两个按钮

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginStart="15dp"
android:layout_marginTop="15dp"
android:layout_marginEnd="15dp"
android:layout_marginBottom="15dp"
android:orientation="vertical">
<TextView
android:id="@+id/tv_des"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="读取到的系统短信信息如下:"
android:textSize="20sp"
android:visibility="gone" />
<TextView
android:id="@+id/tv_sms"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:lines="20"
android:textSize="16sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginBottom="30dp"
android:layout_marginRight="5dp"
android:layout_marginLeft="5dp"
android:padding="5dp">
<Button
android:id="@+id/btn1"
android:layout_width="180dp"
android:layout_height="50dp"
android:layout_marginLeft="30px"
android:text="查看短信"
tools:ignore="TouchTargetSizeCheck" />
<Button
android:id="@+id/btn2"
android:layout_width="180dp"
android:layout_height="50dp"
android:layout_marginLeft="30px"
android:text="备份短信"
tools:ignore="TouchTargetSizeCheck" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginBottom="80dp"
android:layout_marginRight="5dp"
android:layout_marginLeft="5dp"
android:padding="5dp">
<Button
android:id="@+id/btn3"
android:layout_width="180dp"
android:layout_height="50dp"
android:layout_marginLeft="30px"
android:text="备份发送的短信"
tools:ignore="TouchTargetSizeCheck" />
<Button
android:id="@+id/btn4"
android:layout_width="180dp"
android:layout_height="50dp"
android:layout_marginLeft="30px"
android:text="备份接受的短信"
tools:ignore="TouchTargetSizeCheck" />
</LinearLayout>
</RelativeLayout>

2、MainActivity.java中添加按钮监听
//为备份发送的短信按钮设置监听器
button3.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view)
{
SharedPreferences shared = getSharedPreferences("data", MODE_PRIVATE);
SharedPreferences.Editor editor = shared.edit();
//清空
editor.clear();
/// 由于前面的键不能同一个名字,所以才到后面加上一个i
for (int i = 0; i < smsinfos.size(); ++i)
{
//type value=1是接受的,continue跳过
if(smsinfos.get(i).getFormatType()==1)continue;
editor.putString("number" + i, smsinfos.get(i).getAddress());
editor.putString("content" + i, smsinfos.get(i).getBody());
editor.putInt("type" + i, smsinfos.get(i).getFormatType());
editor.putLong("time" + i, smsinfos.get(i).getFormatDate());
// System.out.println(info.get(i).getFormatDate());
}
editor.commit();///提交数据
Toast.makeText(MainActivity.this, "备份发送的短信成功", Toast.LENGTH_LONG).show();// toast长时间文本
}
});
//为备份接受的短信按钮设置监听器
button4.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view)
{
SharedPreferences shared = getSharedPreferences("data", MODE_PRIVATE);
SharedPreferences.Editor editor = shared.edit();
editor.clear();
for (int i = 0; i < smsinfos.size(); ++i)
{
if(smsinfos.get(i).getFormatType()==2)continue;
editor.putString("number" + i, smsinfos.get(i).getAddress());
editor.putString("content" + i, smsinfos.get(i).getBody());
editor.putInt("type" + i, smsinfos.get(i).getFormatType());
editor.putLong("time" + i, smsinfos.get(i).getFormatDate());
// System.out.println(info.get(i).getFormatDate());
}
editor.commit();///提交数据
Toast.makeText(MainActivity.this, "备份接收的短信成功", Toast.LENGTH_LONG).show();// toast长时间文本
}
});
完整的代码如下:
package com.example.shortmessage;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import android.Manifest;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MainActivity extends AppCompatActivity
{
private TextView tvSms, tvDes;
private Button button1,button2,button3,button4;
private String text = "";
private List<SmsInfo> smsinfos;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
private void init()
{
//绑定标签
tvSms = (TextView) findViewById(R.id.tv_sms);
tvDes = (TextView) findViewById(R.id.tv_des);
button1 = (Button) findViewById(R.id.btn1);
button2 = (Button) findViewById(R.id.btn2);
button3 = (Button) findViewById(R.id.btn3);
button4 = (Button) findViewById(R.id.btn4);
smsinfos = new ArrayList<SmsInfo>();
//为保存短信按钮设置监听器
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_SMS)
!= PackageManager.PERMISSION_GRANTED) {//运行时权限处理
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.READ_SMS}, 1);
} else {
getSms();
}
}
});
//为备份短信按钮设置监听器
/// 备份信息,采用SharedPreferences,在路径data/data/之下
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SharedPreferences shared = getSharedPreferences("data", MODE_PRIVATE);
SharedPreferences.Editor editor = shared.edit();
// System.out.println(111);
/// 由于前面的键不能同一个名字,所以才到后面加上一个i
for (int i = 0; i < smsinfos.size(); ++i) {
editor.putString("number" + i, smsinfos.get(i).getAddress());
editor.putString("content" + i, smsinfos.get(i).getBody());
editor.putInt("type" + i, smsinfos.get(i).getFormatType());
editor.putLong("time" + i, smsinfos.get(i).getFormatDate());
// System.out.println(info.get(i).getFormatDate());
}
editor.commit();///提交数据
Toast.makeText(MainActivity.this, "备份成功", Toast.LENGTH_LONG).show();// toast长时间文本
}
});
//为备份发送的短信按钮设置监听器
button3.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view)
{
SharedPreferences shared = getSharedPreferences("data", MODE_PRIVATE);
SharedPreferences.Editor editor = shared.edit();
//清空
editor.clear();
/// 由于前面的键不能同一个名字,所以才到后面加上一个i
for (int i = 0; i < smsinfos.size(); ++i)
{
//type value=1是接收的,continue跳过
if(smsinfos.get(i).getFormatType()==1)continue;
editor.putString("number" + i, smsinfos.get(i).getAddress());
editor.putString("content" + i, smsinfos.get(i).getBody());
editor.putInt("type" + i, smsinfos.get(i).getFormatType());
editor.putLong("time" + i, smsinfos.get(i).getFormatDate());
// System.out.println(info.get(i).getFormatDate());
}
editor.commit();///提交数据
Toast.makeText(MainActivity.this, "备份发送的短信成功", Toast.LENGTH_LONG).show();// toast长时间文本
}
});
//为备份接受的短信按钮设置监听器
button4.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view)
{
SharedPreferences shared = getSharedPreferences("data", MODE_PRIVATE);
SharedPreferences.Editor editor = shared.edit();
editor.clear();
for (int i = 0; i < smsinfos.size(); ++i)
{
//type 的value值为2,表示发送的短信,跳过
if(smsinfos.get(i).getFormatType()==2)continue;
editor.putString("number" + i, smsinfos.get(i).getAddress());
editor.putString("content" + i, smsinfos.get(i).getBody());
editor.putInt("type" + i, smsinfos.get(i).getFormatType());
editor.putLong("time" + i, smsinfos.get(i).getFormatDate());
// System.out.println(info.get(i).getFormatDate());
}
editor.commit();///提交数据
Toast.makeText(MainActivity.this, "备份接受的短信成功", Toast.LENGTH_LONG).show();// toast长时间文本
}
});
}
public void getSms()
{
Uri uri = Uri.parse("content://sms/"); //获取系统信息的 uri
//获取 ContentResolver 对象
ContentResolver resolver = getContentResolver();
//通过 ContentResolver 对象查询系统短信
Cursor cursor = resolver.query(uri, new String[]{"_id", "address",
"body","type","date"}, null, null, null);
if (cursor != null && cursor.getCount() > 0) {
tvDes.setVisibility(View.VISIBLE);
if (smsinfos!=null)smsinfos.clear();//清除集合中的数据
text = "";//清空 text 中原有的数据
while (cursor.moveToNext()) {
int _id = cursor.getInt(0);
String address = cursor.getString(1);
String body = cursor.getString(2);
int type = cursor.getInt(3);
long date=cursor.getLong(4);
SmsInfo smsInfo = new SmsInfo(_id, address, date,type,body);
smsinfos.add(smsInfo);
}
cursor.close();
}
//将查询到的短信内容显示到界面上
for (int i = 0; i < smsinfos.size(); i++) {
text += "手机号码:" + smsinfos.get(i).getAddress() + "\n";
text += "短信内容:" + smsinfos.get(i).getBody() + "\n";
text += "短信类型:" + smsinfos.get(i).getFormatType() + "\n";
text += "短信发送时间:" + smsinfos.get(i).getFormatDate() + "\n\n";
}
tvSms.setText(text);
}
//运行时权限处理的回调,处理用户授权结果
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 1:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
getSms();
} else {
Toast.makeText(this, "You denied the permission", Toast.LENGTH_SHORT).show();
}
break;
default:
}
}
}
3、效果展示
(1)只备份发送的短信


(2)只备份接受的短信


浙公网安备 33010602011771号