Permission Denial: reading com.android.provider…
解决 "Permission Denial: reading com.android.provider…当尝试访问短信内容时,出现 Permission Denial: reading com.android.providers.telephony.SmsProvider 错误,通常是由于权限未正确授予导致的。Android 6.0(API 23)及以上版本引入了运行时权限机制,需动态请求权限。
示例错误
java.lang.SecurityException: Permission Denial: reading com.android.providers.telephony.SmsProvider uri content://sms/ requires android.permission.READ_SMS
解决方法
1. 在 AndroidManifest.xml 中声明权限
确保在 AndroidManifest.xml 文件中添加以下权限:
<uses-permission android:name="android.permission.READ_SMS" />
2. 动态请求运行时权限
在 Android 6.0 及以上版本中,仅声明权限不足,还需动态请求。
示例代码:
final private int REQUEST_CODE_ASK_PERMISSIONS = 123;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
if (checkSelfPermission(Manifest.permission.READ_SMS) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.READ_SMS}, REQUEST_CODE_ASK_PERMISSIONS);
return;
}
}
// 权限已授予,执行读取短信操作
Uri uri = Uri.parse("content://sms/");
ContentResolver resolver = getContentResolver();
Cursor cursor = resolver.query(uri, new String[]{"_id", "address", "body", "date"}, null, null, null);
if (cursor != null) {
while (cursor.moveToNext()) {
String address = cursor.getString(1);
String body = cursor.getString(2);
System.out.println("短信来自:" + address + " 内容:" + body);
}
cursor.close();
}
3. 检查权限结果
在 onRequestPermissionsResult 方法中处理用户的授权结果:
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (requestCode == REQUEST_CODE_ASK_PERMISSIONS) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 用户授予权限,继续操作
} else {
// 用户拒绝权限,提示用户
System.out.println("读取短信权限被拒绝");
}
}
}
通过上述步骤,可以有效解决该问题并安全地访问短信内容





