sweetyy、

导航

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)只备份接受的短信

posted on 2021-12-15 17:02  sweetyy、  阅读(264)  评论(0)    收藏  举报