1

我有一个带有意图过滤器的广播接收器来捕获 android.intent.action.NEW_OUTGOING_CALL。

我阅读了许多关于处理 NEW_OUTGOING_CALL 意图的教程并在此处回答,但我无法使这件事起作用。我的目标是记录我的 Broadcastreceiver 收到的意图 android.intent.action.NEW_OUTGOING_CALL。我无法让这个简单的事情奏效。

这是我的代码:

清单.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>

这是广播接收器的代码(TestReceiver.java)

package net.vannus.broadcasttest;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class TestReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent)
    {
        Log.w("###TEST###",intent.getAction());
    }
}

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

我究竟做错了什么?

谢谢

瓦努斯

4

4 回答 4

2

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

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

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

我个人觉得这很烦人,但我明白它背后的理由。

于 2018-05-23T12:14:38.960 回答
1

就我而言,应用程序已经拥有权限,但是由于某种原因,当我宣布

<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>
于 2018-05-01T02:16:40.487 回答
1

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

03-05 20:18:57.090 1547-1775/system_process W/BroadcastQueue: Permission Denial: 接收 Intent { act=android.intent.action.NEW_OUTGOING_CALL flg=0x10000010 (has extras) } 到 net.vannus.broadcasttest/.TestReceiver 需要android.permission.PROCESS_OUTGOING_CALLS 由于发件人 android (uid 1000)。

于 2017-03-07T23:01:16.667 回答
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
    }
于 2018-05-23T12:18:51.910 回答