在 AndroidManifest.xml
中声明必要权限:
<uses-permission android:name="android.permission.READ_SMS" /> <uses-permission android:name="android.permission.SEND_SMS" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-可选,用于备份 -->
从 Android 6.0 开始,需在代码中动态申请敏感权限:
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_SMS) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_SMS}, REQUEST_CODE); }
通过 ContentResolver
操作短信数据库:
// 删除所有短信(慎用!) ContentResolver resolver = getContentResolver(); resolver.delete(Uri.parse("content://sms/"), null, null); // 删除指定条件的短信(例如删除某号码的短信) String whereClause = "address = ?"; String[] args = {"123456789"}; resolver.delete(Uri.parse("content://sms/"), whereClause, args);
参数名称 | 说明 |
---|---|
content://sms/ |
的 ContentProvider URI |
whereClause |
SQL 条件语句(如 "date > ?" 删除指定时间后的短信) |
args |
条件参数数组(与 whereClause 中的占位符一一对应) |
public void deleteAllSMS() { if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_SMS) != PackageManager.PERMISSION_GRANTED) { Toast.makeText(this, "请先授予短信权限", Toast.LENGTH_SHORT).show(); return; } Uri uri = Uri.parse("content://sms/"); int deletedCount = getContentResolver().delete(uri, null, null); // 删除所有短信 Toast.makeText(this, "成功删除 " + deletedCount + " 条短信", Toast.LENGTH_SHORT).show(); }
解答:
安卓系统没有提供官方API直接恢复已删除的短信,恢复可能性取决于以下因素:
content://sms/
导出到文件或云端,可重新导入恢复。解答:
通过构造 whereClause
过滤条件,
// 删除2023年1月1日之前的短信 String where = "date < ?"; String[] args = {String.valueOf(new SimpleDateFormat("yyyymmddkkmmss", Locale.CHINA) .parse("20230101000000").getTime() / 1000)}; getContentResolver().delete(Uri.parse("content://sms/"), where, args);
注意:date
字段单位为毫秒,需转换为秒级时间