我正在尝试构建一些位置应用程序,主要问题是准确性数据(不确定getAccuracy()是否可用于测量错误)。我在论坛上阅读,看到一些帖子的准确度约为5-10,但对我而言始终约为30mts。
当前,我正在使用融合位置提供者客户端,不需要此功能的API密钥吗?已启用Wifi搜索,否则会跳到300〜另一件事,我来自美国南部,可能只是我所在地区的更多错误。
public class MainActivity extends AppCompatActivity {
private FusedLocationProviderClient cliente;
private LocationRequest locationRequest;
private LocationCallback locationCallback;
@Override
protected void onCreate(Bundle savedInstanceState) {
locationRequest = new LocationRequest();
locationRequest.setInterval(5000);
locationRequest.setFastestInterval(3000);
locationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
gps_bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (gps_bt.isChecked()) {
sensor.setText("GPS");
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
} else {
sensor.setText("Torre celular y wifi");
locationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
}
}
});
upd_bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (upd_bt.isChecked()) {
actualizacion.setText("Encendidas");
actualizar = true;
empezarActualizacion();
} else {
actualizacion.setText("Apagadas");
actualizar = false;
detenerActualizacion();
}
}
});
locationCallback = new LocationCallback() {
@Override
public void onLocationResult(LocationResult locationResult) {
super.onLocationResult(locationResult);
for (Location location : locationResult.getLocations()) {
latitud.setText(String.valueOf(location.getLatitude()));
longitud.setText(String.valueOf(location.getLongitude()));
precision.setText(String.valueOf(location.getAccuracy()));
if (location.hasAltitude()) {
altitud.setText(String.valueOf(location.getAltitude()));
} else {
altitud.setText("No se pudo colectar la altitud");
}
if (location.hasSpeed()) {
velocidad.setText(String.valueOf(location.getSpeed()) + "m/s");
} else {
velocidad.setText("No se puede recuperar la velocidad");
}
}
}
};
cliente = LocationServices.getFusedLocationProviderClient(this);
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
cliente.getLastLocation().addOnSuccessListener(this, new OnSuccessListener<Location>() {
@Override
public void onSuccess(Location location) {
if (location != null) {
latitud.setText(String.valueOf(location.getLatitude()));
longitud.setText(String.valueOf(location.getLongitude()));
precision.setText(String.valueOf(location.getAccuracy()));
if (location.hasAltitude()) {
altitud.setText(String.valueOf(location.getAltitude()));
} else {
altitud.setText("No se pudo colectar la altitud");
}
if (location.hasSpeed()) {
velocidad.setText(String.valueOf(location.getSpeed()) + "m/s");
} else {
velocidad.setText("No se puede recuperar la velocidad");
}
}
}
});
} else {
//pedir permisos
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, PERMISO_FINE_LOCATION);
}
}
}
它总是抛出30mts或更多,并且正如我之前提到的,如果可能的话,我希望达到10mts左右。清单文件带有 FINE_LOCATION 。为了将来使用,这也将适用于电话数据(LTE / 4g / 3g),我是否也必须授予 COARSE_LOCATION 的许可?它为此融合了locationproviderclient的最佳选择?使用卡尔曼可以改善经纬度数据吗?我在三星S8上进行了测试,但是我想从棒棒糖中进行介绍。谢谢大家。
答案 0 :(得分:0)
在智能手机上保持5到10米不变,这仍然是不可能的。因为? 在某些情况下,您可以达到最佳精度,而在大多数情况下则不能。 嵌入在设备中的GNSS芯片外部的元件会增加误差幅度。例如:
但是好news。承诺会更加精确的设备,因为它们将交付支持L5信号的芯片。 L5 signal的工作原理完全不同,并且在设计方面比旧的L1更坚固。
高精度是能耗的主要impact,因此在大多数情况下,您应该很高兴获得20米,10米的精度。