如何在Android Oreo中接收PROVIDERS_CHANGED广播

4
应用程序需要处理地理围栏,以接收“PROVIDERS_CHANGED”广播,因为:
1. 当两个位置提供程序(网络和GPS)都关闭时,已注册的地理围栏将被删除。 2. 当两个位置提供程序中的一个打开时,应用程序需要注册地理围栏才能正常工作。这应该在不要求用户再次运行我的应用程序的情况下完成。
因此,我的应用程序一直在清单中注册其广播接收器。但自从Android Oreo以来,“PROVIDERS_CHANGED”就不能像以前那样起作用了。
我可以在应用程序的活动或服务中为其注册广播接收器,但它迟早会退出(结束其生命周期),然后我需要注销它。我的应用程序通过某些事件(如地理围栏转换)开始工作,但接收“PROVIDERS_CHANGED”对于使其正常工作至关重要。
我验证了在Android Oreo中无法通过在清单中注册的接收器接收“PROVIDERS_CHANGED”。有没有什么解决办法?

有更新吗?有解决方案吗? - Virat18
@Virat18,我找不到解决这个问题的好方法,目前似乎使用闹钟管理器定期检查位置提供程序状态是检测“更改”的唯一方法。 - Tomcat
我也遇到了这个问题。在我的情况下,我只需要知道设置中的位置切换何时打开。不幸的是,我没有找到解决方法。我会继续搜索,并将此帖子收藏起来,如果我找到解决方案,我会告诉你。 - Studio2bDesigns
@Tomcat,你找到解决方案了吗? - k_kumar
1个回答

1

@Tomcat和@Virat18 - 我发现了一种解决方案,可以在Android-Oreo中不再在Manifest中注册Broadcast Receiver来接收PROVIDERS_CHANGED action Intent-filter。 解决方案是仅从代码中动态注册BroadcastReceiver,而不是从Manifest中注册。此外,您应该使用LocationManager.PROVIDERS_CHANGED_ACTION(当然还要导入LocationManager),而不是检查硬编码的正则表达式android.location.PROVIDERS_CHANGED。

这是我用来使其工作的代码示例!(例如:从按钮单击):

public void buttonClick(View view) {

    IntentFilter filter = new IntentFilter();
    filter.addAction("android.location.PROVIDERS_CHANGED");

    BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().matches(LocationManager.PROVIDERS_CHANGED_ACTION)) {
                Log.i(TAG, "Action MATCHES LocationManager.PROVIDERS_CHANGED_ACTION!");
            }
        }
    };

    this.getApplicationContext().registerReceiver(receiver, filter);
    Log.i(TAG, "RECEIVER HAS BEEN REGISTERED");

}

此外,不要忘记在您的代码中适当地注销接收器。

如果您认为这是一个好的解决方案,请将其接受为答案。

愉快的编程!

PS. 即使用户离开您的Activity(按下返回按钮,主页按钮等),它也将继续从后台接收广播。但是,如果用户从多任务按钮关闭您的应用程序,则不再接收广播,请注意这一点。

我的应用程序需要在位置提供者状态更改时得到通知,即使我的应用程序/服务处于非活动状态。我认为Google在Oreo中删除了一种实现这一点的方法。您提供的解决方案对我的情况不够充分。Google可能没有注意到需要在位置提供者重新启动时重新注册地理围栏的应用程序。 - Tomcat
@Tomcat,我提供的示例将告诉您何时位置设置已可用(一旦添加LocationManager代码以检查GPS可用性)。如果为真,则可以(自Oreo以来)使用Google API注册回调以接收位置,即使在后台也是如此(尽管与以前相比受到了更多限制)。 - Studio2bDesigns
1
谢谢您提供的解决方案,但那并不符合我的要求。 - Tomcat
我按照你在答案中提出的建议尝试了,但是代码中甚至没有到达onReceive事件。我使用的是Android compileSdkVersion: 28. buildToolsVersion: 28.0.3. minSdkVersion: 21(用于androidx)。 - Eitan

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