java - FusedLocationProviderClient 最多需要 30 秒来检索第一个位置更新

标签 java android gps location fusedlocationproviderapi

当我第一次启动我的应用程序时,FusedLocationProviderClient 最多需要 30 秒才能开始提供位置更新(即蓝点出现之前最多需要 30 秒)。我有一个封装在 LiveData 中的 FusedLocationProvider,如下所示,我试图找出问题所在,但做不到。

public class LocationLiveData extends LiveData<Location> {

    private final static int LOCATION_REQUEST_INTERVAL_SECONDS = 5;
    private final static int MIN_DISPLACEMENT_REQUEST_METRES = 0;
    private final String TAG = this.getClass().getName();

    private final Context context;

    private FusedLocationProviderClient fusedLocationProviderClient = null;
    private LocationCallback locationCallback = new LocationCallback() {
        @Override
        public void onLocationResult(LocationResult locationResult) {
            setValue(locationResult.getLastLocation());
        }
    };

    public LocationLiveData(Context context) {
        this.context = context;
    }

    @Override
    protected void onActive() {
        super.onActive();
        FusedLocationProviderClient locationProviderClient = getFusedLocationProviderClient();
        LocationRequest locationRequest = LocationRequest.create();
        locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        locationRequest.setInterval(TimeUnit.SECONDS.toMillis(LOCATION_REQUEST_INTERVAL_SECONDS));
        locationRequest.setSmallestDisplacement(MIN_DISPLACEMENT_REQUEST_METRES);
        locationProviderClient.requestLocationUpdates(locationRequest, locationCallback, null);
        Log.d(TAG, "Getting location...");
    }

    @NonNull
    private FusedLocationProviderClient getFusedLocationProviderClient() {
        if (fusedLocationProviderClient == null) {
            fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(context);
        }
        return fusedLocationProviderClient;
    }

    @Override
    protected void onInactive() {
        if (fusedLocationProviderClient != null) {
            fusedLocationProviderClient.removeLocationUpdates(locationCallback);
        }
    }
}

这是我的 fragment ,它包含另一个 MapFragment 并在其上调用 getMapAsync()。这是相关代码:

  @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup viewGroup, Bundle bundle) {
        mBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_map, viewGroup, false);

        mBinding.setView(this);

        mBinding.setViewModel(ViewModelProviders.of(this).get(MapsViewModel.class));

        FragmentManager fragmentManager = getChildFragmentManager();
        SupportMapFragment mapFragment = (SupportMapFragment) fragmentManager
                .findFragmentById(R.id.map_fragment);
        mapFragment.getMapAsync(this);

        return mBinding.getRoot();
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        mMap.setMyLocationEnabled(true);
        mMap.getUiSettings().setMyLocationButtonEnabled(false);
        mMap.setInfoWindowAdapter(new InfoWindowAdapter(getLayoutInflater()));
        animateCameraToUserLocation();
    }

最佳答案

您可以做的是在检索 gps 位置之前,您可以将缓存的位置与 getLastLocation() 一起使用,这将为您提供最后一个已知位置,并且比等待 gps 信号更快获取更新的位置,您始终可以放置一个计时器,如果在 5 秒内没有使用 gps 获取位置,您可以使用 getLastLocation()

https://developer.android.com/training/location/retrieve-current.html#GetLocation

关于java - FusedLocationProviderClient 最多需要 30 秒来检索第一个位置更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46750929/

相关文章:

android - 单击微调器会出现 WindowManager$BadTokenException

android - ProgressDialog 已弃用。要使用的替代项是什么?

python - 从十六进制数据转换回纬度 GREENTEL

android从纬度和经度获取印度的邮政编码

java - 找到 64 字节数组的所有排列?

java - 日期解析时月份始终为一月

java - Google 天气 api,读取 xml 时出现问题

java.lang.UnsupportedClassVersionError : exception while installing java 1. 6 已安装 1.7?

android - Google play 测试购买

node.js - 我如何将 GPS 数据发送到 parrot ar 无人机并转到我的无人机的 GPS 位置?