如何在应用程序中像 "GPS Connected" 这样内置 GPS 储物柜?

How to have inbuilt GPS locker like "GPS Connected" in app?

当我使用

获取 GPS 位置时,我希望我的应用程序具有最高精度
Location.getLatitude()
Location.getLongitude()

而且我发现 GPS 必须 运行在后台运行才能获得最高精度。

如果有人知道,GPS Connected 应用程序的功能以及 GPS Fix、GPS Locker 等类似应用程序的功能正是我想要的。

我想在我的应用程序中复制它,这样我就不必安装和 运行 那个额外的应用程序。

我找不到任何开源代码。

有人可以帮忙吗?

经过长时间的搜索和来自多个来源的提示,我们发现有人在做某事可能正是我们正在寻找的东西:

Getting the user's location in Android when the phone is locked

此人正在寻找即使在屏幕锁定时也能更新他的 GPS 位置的解决方案,但同时实施了我认为是我的问题的解决方案: 启动通过函数 getLocation() 提取位置的服务。 该函数由 runnable+handler 在服务中以 UPDATE_CYCLE_PERIOD.

的任意时间间隔定期调用

在函数 getLocation() 中,更新仅在网络已连接或 GPS 处于活动状态时完成,但也相应于其他 2 个条件:MIN_TIME_BW_UPDATES 和 MIN_DISTANCE_CHANGE_FOR_UPDATES,由名为的方法调用locationManager.requestLocationUpdates()。我们仍然不确定它到底在做什么,但猜测它只是为 locationManager 定义更新条件。

在 getLocation() 内部调用的特定方法的代码是:

locationManager.requestLocationUpdates(
                        LocationManager.NETWORK_PROVIDER, //Or .GPS_PROVIDER
                        MIN_TIME_BW_UPDATES,
                        MIN_DISTANCE_CHANGE_FOR_UPDATES, this);

periodic runnable+handler的代码:

    handler = new Handler();
    runnable = new Runnable() {
        public void run() {
           location = getLocation();
           handler.postDelayed(runnable, UPDATE_CYCLE_PERIOD);
        }
    };

该函数的代码是

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;
            // First get location from Network Provider
            if (isNetworkEnabled) {
                locationManager.requestLocationUpdates(
                        LocationManager.NETWORK_PROVIDER,
                        MIN_TIME_BW_UPDATES,
                        MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                Log.d("Network", "Network");
                if (locationManager != null) {
                    location = locationManager
                            .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                    if (location != null) {
                        latitude = location.getLatitude();
                        longitude = location.getLongitude();
                    }
                }
            }
            // 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 Enabled", "GPS Enabled");
                    if (locationManager != null) {
                        location = locationManager
                                .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                        if (location != null) {
                            latitude = location.getLatitude();
                            longitude = location.getLongitude();
                        }
                    }
                }
            }
        }

    } catch (Exception e) {
        e.printStackTrace();
    }

    return location;
}

我们为这 3 个变量定义的数值是:

UPDATE_CYCLE_PERIOD = 5 sec (10 sec originally)

MIN_DISTANCE_CHANGE_FOR_UPDATES = 1 meter (10 meters originally)

MIN_TIME_BW_UPDATES = 1 sec  (1 min originally)

这是我们的猜测,我们可以通过超频繁和超精确的更新来模仿应用程序 "GPS Connected" 锁定 GPS 功能的效果——如果该应用程序正在做类似的事情的话。我们可能必须测试和优化电池消耗,因为这些值看起来非常耗电。欢迎在这里发表任何评论。