使用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”显示界面效果


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





