当前位置:编程学习 > asp >>

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("读取短信权限被拒绝");
}
}
}

通过上述步骤,可以有效解决该问题并安全地访问短信内容
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,