地理围栏不可用及如何处理

4
我正在使用安卓的地理围栏功能,大多数手机上都能正常工作,但在一些手机上无法正常工作(我的错误日志中显示“地理围栏不可用”)。我认为这是因为有些用户没有启用 Google Play 服务的位置跟踪功能。现在我想要一种方法来检测这个问题(通知用户并最终向他们展示如何解决它)。我知道有一种方法可以知道 Google Play 服务是否可用(我已经这样做了),但这并不能说明位置服务是否已启用。我知道我可以在添加或删除地理围栏时检查它(有一个错误代码叫做“地理围栏不可用”,请参考位置状态码),但这还不够。有些用户在添加地理围栏后会禁用位置服务,那么我就无法得知此情况,我的应用程序也将无法工作。至少我必须在用户打开应用程序时通知他们检查问题所在。有人有什么好的想法吗?目前我能做的最好的方法是在应用启动时添加和删除一个虚拟的地理围栏,但一定会有更好的方法吧?编辑:我用有此问题的设备进行了测试,卸载应用程序并重新安装似乎可以解决问题。我在第一次启动时没有做任何特殊的操作,所以这真的很奇怪。看起来似乎是与 Google Play 服务连接有问题,而重新安装应用程序会对这些服务进行某种特殊处理。这可能吗?连接到这些服务时没有出现任何错误,但当我尝试设置地理围栏时出现了错误(请参见上文)。
1个回答

7

如果 GPS 提供程序或网络提供程序由于任何原因而被禁用,那么地理围栏将被禁用(并注销)。这将导致您的onAddGeofencesResult()被调用,并返回错误状态码(1000)。您可以在此处立即检测到此情况。

或者,您可以通过实现一个接收器来检测到这一点,该接收器会在响应android.location.PROVIDERS_CHANGED时被调用。记得将接收器添加到AndroidManifest中。

<receiver android:name=".service.GeofenceProvidersChangedBroadcastReceiver">
    <intent-filter>
        <action android:name="android.location.PROVIDERS_CHANGED"/>
    </intent-filter>
</receiver>

在接收器的实现中,在其onReceive()函数中获取位置管理器并测试提供程序状态:
public class ProvidersChangedBroadcastReceiver extends WakefulBroadcastReceiver {

    :
    :

    @Override
    public void onReceive(Context context, Intent intent) {

        LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

        if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
            // GPS_PROVIDER IS enabled...
        } else {
            // GPS_PROVIDER is NOT enabled...
        }

        if (locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
            // NETWORK_PROVIDER IS enabled...
        } else {
            // NETWORK_PROVIDER is NOT enabled...
        }

        :
        :
        :

        if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) &&
        locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
        // We are good for geofencing as both GPS and Network providers are enabled....
    }

    :
    :
    :

}

我的错误实际上是两个因素的组合:上面的答案(一些用户没有启用传感器),但也是一个事实,如果用户强制退出应用程序(在应用程序切换器菜单中向左滑动),地理围栏将被删除。 - Quentin
根据此文档,从Android O开始,这将无法工作,因为针对Android 8.0或更高版本的应用程序不能再在其清单中注册隐式广播接收器。请参见我对相关帖子的回答 - Michael Krause

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