【问题标题】:Geofences not available and how to handle it地理围栏不可用以及如何处理
【发布时间】:2016-09-11 01:22:01
【问题描述】:

我正在使用 android 上的地理围栏,它在大多数手机上都可以正常工作, 但在其中一些上,它只是不起作用(在我的错误日志中显示“地理围栏不可用”)。

有些用户没有为 Google Play 服务启用位置跟踪。 我认为这就是地理围栏无法在他们的手机上运行的原因。 (对吧?)

现在我想要一种检测方法。 (通知用户并最终向他们展示如何修复它) 我知道有一种方法可以知道 google play 服务是否可用(我已经这样做了),但这并没有说明位置服务是否启用。

我知道我可以在添加或删除地理围栏时检查它,它有一个错误代码(地理围栏不可用Location Status Codes),但这还不够。 一些用户在添加地理围栏后禁用了定位服务。然后我无法知道这一点,我的应用程序将无法运行。 (抱怨用户等)。 至少我必须在用户打开应用时通知他们以检查问题所在。

有人知道如何做到这一点吗? 我现在能做的最好的事情就是在应用启动时添加和删除一个虚拟地理围栏,但必须有更好的方法吗?

编辑: 我用有问题的设备对其进行了测试,删除应用程序并重新安装似乎可以解决问题。 我在第一次启动时没有做任何特别的事情,所以这真的很奇怪。 谷歌播放服务连接似乎存在问题,并且重新安装应用程序对这些服务有一些特殊的作用。 这可能吗?连接到它们时不会出错,但是当我尝试设置地理围栏时会出错(见上文)。

【问题讨论】:

    标签: android google-play-services


    【解决方案1】:

    如果 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....
        }
    
        :
        :
        :
    
    }
    

    【讨论】:

    • 我的错误实际上是两件事的结合:上面的答案(一些用户没有启用传感器),而且如果用户强制退出应用程序(在应用程序切换器中滑动)菜单),地理围栏被删除
    • 这不适用于 Android O per this documentation“因为以 Android 8.0 或更高版本为目标的应用程序无法再在其清单中为隐式广播注册广播接收器。”请参阅my answer to a related post
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    • 2015-11-07
    相关资源
    最近更新 更多