7

我正在开发一个记录来电和去电的项目,但使用 Oreo 静态广播接收器(在清单中注册的广播接收器)没有被触发。如果我在上下文中注册,一旦应用程序被杀死,广播将不会被触发。

即使应用程序关闭,我也希望广播接收器工作。

有没有办法实现这个奥利奥?或任何其他替代方法来实现这一目标?任何帮助将不胜感激。

我在清单中注册如下代码

<application ...
  ..
    <receiver
            android:name=".PhoneCallReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </receiver>
</application>
4

2 回答 2

7

Oreo 中存在一些广播限制,它不再支持在应用清单中为隐式广播注册广播接收器。NEW_OUTGOING_CALL 就是其中之一,请在此处阅读

您可以将 PHONE_STATE 操作用于您的目的,因为它尚未归类为隐式广播

public class StateReceiver extends BroadcastReceiver {

  @Override
  public void onReceive(Context context, Intent intent) {
   // will trigger at incoming/outgoing call

    try {
        String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
        String incomingNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
        String outgoingNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
    }
    catch (Exception e){
        e.printStackTrace();
    }
  }
}

体现在,

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

您还需要添加并检查 READ_PHONE_STATE 权限

于 2018-04-02T18:21:29.547 回答
3

您可以在这里找到一些隐式广播异常https://developer.android.com/guide/components/broadcast-exceptions和 ACTION_NEW_OUTGOING_CALL 就是其中之一。

我在这里的类似答案:https ://stackoverflow.com/a/51354698/1399483

于 2018-07-16T04:45:46.893 回答