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

时间:2015-09-23 14:27:45

标签: android android-6.0-marshmallow

我正在尝试调用 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)

3 个答案:

答案 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,所以不需要明确要求权限。