我正在使用android上的geofences,它在大多数手机上运行良好, 但是对于其中一些,它只是不起作用(在我的错误日志中显示“geofences not available”)。
部分用户未启用Google Play服务的位置跟踪功能。 我认为这就是地理围栏无法在手机上运行的原因。 (右?)
现在我想要一种检测方法。 (告知用户并最终向他们展示如何修复它) 我知道有一种方法可以知道谷歌播放服务是否可用(我已经这样做了),但这并没有说明是否启用了位置服务。
我知道我可以在添加或删除地理围栏时检查它,但它有一个错误代码(地理围栏不可用Location Status Codes),但这还不够。 某些用户在添加地理围栏后禁用了位置服务。然后我无法知道这一点,我的应用程序将无法正常工作。 (抱怨用户等)。 至少我必须在用户打开应用程序时通知用户检查错误。
有人知道如何做到这一点吗? 我现在能做的最好的事情是在应用程序启动时添加和移除虚拟地理围栏,但必须有更好的方法吗?
编辑: 我用一个有问题的设备测试它,删除应用程序并重新安装似乎解决了问题。 我在第一次开机时没有做任何特别的事情,所以这真的很奇怪。 看起来谷歌播放服务连接存在问题,重新安装该应用程序会对这些服务做一些特别的事情。 这可能吗?连接它们时没有错误,但是当我尝试设置地理围栏时就会出现错误(见上文)。
答案 0 :(得分:6)
如果GPS提供商或网络提供商因任何原因被禁用,地理围栏将被禁用(和未注册)。这将导致您的onAddGeofencesResult()
被调用,状态代码为error(1000)。你可以在那里检测到它。
或者,您通过实现响应android.location.PROVIDERS_CHANGED
而调用的Receiver来检测到这一点。请记住将接收器添加到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....
}
:
:
:
}