Android接收器忽略NEW_OUTGOING_CALL

时间:2017-03-05 17:10:21

标签: android android-intent broadcastreceiver android-phone-call

我有一个带有intent-filter的Broadcastreceiver来捕获android.intent.action.NEW_OUTGOING_CALL。

我阅读了很多教程,并在这里回答有关处理NEW_OUTGOING_CALL意图的问题,但我无法使这件事有效。 我的目标是记录我的Broadcastreceiver收到的android.intent.action.NEW_OUTGOING_CALL意图。我无法让这件事变得简单。

这是我的代码:

的Manifest.xml

def is_accessible(self):
    if (not login.current_user.is_active or not
            login.current_user.is_authenticated):
        return False
    return True

这是Broadcastreceiver(TestReceiver.java)的代码

<?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。 执行项目主要活动是启动,但是当我尝试拨打或接听电话时没有写入日志。 我在模拟器(Android 7)和Motorola G4手机(Android 6.0)上测试了代码,但没有在logcat上记录任何内容。 我正在使用Android Studio 2.3

我做错了什么?

由于

Vannus

4 个答案:

答案 0 :(得分:1)

解决方案非常简单....在手机上转到设置 - &gt;应用程序选择应用程序并授予电话权 搜索logcat时发现了这个错误

03-05 20:18:57.090 1547-1775 / system_process W / BroadcastQueue:权限拒绝:接收Intent {act = android.intent.action.NEW_OUTGOING_CALL flg = 0x10000010(有额外内容)}到net.vannus.broadcasttest /由于发送者android(uid 1000),.TestReceiver需要android.permission.PROCESS_OUTGOING_CALLS。

答案 1 :(得分:0)

在我的情况下,app已经具有权限,但出于某种原因,当我声明

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

在android.intent.action.NEW_OUTGOING_CALL之后,接收者开始发出新的呼出事件。 声明如下:

 <receiver android:name=".CallReceiver">
        <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>

答案 2 :(得分:0)

来自android Oreo,问题在于&#34;危险&#34;类型权限(其中PROCESS_OUTGOING_CALLS&#34;是一个),在清单中声明然后是不够的。您需要专门提示用户授予此权限。这可以使用此处讨论的框架来完成:

https://developer.android.com/training/permissions/requesting

具体而言,您需要基本上调用&#34; requestPermissions&#34;使用您实际需要的一系列权限,它将要求用户批准它们。

就我个人而言,我觉得它很烦人,但我得到了背后的理由。

答案 3 :(得分:0)

检查权限运行时间

 @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
    }