【问题标题】:Permission Denial: requires android.permission.READ_PHONE_STATE权限拒绝:需要 android.permission.READ_PHONE_STATE
【发布时间】:2018-08-23 13:30:18
【问题描述】:

我正在尝试在我的 Android 应用中检测电话,但在接听电话时收到以下消息:

08-23 15:16:04.685  Vodafone VFD 600    Warning 850 BroadcastQueue  Permission Denial: receiving Intent { act=android.intent.action.PHONE_STATE flg=0x10 (has extras) } to com....LogCalls requires android.permission.READ_PHONE_STATE due to sender android (uid 1000)
08-23 15:16:04.549  Vodafone VFD 600    Warning 850 BroadcastQueue  Permission Denial: receiving Intent { act=android.intent.action.PHONE_STATE flg=0x10 (has extras) } to com....LogCalls requires android.permission.READ_PRIVILEGED_PHONE_STATE due to sender android (uid 1000)

我的 AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com...." android:installLocation="preferExternal">
    <uses-sdk android:minSdkVersion="15" android:targetSdkVersion="27" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
  <uses-permission android:name="android.permission.READ_PHONE_STATE" />
  <uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE" />
    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
    <application android:label="myapp" android:icon="@drawable/logo">
    </application>
</manifest>

还有我的广播接收器:

[BroadcastReceiver]
[IntentFilter(new[] {TelephonyManager.ActionPhoneStateChanged,Intent.ActionNewOutgoingCall })]
public class LogCalls : BroadcastReceiver
{
    public override void OnReceive(Context context, Intent intent)
    {
        if (intent.Action == TelephonyManager.ActionPhoneStateChanged)
        {
            Console.WriteLine("state changed");
        }
    }
}

我错过了什么?

【问题讨论】:

    标签: c# android .net


    【解决方案1】:

    首先,不允许第三方应用获取READ_PRIVILEGED_PHONE_STATE权限。见Privileged Permission Whitelisting

    特权应用程序是位于系统映像上 /system/priv-app 目录中的系统应用程序。从历史上看,设备实施者几乎无法控制哪些签名|特权权限可以授予特权应用程序。从 Android 8.0 开始,实现者可以在 /etc/permissions 目录中的系统配置 XML 文件中显式地将特权应用列入白名单。这些 XML 文件中未明确列出的应用不会被授予特权。

    其次,当您的应用在 API 23 及更高版本上运行时,您需要先要求用户在运行时授予您READ_PHONE_STATE 权限,因为它被视为“危险”权限(请参阅Permissions Overview )。

    您需要按照Request App Permissions 的说明在运行时向用户请求权限,并且只有在授予该权限后,您的BroadcastReceiver 才能收到意图。

    【讨论】:

    • 因为错误我添加了READ_PRIVILEGED_PHONE_STATE,但是没问题。请求许可有效,谢谢。
    • 是否可以使用 root 授予此权限?我试过 pm grant $packageName android.permission.READ_PRIVILEGED_PHONE_STATE ,但它没有授予它,即使它工作正常,例如 pm grant $packageName android.permission.PACKAGE_USAGE_STATS
    猜你喜欢
    • 1970-01-01
    • 2019-02-22
    • 2014-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    相关资源
    最近更新 更多