使用ContentProvider查看系统短信

通过ContentProvider访问Android系统短信
这篇博客介绍了如何使用ContentProvider来查看Android系统的短信。首先,开发者需要知道短信存储在data/user_de/0/com.android.providers.telephony/databases/mmssms.db的sms表中。接着,创建`SmsInfo`类来存储短信信息,包括短信ID、发送地址和内容。在布局文件和界面交互代码中,利用ContentResolver查询短信,并处理权限请求。在AndroidManifest.xml中添加读取短信的权限,当用户允许权限后,可以展示短信内容。
部署运行你感兴趣的模型镜像

使用ContentProvider查看系统短信,首先要知道系统短信的数据文件在哪,在Android Studio中单击Device File Explorer,在目录中选择data/user_de/0/
com.android.roviders.telephony/databases目录下的mmssms.db文件中,与短信有关的是sms表,_id表示短信主键,address表示发送接收短信的手机号码,body表示短信内容

布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 
xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<TextView
    android:id="@+id/sms"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="读取到系统信息如下:"
    android:textSize="26sp"
    android:visibility="gone" />

<TextView
    android:id="@+id/des"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_below="@+id/sms"
    android:layout_marginTop="25dp"
    android:textColor="#000" />

<Button
    android:id="@+id/btnSearch"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:layout_alignParentBottom="true"
    android:layout_marginBottom="25dp"
    android:text="查看短信" />
</RelativeLayout>

创建系统信息类SmsInfo

package com.fangkuai.readmsg;

public class SmsInfo {
private int _id; //短信主键
private String address; //发送地址
private String body; //短信内容

public SmsInfo(int _id, String address, String body) {
    this._id = _id;
    this.address = address;
    this.body = body;
}

public int get_id() {
    return _id;
}

public void set_id(int _id) {
    this._id = _id;
}

public String getAddress() {
    return address;
}

public void setAddress(String address) {
    this.address = address;
}

public String getBody() {
    return body;
}

public void setBody(String body) {
    this.body = body;
}

}

界面交互代码

package com.fangkuai.readmsg;

import android.Manifest;
import android.content.ContentResolver;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

private TextView sms;
private TextView des;
private Button btnSearch;
private List<SmsInfo> list;
private String text="";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initView();

}

private void initView() {
    sms = (TextView) findViewById(R.id.sms);
    des = (TextView) findViewById(R.id.des);
    btnSearch = (Button) findViewById(R.id.btnSearch);
    list=new ArrayList<SmsInfo>();
    btnSearch.setOnClickListener(this);
}

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.btnSearch:
            ActivityCompat.requestPermissions(MainActivity.this,
                    new String[]{Manifest.permission.READ_SMS},1);
            break;
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode==1){
        for (int i = 0; i < permissions.length; i++) {
            if (grantResults[i]== PackageManager.PERMISSION_GRANTED){
                getSms();
            }else {
                Toast.makeText(MainActivity.this,permissions[i]+"权限申请失败",Toast.LENGTH_SHORT).show();
            }
        }
    }

}

private void getSms() {
    Uri uri=Uri.parse("content://sms");                 //获取系统信息的uri
    ContentResolver resolver=getContentResolver();
    Cursor cursor=resolver.query(uri,new String[]{"_id","address","body"},null,
            null,null);
    if (cursor!=null&&cursor.getCount()>0){
        sms.setVisibility(View.VISIBLE);
        if (list!=null) list.clear();           //清除集合中的数据
        text="";                                //清空text的原有数据
        while (cursor.moveToNext()) {
            int _id = cursor.getInt(0);
            String address = cursor.getString(1);
            String body = cursor.getString(2);
            SmsInfo smsInfo=new SmsInfo(_id,address,body);
            list.add(smsInfo);
        }
        cursor.close();
    }
    for (int i = 0; i <list.size() ; i++) {
        text +="手机号码:"+list.get(i).getAddress()+"\n短信内容:"+list.get(i).getBody()+"\n\n";
        des.setText(text);

    }
}

}

最后在AndroidMainfest.xml中添加读取系统短信的权限

当点击“查看短信”按钮时,弹出权限请求对话框提示,点击“ALLOW”显示界面效果

在这里插入图片描述
在这里插入图片描述

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值