如何提高地理围栏的精度?

5
我发现地理围栏的精度有问题,因为用户的位置大部分是由手机网络决定的,而这个结果很不准确。我的应用程序使用地理围栏来触发特定地点的操作,当用户进入这些地点时会发生一些事件...我经过测试确认我的应用程序可以正常工作,因为当我打开谷歌地图时,位置的准确性得到了提高,然后我的地理围栏被触发。目前我使用的解决方案是使用位置管理器和gps提供者获取每分钟的位置信息,但这似乎会影响电池寿命并会在一段时间后停止工作。我的问题是:是否有办法使地理围栏的精度达到60米?或者是否有任何方法获取用户的精确位置更新?谢谢。

1
您可以同时使用GSM和GPS数据来提高位置检测性能。在此处可以找到通过GPS检测位置的良好示例,https://dev59.com/b-o6XIcBkEYKwwoYSCpJ - Prokash Sarkar
谢谢,但我的应用需要即时触发地理围栏。我不需要每30分钟获取一次位置。 - Turki Alkhateeb
有没有办法使地理围栏精确到60米?这个问题是错误的,因为它仅取决于位置提供者的精度。智能手机中的GPS芯片并不那么好。但60米是很差的。许多手机可以做到15米或更少。 - greenapps
1个回答

2

通过跟随此线程,您将对准确性有更好的了解:

如何使Android中的地理围栏警报更准确

创建地理围栏后,您可以开始不断地对GPS进行ping直到获取ENTER转换。我尝试了这种方法,并获得了更好的准确性。

简单地创建一个服务来ping GPS:

public class GPSService extends Service implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener {

GoogleApiClient mGoogleApiClient;
LocationRequest locationRequest;

public GPSService() {
}

@Override
public IBinder onBind(Intent intent) {
    // TODO: Return the communication channel to the service.
    throw new UnsupportedOperationException("Not yet implemented");
}

@Override
public void onCreate() {
    super.onCreate();


    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addApi(LocationServices.API)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .build();

    mGoogleApiClient.connect();


}

@Override
public void onLocationChanged(Location location) {


    Utility.ReadAndWriteData(this, Utility.readFileName(this), "Still Geofence is not triggered!!!");

}

@Override
public void onConnected(Bundle bundle) {

    locationRequest = LocationRequest.create();
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    locationRequest.setFastestInterval(1000);
    locationRequest.setInterval(2000);
    LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,locationRequest,this);

}

@Override
public void onConnectionFailed(ConnectionResult connectionResult) {

}

@Override
public void onConnectionSuspended(int i) {

}

@Override
public void onDestroy() {
    super.onDestroy();

    if(mGoogleApiClient.isConnected()) {

        LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);

    }
} 

@Dev:实际上,您只需要在当前地理围栏触发“进入”转换之前对GPS进行ping。因此,在创建地理围栏的代码后,您将开始ping您的GPS。一旦您获得“进入”转换,您必须停止ping它。就是这样。正如您所提到的,60米半径在地理围栏的情况下非常少,因此,如果您可以将其增加至至少500米,那么您将获得更好的结果,因为在较小的半径内无法跟踪转换。 - Jai
如果用户进入另一个地理围栏怎么办?在这种情况下,应用程序将无法工作,因为我注册了20个靠近用户位置的地理围栏。 - Turki Alkhateeb
最后一个问题,我更喜欢启动服务而不是绑定它们...这个服务会被杀死吗?因为我正在使用GPS提供程序的位置管理器,但它在一段时间后被杀死了。 - Turki Alkhateeb
@开发者: 使用FusedLocationAPI而不是Location Manager,因为你只需要获取lastknownlocation。另外这也是我之前只使用服务进行ping的原因,这样你可以随时轻松启动和停止。 - Jai
1
你好 @Jai,我今天要试一下 :) - Rahul Upadhyay
显示剩余7条评论

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