我正在尝试调用 android.telecom.TelecomManager 类的 getCallCapablePhoneAccounts() 方法。虽然我添加了必需的用户权限,但我收到安全例外。
这是我得到异常的代码行
List<PhoneAccountHandle> list = getTelecomManager().getCallCapablePhoneAccounts();
在清单
中添加了用户权限<uses-permission android:name="android.permission.READ_PHONE_STATE" />
异常堆栈跟踪 引起:java.lang.SecurityException:getDefaultOutgoingPhoneAccount:既不是用户10102也不是当前进程 有android.permission.READ_PHONE_STATE。 在android.os.Parcel.readException(Parcel.java:1599) 在android.os.Parcel.readException(Parcel.java:1552) 在com.android.internal.telecom.ITelecomService $ Stub $ Proxy.getDefaultOutgoingPhoneAccount(ITelecomService.java:615) 在android.telecom.TelecomManager.getDefaultOutgoingPhoneAccount(TelecomManager.java:439)
答案 0 :(得分:69)
在Android&gt; = 6.0上,我们必须请求权限运行时。
Step1:添加AndroidManifest.xml文件
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
第2步:请求权限。
int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE);
if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE}, REQUEST_READ_PHONE_STATE);
} else {
//TODO
}
步骤3:请求权限时处理回调。
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case REQUEST_READ_PHONE_STATE:
if ((grantResults.length > 0) && (grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
//TODO
}
break;
default:
break;
}
}
修改强> 阅读官方指南Requesting Permissions at Run Time
答案 1 :(得分:54)
你在运行Android M吗?如果是这样,这是因为它不足以在清单中声明权限。对于某些权限,您必须在运行时明确询问用户:http://developer.android.com/training/permissions/requesting.html
答案 2 :(得分:7)
我在三星设备上遇到了这个问题(其他人很好)。比如 zyamys 在他/她的评论中建议,我添加了manifest.permission行,但除了代替原始行之外,所以:
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.Manifest.permission.READ_PHONE_STATE" />
我的目标是API 22,所以不需要明确要求权限。