用户10102和当前进程都没有android.permission.READ_PHONE_STATE

我正在尝试调用android.telecom.TelecomManager类的getCallCapablePhoneAccounts()方法。 虽然我已经添加了所需的用户权限,但我正在获取安全性exception

这里是我得到例外的代码行

List<PhoneAccountHandle> list = getTelecomManager().getCallCapablePhoneAccounts(); 

清单中添加了用户权限

 <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 

exceptionstacktrace导致:java.lang.SecurityException:getDefaultOutgoingPhoneAccount:用户10102或当前进程都没有android.permission.READ_PHONE_STATE。 在android.os.Parcel.readException(Parcel.java:1599)at android.os.Parcel.readException(Parcel.java:1552)at com.android.internal.telecom.ITelecomService $ Stub $ Proxy.getDefaultOutgoingPhoneAccount(ITelecomService.java :615)at android.telecom.TelecomManager.getDefaultOutgoingPhoneAccount(TelecomManager.java:439)

你正在运行Android M吗? 如果是这样,这是因为在清单中声明权限是不够的。 对于某些权限,您必须在运行时显式询问用户: http : //developer.android.com/training/permissions/requesting.html

在Android> = 6.0上,我们必须请求权限运行时。

第一步:添加AndroidManifest.xml文件

 <uses-permission android:name="android.permission.READ_PHONE_STATE"/> 

第二步:请求权限。

  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 } 

第三步:请求权限时处理callback。

 @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; } } 

编辑:在这里阅读官方指南在运行时请求权限

我在三星设备上遇到这个问题(对其他人很好)。 像zyamys在他/她的评论中所build议的那样,我添加了manifest.permission行,但除了而不是原始行之外,所以:

 <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.Manifest.permission.READ_PHONE_STATE" /> 

我针对API 22,所以不需要明确要求权限。