Geofences不可用以及如何处理它

Que*_*tin 4 android google-play-services

我在Android上使用geofences,它在大多数手机上都运行正常,但在其中一些手机上,它只是不起作用(在我的错误日志中显示"geofences not available").

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

现在我想要一种检测方法.(告知用户并最终告诉他们如何修复它)我知道有一种方法可以知道谷歌播放服务是否可用(我已经这样做了),但这并没有说明启用的位置服务或不.

我知道我可以在添加或删除地理栅栏时检查它,它有一个错误代码(地理位置不可用位置状态代码),但这还不够.有些用户添加地理围栏会禁用位置服务.然后我无法知道这一点,我的应用程序将无法正常工作.(抱怨用户等).至少我必须在用户打开应用程序时通知用户检查错误.

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

编辑:我用一个有问题的设备测试它,删除应用程序并重新安装似乎解决了问题.我在第一次开机时没有做任何特别的事情,所以这真的很奇怪.看起来谷歌播放服务连接存在问题,重新安装该应用程序会对这些服务做一些特别的事情.这可能吗?连接它们时没有错误,但是当我尝试设置地理围栏时(见上文).

小智 6

如果GPS提供商或网络提供商因任何原因被禁用,地理围栏将被禁用(和未注册).这将导致您onAddGeofencesResult()的状态代码为错误(1000).你可以在那里检测到它.

或者,您通过实现响应来调用的Receiver来检测到这一点android.location.PROVIDERS_CHANGED.记得将接收器添加到AndroidManifest

<receiver android:name=".service.GeofenceProvidersChangedBroadcastReceiver">
    <intent-filter>
        <action android:name="android.location.PROVIDERS_CHANGED"/>
    </intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)

在接收器实现上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....
    }

    :
    :
    :

}
Run Code Online (Sandbox Code Playgroud)