Android 查询短信数据库内容

引言

在Android开发中,有时需要查询设备上的短信数据库,以获取发送或接收的短信内容。短信数据库存储了设备上所有的短信记录,包括发送者、接收者、时间、内容等信息。本文将介绍如何通过代码查询Android短信数据库,并展示查询结果的示例代码。

简介

短信数据库是Android系统中的一个隐私数据库,存储了所有短信的详细信息。访问短信数据库需要特定的权限,即READ_SMS权限。在Android 6.0及以上版本,还需要动态请求权限。通过查询短信数据库,我们可以获取到短信的发送者、接收者、发送时间、短信内容等信息。

查询短信数据库

要查询短信数据库,首先需要在AndroidManifest.xml文件中添加读取短信的权限:

<uses-permission android:name="android.permission.READ_SMS" />

然后,在代码中动态请求读取短信的权限。这里以使用EasyPermissions库进行权限请求为例:

// 请求读取短信权限的请求码
private static final int READ_SMS_PERMISSION_REQUEST_CODE = 1;

// 请求读取短信权限
private void requestReadSmsPermission() {
    String[] permissions = {Manifest.permission.READ_SMS};
    if (EasyPermissions.hasPermissions(this, permissions)) {
        // 已经获取到权限,执行查询短信数据库的操作
        querySmsDatabase();
    } else {
        // 未获取到权限,发起权限请求
        EasyPermissions.requestPermissions(this, "需要读取短信的权限", READ_SMS_PERMISSION_REQUEST_CODE, permissions);
    }
}

// 接收权限请求结果
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
}

// 权限请求成功回调
@Override
public void onPermissionsGranted(int requestCode, List<String> perms) {
    if (requestCode == READ_SMS_PERMISSION_REQUEST_CODE) {
        // 权限请求成功,执行查询短信数据库的操作
        querySmsDatabase();
    }
}

// 权限请求失败回调
@Override
public void onPermissionsDenied(int requestCode, List<String> perms) {
    if (requestCode == READ_SMS_PERMISSION_REQUEST_CODE) {
        // 权限请求失败,弹出提示框
        new AlertDialog.Builder(this)
                .setTitle("权限请求失败")
                .setMessage("请在设置中授予应用读取短信的权限")
                .setPositiveButton("确定", null)
                .show();
    }
}

// 查询短信数据库
private void querySmsDatabase() {
    // 构造查询短信的Uri
    Uri uri = Uri.parse("content://sms/");
    
    // 查询短信数据库
    Cursor cursor = getContentResolver().query(uri, null, null, null, null);

    if (cursor != null && cursor.moveToFirst()) {
        do {
            // 读取短信的发送者、接收者、时间、短信内容等信息
            String address = cursor.getString(cursor.getColumnIndex("address"));
            String body = cursor.getString(cursor.getColumnIndex("body"));
            long date = cursor.getLong(cursor.getColumnIndex("date"));

            // 处理查询结果
            // ...
        } while (cursor.moveToNext());
        
        // 关闭Cursor
        cursor.close();
    }
}

通过以上代码,我们可以查询到短信数据库中的所有短信记录。在查询结果处理的部分,可以根据具体需求进行进一步处理,比如展示短信列表、保存短信到本地等。

示例代码

下面是一个简单的示例代码,展示如何查询短信数据库并展示查询结果。

public class SmsQueryActivity extends AppCompatActivity {

    private TextView smsTextView;

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

        smsTextView = findViewById(R.id.sms_text_view);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            requestReadSmsPermission();
        } else {
            querySmsDatabase();
        }
    }

    // 查询短信数据库
    private void querySmsDatabase() {
        // 构造查询短信的Uri
        Uri uri = Uri.parse("content://sms/");

        // 查询短信数据库
        Cursor cursor = getContentResolver().query(uri, null, null, null, null);

        if