在奥利奥注册静态广播接收器

时间:2018-04-02 15:39:34

标签: android broadcastreceiver android-8.0-oreo android-8.1-oreo

我正在开发一个记录来电和拨出电话的项目, 但使用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>

2 个答案:

答案 0 :(得分:6)

在奥利奥有一些广播限制,它不再支持在应用清单中为隐式广播注册广播接收器。而NEW_OUTGOING_CALL就是其中之一,请阅读here

您可以将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权限

答案 1 :(得分:2)

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

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