Android接收器忽略新的\u传出\u呼叫

Android接收器忽略新的\u传出\u呼叫,android,android-intent,broadcastreceiver,android-phone-call,Android,Android Intent,Broadcastreceiver,Android Phone Call,我有一个带有意图过滤器的广播接收器,用于捕捉android.intent.action.NEW\u传出的呼叫 我阅读了很多教程,并在这里回答了关于处理新的呼出呼出意图的问题,但我无法使这件事起作用。 我的目标是记录Broadcastreceiver接收到的intent android.intent.action.NEW_OUTGOING_呼叫。我无法使这件简单的事情起作用 这是我的密码: Manifest.xml <?xml version="1.0" encoding="utf-8"?&

我有一个带有意图过滤器的广播接收器,用于捕捉android.intent.action.NEW\u传出的呼叫

我阅读了很多教程,并在这里回答了关于处理新的呼出呼出意图的问题,但我无法使这件事起作用。 我的目标是记录Broadcastreceiver接收到的intent android.intent.action.NEW_OUTGOING_呼叫。我无法使这件简单的事情起作用

这是我的密码:

Manifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="net.vannus.broadcasttest">

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <receiver android:name=".TestReceiver">
            <intent-filter>
                <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.PHONE_STATE" />
            </intent-filter>
        </receiver>
    </application>

</manifest>
该项目还包含一个空的MainActivity,没有任何功能。 执行项目主要活动是启动,但当我尝试拨打或接听电话时,不会写入日志。 我在模拟器(安卓7)和摩托罗拉G4手机(安卓6.0)上测试了代码,但logcat上没有任何记录。 我正在使用Android Studio 2.3

我做错了什么

谢谢


Vannus

解决方案非常简单。。。。在手机上,进入设置->应用程序,选择应用程序并授予手机权限。 在搜索logcat时发现了线索我发现了这个错误


03-05 20:18:57.090 1547-1775/system_process W/BroadcastQueue:权限拒绝:接收意图{act=android.Intent.action.NEW_OUTGOING_CALL flg=0x1000010(有额外功能)}到net.vannus.broadcasttest/.TestReceiver需要android.Permission.process_OUTGOING_CALLS由于发送方安卓(uid 1000)的原因而产生的呼叫。

,应用程序已经有了权限,但由于某种原因,当我声明

<intent-filter>
            <action android:name="android.intent.action.PHONE_STATE" />
        </intent-filter


android Oreo的问题在于,对于“危险”类型的权限(其中PROCESS_OUTGOING_CALLS是其中之一),仅在清单中声明是不够的。您需要特别提示用户授予此权限。这可以使用下面讨论的框架来完成:

具体来说,您需要使用实际需要的权限数组基本上调用“requestPermissions”,它将要求用户批准这些权限


就我个人而言,我觉得这很烦人,但我明白了背后的道理。

检查权限运行时间

 @TargetApi(Build.VERSION_CODES.M)
public static boolean hasSelfPermission(Activity activity, String[] permissions) {
    // Below Android M all permissions are granted at install time and are already available.
    if (!isMNC()) {
        return true;
    }

    // Verify that all required permissions have been granted
    for (String permission : permissions) {
        if (activity.checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
            return false;
        }
    }
    return true;
}
并使用此方法检查权限

@TargetApi(Build.VERSION_CODES.M)
private boolean isReadStatePermission() {
    if (hasSelfPermission((Activity) context, READ_PHONE_STATE)) {
        return true;
    } else {
        if (((Activity) context).shouldShowRequestPermissionRationale(Manifest.permission.READ_PHONE_STATE)) {
            ((Activity) context).requestPermissions(READ_PHONE_STATE, REQUEST_WRITE_STORAGE);
        } else {
            ((Activity) context).requestPermissions(READ_PHONE_STATE, REQUEST_WRITE_STORAGE);
        }
        return false;
    }
检查权限后执行任何操作

  if (isReadStatePermission()) {
        PERFROM YOUR OPERATION
    }
@TargetApi(Build.VERSION_CODES.M)
private boolean isReadStatePermission() {
    if (hasSelfPermission((Activity) context, READ_PHONE_STATE)) {
        return true;
    } else {
        if (((Activity) context).shouldShowRequestPermissionRationale(Manifest.permission.READ_PHONE_STATE)) {
            ((Activity) context).requestPermissions(READ_PHONE_STATE, REQUEST_WRITE_STORAGE);
        } else {
            ((Activity) context).requestPermissions(READ_PHONE_STATE, REQUEST_WRITE_STORAGE);
        }
        return false;
    }
  if (isReadStatePermission()) {
        PERFROM YOUR OPERATION
    }