11

我开发了一个应用程序,用于查找设备的当前位置。我使用 Fused Location API 来获取当前位置。

我面临一个非常奇怪的问题,在某些设备中,直到我打开内置的谷歌地图,我才能获得准确的当前位置,一旦我打开谷歌地图并返回我的应用程序,当时应用程序会返回确切的位置。

这是我的位置请求。

mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(UPDATE_INTERVAL);
mLocationRequest.setFastestInterval(FATEST_INTERVAL);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
mLocationRequest.setSmallestDisplacement(DISPLACEMENT); // 10 meters

谁能告诉我出了什么问题?非常感谢您的帮助。

4

4 回答 4

3

所以 Waze 和我们过去使用 FusedLocation 并面临很多问题。API 已损坏。有些设备无法正常运行。融合了很多继电器的活动识别无法正常工作并正确识别员工。我们结束,切换回位置管理器 API。

这里的片段:

初始化位置管理器并开始在不同的线程上请求更新。我个人为每个提供者注册单独的侦听器

if (mLocationManager == null) {
        LOGGER.info("Location track,start called first time. Creating Location Manager");
        mLocationManager = (LocationManager) mContextWeakReference.get()
                .getSystemService(Context.LOCATION_SERVICE);

        mLocationHandlerThread
                = new HandlerThread("LocationThread", Thread.NORM_PRIORITY);
        mLocationHandlerThread.start();
        // Now get the Looper from the HandlerThread
        // NOTE: This call will block until the HandlerThread gets control and initializes its Looper
        Looper looper = mLocationHandlerThread.getLooper();
        Location networkLastKnownLocation = null;
        Location gpsLastKnownLocation = null;
        mGpsLocationListener = new GpsLocationListener();
        mNetworkLocationListener = new NetworkLocationListener();

        // Register the listener with the Location Manager to receive location updates
        if (mLocationManager.getAllProviders().contains(LocationManager.GPS_PROVIDER)) {
            mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                    LOCATION_REQUEST_INTERVAL_MILLIS, SMALLEST_DISPLACEMENT_METERS,
                    mGpsLocationListener,
                    looper);

            gpsLastKnownLocation = mLocationManager
                    .getLastKnownLocation(LocationManager.GPS_PROVIDER);
        } else {
            setGpsProviderAvailable(false);
        }
        if (mLocationManager.getAllProviders().contains(LocationManager.NETWORK_PROVIDER)) {
            networkLastKnownLocation = mLocationManager
                    .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
            mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
                    LOCATION_REQUEST_INTERVAL_MILLIS, SMALLEST_DISPLACEMENT_METERS,
                    mNetworkLocationListener,
                    looper);
        }

        setLastKnownLocationDifferentProviders(gpsLastKnownLocation,
                networkLastKnownLocation);

    }

听众是:

public class GpsLocationListener implements LocationListener {

    @Override
    public void onLocationChanged(Location location) {
        LOGGER.info("Location track ,onLocationChanged location={}", location);
        switch (location.getProvider()) {
            case LocationManager.GPS_PROVIDER:
                if (mLocationManager != null) {
                    mLocationManager.removeUpdates(mNetworkLocationListener);
                }
                break;
        }
        setLastKnownLocation(location);
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        LOGGER.info("onStatusChanged: {}, status: {}", provider, status);
    }

    @Override
    public void onProviderEnabled(String provider) {
        LOGGER.info("onProviderEnabled: " + provider);
        if (provider.equals(LocationManager.GPS_PROVIDER)) {
            setGpsProviderAvailable(true);
        }
    }

    @Override
    public void onProviderDisabled(String provider) {
        LOGGER.info("onProviderDisabled: " + provider);
        if (provider.equals(LocationManager.GPS_PROVIDER)) {
            setGpsProviderAvailable(false);
        }
    }
}

public class NetworkLocationListener implements LocationListener {

    @Override
    public void onLocationChanged(Location location) {
        LOGGER.info("Location track ,onLocationChanged location={}", location);
        switch (location.getProvider()) {
            case LocationManager.NETWORK_PROVIDER:
                setLastKnownLocation(location);
                break;
        }
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        LOGGER.info("onStatusChanged: {}, status: {}", provider, status);
    }

    @Override
    public void onProviderEnabled(String provider) {
        LOGGER.info("onProviderEnabled: " + provider);
        if (provider.equals(LocationManager.GPS_PROVIDER)) {
            setGpsProviderAvailable(true);
        }
    }

    @Override
    public void onProviderDisabled(String provider) {
        LOGGER.info("onProviderDisabled: " + provider);
        if (provider.equals(LocationManager.GPS_PROVIDER)) {
            setGpsProviderAvailable(false);
        }
    }
}

不要忘记注销并停止所有线程:)

于 2016-04-07T15:59:15.133 回答
0

创建 LocationRequest 时,您必须将 setPriority() 设置为 PRIORITY_NO_POWER。

PRIORITY_NO_POWER 意味着您的应用永远不会获得任何位置,除非手机中的其他应用已请求位置并已收到。在LocationRequest阅读更多。

于 2016-02-17T12:40:41.523 回答
0

我不确定这一点,但上次我看到过这样的事情,那部手机没有专用的 GPS。它只有一个-GPS。

在玩了很多时间之后,我意识到这就是我没有获得准确位置的原因。但是打开地图后,由于某种原因,位置是准确的。即使手机没有专用的 GPS,谷歌肯定会在地图上做很多其他事情来获取地图上的准确位置。只需检查设备及其硬件规格即可。

于 2016-02-17T12:36:45.433 回答
0

你们是在 Marshmallow 或以上版本的设备上测试吗?
在高于 Lollipop 的设备中,您必须在运行时请求位置权限。请参阅此链接http://developer.android.com/training/permissions/requesting.html
所以您没有位置权限,因此它不会返回准确的位置,但是当您启动已经拥有 Gps 权限的地图应用程序时,将更新您在 Google Play 服务中的位置。因此,您也开始显示正确的位置,因为位置最终是从 Google Play 服务中获取的。

于 2016-04-06T17:27:17.507 回答