从 lastKnownLocation() 获取经度和纬度?

Posted

技术标签:

【中文标题】从 lastKnownLocation() 获取经度和纬度?【英文标题】:Getting longitude and latitude from lastKnownLocation()? 【发布时间】:2020-11-07 06:11:37 【问题描述】:

我有一个 onCreate 活动,它计算您的位置与附近的事件之间的距离,我使用 lastKnownLocation 获取当前设备位置并将其标记在谷歌地图上,但我需要它在计算距离的方法之外写出经度和纬度。

我使用 LocationManager 来获取粗略的坐标,但这些坐标不够准确,而且距离不到半英里的地方有 50 英里的距离。我目前有它,所以会覆盖从 LocationManager 获得的经度和纬度,但它没有。

我也尝试过使用 LocationRequest,但没有帮助。

                    LocationRequest locationRequest = LocationRequest.create();
                    locationRequest.setInterval(60000);
                    locationRequest.setFastestInterval(5000);
                    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
                    LocationCallback locationCallback = new LocationCallback() 
                        @Override
                        public void onLocationResult(LocationResult locationResult)
                            if(locationRequest==null)
                                return;
                            
                            for(Location location : locationResult.getLocations()) 
                                if (location != null)
                                    userLat=location.getLatitude();
                                    userLng=location.getLongitude();
                                
                            
                        
                    ;

                    LocationServices.getFusedLocationProviderClient(EventLocator.this).requestLocationUpdates(locationRequest,locationCallback, null);

                    LocationServices.getFusedLocationProviderClient(EventLocator.this).getLastLocation().addOnSuccessListener(new OnSuccessListener<Location>() 

                        @Override
                        public void onSuccess(Location location) 
                            if(location!=null)
                                double longitude=location.getLongitude();
                                double latitude=location.getLatitude();
                                userLng=longitude;
                                userLat=latitude;
                            
                        
                    );

所有权限都是正确的,正如我所说,我使用 getLastLocation() 来放置标记。

【问题讨论】:

您获得的某些时间位置不正确。您可以在计算距离之前检查准确性。 Location.getaccuracy() 【参考方案1】:

    确保您在清单文件中添加了位置权限

    如果您使用的是上面的 android os 6,请确保您有位置权限

    确保您的手机已启用 GPS 服务

    公共位置 getLocation() LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); if (locationManager != null) 位置 lastKnownLocationGPS = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); if (lastKnownLocationGPS != null) 返回最后一个已知位置GPS; 其他 位置 loc = locationManager.getLastKnownLocation(LocationManager.PASSIVE_PROVIDER); System.out.println("1::"+loc);----在这里取null System.out.println("2::"+loc.getLatitude()); 返回地址; 其他 返回空值;

如果仍然无法正常工作,请尝试重新启动手机,然后重试。

【讨论】:

我用它来获取不准确的坐标,这就是我想使用 fusedLocationProviderClient 的原因。 更新;这是在 onDataChange 方法的回收器视图中。当有人添加到回收站视图时,它会更新并且所有距离都固定为正确的距离。所以它得到了正确的坐标,我已经将此代码复制到 onDataChange 方法之前仍在 onCreate 方法中,并且它没有以正确的坐标开始。【参考方案2】:

您可以创建接口并在需要计算距离的类中实现它

【讨论】:

你能发一些教程之类的链接吗?我一直在寻找资源数小时无济于事【参考方案3】:

通常 GPS 需要时间来预热。您的初始位置读数可能来自冷 GPS。为了获得更准确的读数,请继续阅读结果,直到获得适合您的准确读数。

请记住,手机上的 GPS 不是很准确,并且无法获得建筑物内的准确读数,或者如果您所在地区没有足够的覆盖范围时间。

最后知道的位置不会告诉您当前的位置,就像它说的是最后知道的位置,可能是几分钟前。它也可能来自手机信号塔读数而不是 GPS 读数。

【讨论】:

问题是地图标记的 getLastLocation() 非常准确。所以它肯定正确地选择了我的位置,这是不是 LocationManager 没有选择确切的位置。这就是为什么我试图再次使用 getLastPosition() 但需要在 onSuccess 方法之外写入坐标。 在 onSuccess 方法之外你到底是什么意思?如果要处理位置信息,则必须在 onSuccess 方法中进行。位置请求也是如此。【参考方案4】:

我正在使用此代码

lateinit var fusedLocationProviderClient: FusedLocationProviderClient
lateinit var latitude : Double
lateinit var longitude : Double

    override fun onCreate() 
        super.onCreate()
        fusedLocationProviderClient = FusedLocationProviderClient(this)
        updateLocationTracking()
    

    @SuppressLint("MissingPermission")
    private fun updateLocationTracking() 
            if(PermissionUtility.isPermissionsGranted(this, Manifest.permission.ACCESS_FINE_LOCATION)) 
                val request = LocationRequest().apply 
                    interval = LOCATION_UPDATE_INTERVAL
                    fastestInterval = FASTEST_LOCATION_INTERVAL
                    priority = PRIORITY_HIGH_ACCURACY
                
                fusedLocationProviderClient.requestLocationUpdates(
                    request,
                    locationCallback,
                    Looper.getMainLooper()
                )
             
    

    private val locationCallback = object : LocationCallback() 
        override fun onLocationResult(result: LocationResult?) 
            super.onLocationResult(result)
                result?.locations?.let  locations ->
                    for(location in locations) 
                        setLocationData(location)
                    
                
        
   

    private fun setLocationData(location : Location)
        latitude = location.latitude
longitude = location.longitude

    

 

【讨论】:

【参考方案5】:

所以当我无法使用我用于调试的手机并使用我的个人手机进行测试时,我想通了,继续活动并且距离正确。

搞乱了调试手机设置和使用 GPS_PROVIDER 和 NETWORK_PROVIDER,当我的手机只使用 GPS 获取位置时,它什么也没有。其他手机可以,所以可以肯定地说我的调试手机的 GPS 坏了。 这是一部旧手机,当我得到一部新手机时,我将其恢复出厂设置以用于调试,因为它有助于向后兼容旧手机和更小的屏幕。我从没想过重置后实际的硬件是否也有故障。

所以错误是手机本身而不是应用程序。猜猜它显示有两个设备可以测试。

【讨论】:

以上是关于从 lastKnownLocation() 获取经度和纬度?的主要内容,如果未能解决你的问题,请参考以下文章

频繁调用fusedLocationProviderClient lastKnownLocation的Android电池消耗?

如何在 Android 中获取位置管理器的最后一个已知位置?

getLastLocation() 返回俄罗斯中部的随机位置

CLLocationManager 最后一个已知位置

扮演双重角色?

面经获取 20170515