如何在启用GPS位置后立即获取位置

5
我正在实现一个模块,需要用户提供经度和纬度以离线打卡。
我已经按照链接上的例子,实现了GPSTracker类。
但是在启用GPS定位后打卡时,该类返回空位置对象。但是在3060秒后,它会正确地返回位置对象。
我还在清单中添加了COARSEFINE权限,并获取了运行时权限。
因此,我需要帮助如何在启用GPS定位后立即获取经度和纬度。

没有“即时”的概念。您可以使用“最后已知位置”。 - Cà phê đen
是的,我使用了getLastKnownLocation()方法,但它不能立即返回位置。@Càphêđen - Nivrutti Pawar
getLastKnownLocation 应该立即返回。唯一需要考虑的是它可能过时了。对于当前位置,必须等待服务变为可用。没有其他机会。 - Cà phê đen
不,当您启用GPS并立即调用getLastKnownLocation()时,它会在30-60之后返回null,然后才返回位置。我已经尝试过了。@Càphêđen - Nivrutti Pawar
3个回答

4

此代码在GPS开启后立即提供位置信息。

private void getLastLocation()
{
    LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);


    LocationListener locationListener = new LocationListener() {
        public void onLocationChanged(Location location) {
            Log.e("location",location.getLatitude()+"");

        }

        public void onStatusChanged(String provider, int status, Bundle extras) {}

        public void onProviderEnabled(String provider) {}

        public void onProviderDisabled(String provider) {}
    };

    locationManager.requestSingleUpdate(LocationManager.NETWORK_PROVIDER,locationListener,null);

}

3

启用 GPS 定位后,mFusedLocationClient.getLastLocation() 返回 null,因为它没有上次的位置信息。如果您需要在启用后立即获取位置,请自行发出请求:requestLocationUpdates

mFusedLocationClient.requestLocationUpdates(getLocationRequest(), mLocationCallback, null);

在 com.google.android.gms.location.LocationCallback 中使用 mLocationCallback;

并在回调函数中获得结果,例如:

mLocationCallback = new LocationCallback() {
        @SuppressLint("MissingPermission")
        @Override
        public void onLocationResult(LocationResult locationResult) {
            if (locationResult == null) {
                mFusedLocationClient.removeLocationUpdates(mLocationCallback);
                return;
            }
            for (Location location : locationResult.getLocations()) {
                // Update UI with location data
                myCoordinate = new LatLng(location.getLatitude(), location.getLongitude());
            }
            mFusedLocationClient.removeLocationUpdates(mLocationCallback);
        }
    };

PS. 在我的情况下,它在所有设备上都能完美运行,但在三星S8和S9上无法正常工作。


0

请尝试以下代码:

FusedLocationProviderClient mFusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(getActivity());

private void getDeviceLocation() {   
            try {
                Task<Location> locationResult = mFusedLocationProviderClient.getLastLocation();
                locationResult.addOnCompleteListener(getActivity(), new OnCompleteListener<Location>() {
                    @Override
                    public void onComplete(@NonNull Task<Location> task) {
                        if (task.isSuccessful()) {                 
                            Location mLastKnownLocation = task.getResult();
                             Log.i(TAG, "==lat "+mLastKnownLocation.getLatitude());
                             Log.i(TAG, "==log "+mLastKnownLocation.getLongitude());                      
                        } else {
                            Log.d(TAG, "Current location is null. Using defaults.");
                            Log.e(TAG, "Exception: %s", task.getException());
                        }
                    }
                });
            } catch (SecurityException e) {
                Log.e("Exception: %s", e.getMessage());
            }
     }

谢谢回答。这对我没有用。@Deven - Nivrutti Pawar
你找到答案了吗?请帮帮我。 - Innocent
找到了一个解决方案,它可以在Java中工作,但在Kotlin中无法工作。@Innocent - Nivrutti Pawar
请与我分享 @NivruttiPawar - Innocent
使用这个库: https://github.com/mrmans0n/smart-location-lib@Innocent - Nivrutti Pawar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接