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


70

我正在尝试调用android.telecom.TelecomManager类的getCallCapablePhoneAccounts()方法。尽管我已经添加了必需的用户权限,但是却遇到了Security exception

这是我遇到异常的代码行

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

清单中添加了用户权限

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

异常stacktrace引起原因: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)


1
您在清单中添加了什么?
安德鲁·布鲁克

尝试清理并重建。如果没有,删除权限并重新添加它理应修复的东西:stackoverflow.com/questions/12778168/...
克里斯·史迪威

<uses-permission android:name =“ android.permission.READ_PHONE_STATE” />已添加在清单中
Prasad

尝试进行清洁,重建,但问题仍然存在
Prasad

3
看来这是一些问题与版本的Android M code.google.com/p/android-developer-preview/issues/...
Rusheel耆那

Answers:


78

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

步骤1:添加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;
    }
}

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


6
谢谢你 别忘了,您还需要确保自己的活动implements ActivityCompat.OnRequestPermissionsResultCallback
ban-geoengineering

@ ban-
geoengineering

3
正确的软件包是android.Manifest.permission.READ_PHONE_STATE
SalmanShariati

我在小米Mi 4i操作系统版本:5.0.2上收到此错误,该怎么办?
b devloper

2
知道了,我忘记了这一点private final int REQUEST_READ_PHONE_STATE=1;
phrogg

54

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


2
这是一种可能的解决方案,我不明白为什么它被否决了。
Vedavyas Bhat 2015年

1
是的,你是对的。在android M上,这是解决方案+1 :)
Mohammad

3
错误的答案!我正在运行Android M,但以Android L为目标。在这种情况下,足以在清单中声明权限。问题的正确答案是声明允许android.Manifest.permission.READ_PHONE_STATE而不是android.permission.READ_PHONE_STATE
zyamys 17-4-26的

3
@zyamys还不够:如果您以Android L为目标,则在安装时会自动授予该权限,但用户始终可以从系统设置中将其禁用。
manfcas '17

9

我在三星设备上遇到此问题(在其他设备上很好)。就像zyamys在他/她的评论中建议的那样,我添加了manifest.permission行,但是除了原始行之外,它还包括以下内容:

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

我的目标是API 22,因此无需明确要求权限。


我在三星设备上遇到了一个非常相似的问题。您找到解决方案了吗?
Mattia Campana
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.