在Oreo中注册静态广播接收器

7
我正在开发一个项目,用于记录呼入和呼出电话,但是在Oreo版本中,静态广播接收器(即在清单文件中注册的广播接收器)无法触发。 如果使用context进行注册,一旦应用程序被杀死,广播也将不再被触发。
我希望广播接收器可以在应用程序关闭后仍然工作。
有没有可能在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>

你能把你的代码粘贴在这里吗? - Shalu T D
它是系统限制的。我认为没有办法避免这种行为。如果你还没有看过,请查看广播限制。如果你正在使用列出的广播之一。 - ADM
@ShaluTD 我已经复制粘贴了代码。 - Jayanth
@ADM 但 Truecaller 应用在我的奥利奥手机上运行良好。它可以显示每通电话结束前和结束后的通话详情。 - Jayanth
是的,这就是我需要的,只有呼叫号码。 - Jayanth
显示剩余3条评论
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权限。

1
PHONE_STATE没有被归类在此处 https://developer.android.com/guide/components/broadcast-exceptions.html,我已经在8.1模拟器上检查过了,即使应用程序没有运行也可以正常工作,但我没有真实设备来测试。 - Heshan Sandeepa
我会给你的答案点赞,一旦我得到完整的解决方案,我就会接受它。 - Jayanth
@Jayanth,你得到这个问题的答案了吗? - Anjali Tripathi
1
我点赞了这个答案,通常当我找到解决方案时就只做这些。但是我想说这个方法对我非常有效,而且我喜欢它的简洁! - Andrew Irwin
同样的问题,广播接收器没有被触发,我没有关闭应用程序,只是切换到主屏幕然后拨打一个号码。我想在调试时在断点处捕获广播。 - Ryan Dooley
显示剩余5条评论

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接