Я пытаюсь создать некоторые приложения для определения местоположения, и основная проблема заключается в точности данных (не уверен, что getAccuracy () надежен для измерения ошибки). Я прочитал в форуме, и я увидел сообщение, в котором точность была около 5-10, но для меня это всегда около 30 МТС.
В настоящее время я использую fusedlocationproviderclient, мне не нужен ключ API для этого права? Поиск Wi-Fi включен, в противном случае он переходит на 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);
}
}
}
Он всегда выбрасывает 30 метров или больше, и, как я уже говорил, я хотел бы достичь около 10 метров, если это возможно. Файл манифеста имеет значение FINE_LOCATION . Для использования в будущем это также будет работать с данными телефона (LTE / 4g / 3g). Должен ли я дать разрешение на COARSE_LOCATION ? Это fusedlocationproviderclient лучший вариант для этой цели? Использование Кальмана может улучшить широту / долготу данных? Я сделал тест на Samsung S8, но я хотел бы прикрыть леденец. Спасибо всем.