在Android SDK 30及以上版本中,SMS Content provider的访问权限被限制,只能在特定的条件下才能获得访问权限。因此,在尝试从SMS Content provider获取数据时,需要进行更严格的空指针检查。
以下是一个示例,说明如何正确地访问SMS Content provider:
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_SMS)
== PackageManager.PERMISSION_GRANTED) {
Cursor cursor = getContentResolver().query(Telephony.Sms.CONTENT_URI,
null, null, null, null);
if (cursor != null && cursor.moveToFirst()) {
do {
// 处理短信记录
String address = cursor.getString(cursor.getColumnIndex(Telephony.Sms.ADDRESS));
String body = cursor.getString(cursor.getColumnIndex(Telephony.Sms.BODY));
long date = cursor.getLong(cursor.getColumnIndex(Telephony.Sms.DATE));
} while (cursor.moveToNext());
cursor.close();
}
}
在此示例中,首先使用ContextCompat.checkSelfPermission()检查应用程序是否具有读取SMS的权限。如果有,就可以使用getContentResolver().query()方法从Telephony.Sms.CONTENT_URI中获取SMS记录。然后检查返回的游标是否为空,并逐行处理SMS记录。
在以上代码中,我们可以看到,我们对返回的cursor变量进行了非空检查。这可以帮助我们避免出现“Uri null after null check”错误。