Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/213.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android GPS定位精度问题_Android_Gps_Tracking - Fatal编程技术网

Android GPS定位精度问题

Android GPS定位精度问题,android,gps,tracking,Android,Gps,Tracking,我正在android上开发gps跟踪应用程序。以下是我的代码体系结构: BackgroundSyncService:用于获取位置更新的服务类。这里初始化了GoogleAppClient并实现了其他与位置相关的方法 AppRunCheckerReceiver:一个BroadcastReceiver类,它将检查myBackgroundSyncService是否在某个时间间隔内运行。如果它停止了,那么它就开始了 GpsEnableReceiver:如果gps状态发生变化,它将触发的广播接收器。它将检查

我正在android上开发gps跟踪应用程序。以下是我的代码体系结构:

  • BackgroundSyncService:用于获取位置更新的服务类。这里初始化了GoogleAppClient并实现了其他与位置相关的方法
  • AppRunCheckerReceiver:一个BroadcastReceiver类,它将检查my
    BackgroundSyncService
    是否在某个时间间隔内运行。如果它停止了,那么它就开始了
  • GpsEnableReceiver:如果gps状态发生变化,它将触发的广播接收器。它将检查my
    BackgroundSyncService
    是否在某个时间间隔内运行。如果它停止了,那么它就开始了
  • InternetConnectionStateReceiver:当internet状态更改时将触发的广播接收器。它将检查my
    BackgroundSyncService
    是否在某个时间间隔内运行。如果停止,则启动
  • 在我的
    BackgroundSyncService
    服务中,我使用以下方式初始化GoogleAppClient:

    public void setLocationLocationRequest() {
    
            try {
                googleApiClient = new GoogleApiClient.Builder(this).addConnectionCallbacks(this)
                        .addOnConnectionFailedListener(this).addApi(com.google.android.gms.location.LocationServices.API).build();
    
                locationRequest = new LocationRequest();
                locationRequest.setInterval(3000);
                locationRequest.setFastestInterval(3000);
                locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
                googleApiClient.connect();
            } catch (Exception e) {
    
        }
    
    这里的精度是定位请求。优先级是高精度,间隔是

    locationRequest.setInterval(3000)
    
    是GoogleAppClient实现代码

    应用程序GPS信息部分包含经纬度和精度参数

    我的发现:
    onLocationChanged(Location-Location)
    方法中,我通过以下方式检查Location对象的准确性:
    Location.getAccurance()
    。在这里,如果精度小于50米,那么我接受它

    在85%的案例中,它就像一个符咒。它从GPS向我发送准确的位置。但在15%的情况下,它会给我发送不准确的位置,比如超过300米

    15%的设备是低成本的中国品牌移动设备

    我的问题:

  • 我怎样才能使准确度接近99%。我的代码架构有问题吗
  • GPS精度是否取决于设备配置?如果是,那么我可以为低配置设备做什么
  • Uber、Go-JEK等骑乘共享应用如何适用于所有设备?他们是否只有GPS的额外编码
  • 我的申请是孟加拉国的。这里的网速很慢。它是否会对GPS精度产生负面影响
    提前感谢你的帖子。同时也为糟糕的英语感到抱歉。

    +1了解相关描述。
    我希望我们能为你的问题找到最好的答案,并且根据我所知,随着时间的推移,答案会变得更好1.这里不会只有一个正确答案

    第一,(第二)

  • 我怎样才能使准确度接近99%。我的代码架构有问题吗

  • GPS精度是否取决于设备配置?如果是,那么我可以为低配置设备做什么

  • 设备配置和代码架构在这里都很重要。如果您已经达到了85%的成功率,那么我认为代码体系结构还可以。
    就GPS而言,在设备配置和精度方面,视线是一个重要因素。 虽然低成本的手机可以返回一个准确的位置和清晰的视线。您可以尝试多运行2个循环/等待以获得更高的精度

    在最坏的情况下,您也可以尝试使用和GPS提供程序技术检索位置,该技术在15%的情况下作为备用方案,以进行比较并确保您使用的位置最准确。 把它当作

    在大多数情况下,你会得到更好的电池性能,以及更多 通过使用定位服务API获得适当的精度

  • Uber、Go-JEK等骑乘共享应用如何适用于所有设备?他们是否只有GPS的额外编码?
    它们确实可以工作,但对于应用程序中接收到的位置,并不总是具有最高的准确度。如果有任何针对美国开发者的定位黑客,我们需要找到他们,也许是第5页的谷歌搜索结果:)或者从开源环境中获益。对我来说,最佳实践和安卓回购链接就足够了。您已经关注过类似的帖子

  • 我的申请是孟加拉国的。这里的网速很慢。对GPS精度有负面影响吗?
    互联网与+

  • 位置更新可以通过以下方式完成:
  • 从GPS获取的位置比从网络获取的位置更精确,因此如果需要精度,请使用GPS

  • 对此我不确定,但我认为这取决于你想要什么类型的位置,比如你想要准确或最快的位置,所以根据这一点选择你的提供商

  • FusedLocation provider是目前在android上获取位置最高效的解决方案,它收集来自不同来源的位置数据,并根据传递的参数,如您希望位置更新的时间、您是否需要高精度等。它为您提供最佳位置

  • 是的,你应该使用FusedLocationProvider在android上获取位置,因为谷歌也推荐使用FusedLocationProvider,这是目前在android上获取位置最有效的方法

  • 你为什么不试着去创造 表示高精度要求的常数-可用于水平、高度、速度或方位精度。对于水平和垂直位置,这大致相当于小于100米的精度

    Android试图掩盖硬件的真实性,但实际上只有两个位置提供商:GPS和网络。GPS定位速度慢,并非所有设备都有,但它是准确的。网络定位速度更快,几乎所有设备都支持,但精确度较低

    谷歌通过

    与融合位置提供程序交互的主要入口点。这些方法必须与GoogleAppClient结合使用


    代码:

    全球定位系统–>(全球定位系统)
     new GoogleApiClient.Builder(context)
             .addApi(LocationServices.API)
             .addConnectionCallbacks(this)
             .addOnConnectionFailedListener(this)
             .build()
    
    public Location getLocation() {
        try {
            locationManager = (LocationManager) mContext
                    .getSystemService(LOCATION_SERVICE);
    
            // getting GPS status
            isGPSEnabled = locationManager
                    .isProviderEnabled(LocationManager.GPS_PROVIDER);
    
            // getting network status
            isNetworkEnabled = locationManager
                    .isProviderEnabled(LocationManager.NETWORK_PROVIDER);
    
            if (!isGPSEnabled && !isNetworkEnabled) {
                // no network provider is enabled
            } else {
                this.canGetLocation = true;
                //here is the if-else change so code avoids falling into both loops
             // if GPS Enabled get lat/long using GPS Services
                if (isGPSEnabled) {
                    if (location == null) {
                        locationManager.requestLocationUpdates(
                                LocationManager.GPS_PROVIDER,
                                MIN_TIME_BW_UPDATES,
                                MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                        Log.d("GPS", "GPS Enabled");
                        if (locationManager != null) {
                            location = locationManager
                                    .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                            if (location != null) {
                                latitude = location.getLatitude();
                                longitude = location.getLongitude();
                            }
                        }
                    }
                } else if (isNetworkEnabled) {
                    locationManager.requestLocationUpdates(
                            LocationManager.NETWORK_PROVIDER,
                            MIN_TIME_BW_UPDATES,
                            MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                    Log.d("Network", "Network Enabled");
                    if (locationManager != null) {
                        location = locationManager
                                .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                        if (location != null) {
                            latitude = location.getLatitude();
                            longitude = location.getLongitude();
                        }
                    }
                }
            }
    
        } catch (Exception e) {
            e.printStackTrace();
        }
    
        return location;
    }