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

Pra*_*sad 63 android android-6.0-marshmallow

我试图调用android.telecom.TelecomManager类的getCallCapablePhoneAccounts()方法.虽然我已经添加了所需的用户权限,但我收到了安全性异常.

这是我得到例外的代码行

List<PhoneAccountHandle> list = getTelecomManager().getCallCapablePhoneAccounts();
Run Code Online (Sandbox Code Playgroud)

清单中添加的用户权限

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
Run Code Online (Sandbox Code Playgroud)

异常堆栈跟踪引起: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)

son*_*368 73

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

Step1:添加AndroidManifest.xml文件

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
Run Code Online (Sandbox Code Playgroud)

第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
}
Run Code Online (Sandbox Code Playgroud)

第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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢你.不要忘记,您还需要确保您的活动`实现ActivityCompat.OnRequestPermissionsResultCallback`. (6认同)
  • 明白了,我忘了这个`private final int REQUEST_READ_PHONE_STATE=1;` (4认同)
  • 正确的包是android.Manifest.permission.READ_PHONE_STATE (3认同)

小智 54

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

  • 错误的答案!我正在运行Android M,但是针对Android L.在这种情况下,它足以在清单中声明权限.对问题的正确答案是声明权限`android.Manifest.permission.READ_PHONE_STATE`而不是`android.permission.READ_PHONE_STATE`. (3认同)
  • @zyamys还不够:如果您定位Android L,则会在安装时自动授予权限,但用户始终可以从系统设置中禁用该权限. (3认同)
  • 这是一个可能的解决方案,我不明白为什么它被downvoted. (2认同)

mrr*_*rrk 8

我在三星设备上遇到了这个问题(其他人很好).就像zyamys在他/她的评论中所建议的那样,我添加了manifest.permission行,但除了代替原始行之外,还有:

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.Manifest.permission.READ_PHONE_STATE" />
Run Code Online (Sandbox Code Playgroud)

我的目标是API 22,所以不需要明确要求权限.