【问题标题】:Neither user 10102 nor current process has android.permission.READ_PHONE_STATE用户 10102 和当前进程都没有 android.permission.READ_PHONE_STATE
【发布时间】:2015-12-20 22:24:36
【问题描述】:

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

【问题讨论】:

标签: android android-6.0-marshmallow


【解决方案1】:

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

Step1:添加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
}

Step3:请求权限时处理回调。

@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

【讨论】:

  • 谢谢。别忘了,你还需要确保你的活动implements ActivityCompat.OnRequestPermissionsResultCallback
  • @ban-geoengineering:谢谢
  • 正确的包是android.Manifest.permission.READ_PHONE_STATE
  • 我得到 无法解析符号 REQUEST_READ_PHONE_STATE
  • 知道了,我忘了这个private final int REQUEST_READ_PHONE_STATE=1;
【解决方案2】:

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

【讨论】:

  • 这是一种可能的解决方案,我不明白为什么它被否决了。
  • 是的,你是对的。在 android M 上,这是解决方案 +1 :)
  • 错误答案!我正在运行 Android M,但针对的是 Android L。在这种情况下,在清单中声明权限就足够了。该问题的正确答案是声明权限android.Manifest.permission.READ_PHONE_STATE 而不是android.permission.READ_PHONE_STATE
  • @zyamys 这还不够:如果您以 Android L 为目标,安装时会自动授予权限,但用户始终可以从系统设置中禁用它。
【解决方案3】:

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

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

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

【讨论】:

  • 我遇到了一个非常相似的问题,主要是三星设备。你找到解决办法了吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-09
  • 2018-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多