权限拒绝:需要android.permission.READ_PHONE_STATE权限

5

我正在尝试在我的安卓应用程序中检测电话呼叫,但是当接收到电话时,我收到以下消息:

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");
        }
    }
}

我错过了什么?

1个回答

9

首先,第三方应用程序不被允许获取READ_PRIVILEGED_PHONE_STATE权限。请参阅特权权限白名单

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

其次,在API 23及以上版本上运行您的应用程序时,您需要首先要求用户在运行时授予您READ_PHONE_STATE权限,因为它被认为是一项“危险”的权限(请参见权限概述)。

您需要遵循请求应用程序权限的说明,以在运行时从用户那里请求权限,并且只有在该权限被授予后,您的BroadcastReceiver才能接收到意图。


1
我因为那个错误添加了READ_PRIVILEGED_PHONE_STATE,但是好的。请求权限可以正常工作,谢谢。 - Entretoize
2
有没有可能使用root授予权限? 我尝试了 pm grant $packageName android.permission.READ_PRIVILEGED_PHONE_STATE,但它并没有授予该权限,即使对于 pm grant $packageName android.permission.PACKAGE_USAGE_STATS 正常工作。 - android developer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接