Android 有没有办法获得5-10 mts的恒定精度?

Android 有没有办法获得5-10 mts的恒定精度?,android,gps,fusedlocationproviderclient,Android,Gps,Fusedlocationproviderclient,我正在尝试构建一些定位应用程序,主要问题是准确度数据(不确定getAccurance()测量误差是否可靠)。我在论坛上读到一些帖子,其中的准确度约为5-10,但对我来说,它总是在30毫秒左右 目前,我正在使用fusedlocationproviderclient,我不需要API密钥,对吗?Wifi搜索已启用,否则会跳到300~另外,我来自南美洲,可能只是我所在地区的错误更多 public class MainActivity extends AppCompatActivity { privat

我正在尝试构建一些定位应用程序,主要问题是准确度数据(不确定getAccurance()测量误差是否可靠)。我在论坛上读到一些帖子,其中的准确度约为5-10,但对我来说,它总是在30毫秒左右

目前,我正在使用fusedlocationproviderclient,我不需要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);
        }
    }

}
public类MainActivity扩展了AppCompatActivity{
私人FusedLocationProviderClient客户;
私人位置请求位置请求;
私有位置回调LocationCallback;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
locationRequest=新的locationRequest();
位置请求设置间隔(5000);
locationRequest.SetFastTestInterval(3000);
locationRequest.setPriority(locationRequest.PRIORITY\u BALANCED\u POWER\u Accurance);
gps_bt.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
如果(gps_bt.isChecked()){
sensor.setText(“GPS”);
locationRequest.setPriority(locationRequest.PRIORITY\u高精度);
}否则{
sensor.setText(“Torre celular y wifi”);
locationRequest.setPriority(locationRequest.PRIORITY\u BALANCED\u POWER\u Accurance);
}
}
});
upd_bt.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
如果(upd_bt.isChecked()){
setText(“Encendidas”);
真实=真实;
empezarcion();
}否则{
setText(“Apagadas”);
现实=错误;
detenerzacion();
}
}
});
locationCallback=新locationCallback(){
@凌驾
public void onLocationResult(LocationResult LocationResult){
super.onLocationResult(定位结果);
对于(位置:locationResult.getLocations()){
latitud.setText(String.valueOf(location.getLatitude());
longitud.setText(String.valueOf(location.getlongitud());
precision.setText(String.valueOf(location.getaccurity());
if(location.hasatitude()){
altitud.setText(String.valueOf(location.getAltitude());
}否则{
altitud.setText(“不在altitud附近”);
}
if(location.hasSpeed()){
velocidad.setText(String.valueOf(location.getSpeed())+“m/s”);
}否则{
velocidad.setText(“无需再次使用velocidad”);
}
}
}
};
cliente=LocationServices.getFusedLocationProviderClient(此);
if(ActivityCompat.checkSelfPermission(this,Manifest.permission.ACCESS\u FINE\u LOCATION)==PackageManager.permission\u已授予){
cliente.getLastLocation().addOnSuccessListener(这是新的OnSuccessListener()){
@凌驾
成功时的公共无效(位置){
如果(位置!=null){
latitud.setText(String.valueOf(location.getLatitude());
longitud.setText(String.valueOf(location.getlongitud());
precision.setText(String.valueOf(location.getaccurity());
if(location.hasatitude()){
altitud.setText(String.valueOf(location.getAltitude());
}否则{
altitud.setText(“不在altitud附近”);
}
if(location.hasSpeed()){
velocidad.setText(String.valueOf(location.getSpeed())+“m/s”);
}否则{
velocidad.setText(“无需再次使用velocidad”);
}
}
}
});
}否则{
//佩迪尔佩尔米索斯酒店
if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.M){
requestPermissions(新字符串[]{Manifest.permission.ACCESS\u FINE\u LOCATION},permisso\u FINE\u LOCATION);
}
}
}

它总是抛出30兆或更多,正如我前面提到的,如果可能的话,我希望达到10兆左右。清单文件的位置很好。对于未来的使用,这也适用于手机数据(LTE/4g/3g)我是否也必须允许粗略定位?它FusedLocation为客户端提供了实现此目的的最佳选择?使用kalman可以改善纵横数据?我在三星S8上进行了测试,但我想从棒棒糖中覆盖。谢谢大家。

在智能手机上保持5到10米的恒定距离,仍然不可能。因为? 在某些情况下,您可以达到最佳的精度,但在大多数情况下不能。 嵌入设备中的全球导航卫星系统芯片外部元件会造成误差幅度。例如:

  • 来自不同来源的自然和人工电磁干扰
  • 全球导航卫星系统芯片上的内部时钟延迟(导致在计算设备与卫星之间的距离时出错)
  • 当时可用的卫星数(当设置优先级时== 定位请求。优先级(高精度)
  • 没有wifi和/或GSM信号(RBS)或质量信号(当 setPriority==定位请求。优先级\平衡\功率\精度)
  • L1信号架构(gnss信号最流行 在当前的智能手机中)
但也有好的方面。这些设备承诺会更精确,因为它们将运送支持L5信号的芯片。 与旧L1相比,其工作方式完全不同,在设计方面更为稳健

高精度对能源消耗有很大影响,所以你应该很高兴t