如何在应用程序中拥有像“GPS Connected”这样的内置 GPS 储物柜?

Posted

技术标签:

【中文标题】如何在应用程序中拥有像“GPS Connected”这样的内置 GPS 储物柜?【英文标题】:How to have inbuilt GPS locker like "GPS Connected" in app? 【发布时间】:2020-05-12 16:51:43 【问题描述】:

当我使用

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

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

如果有人认识他们,那么 GPS Connected 应用程序的功能以及 GPS Fix、GPS Locker 等类似应用程序的功能正是我想要的。

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

我找不到任何开源代码。

谁能帮忙?

【问题讨论】:

您好,欢迎您。无需在标题中添加标签。 @FedericoklezCulloca:好的,感谢 toy 的纠正和帮助。 作为刷新:我和我的同事正在尝试使用永久循环实现位置的持续刷新,该循环将通过服务在应用程序的后台运行。 【参考方案1】:

经过长时间的搜索和来自多个来源的提示,我们发现有人在做一些我们正在寻找的事情:

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);

周期性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 功能的效果 - 如果该应用程序正在做类似的事情的话。我们可能必须测试和优化电池消耗,因为这些值似乎非常消耗。欢迎任何 cmet 在这里。

【讨论】:

能否请有更多权利的人标记或投票作为答案?

以上是关于如何在应用程序中拥有像“GPS Connected”这样的内置 GPS 储物柜?的主要内容,如果未能解决你的问题,请参考以下文章

我拥有一个 web api,它将像用户机器上的 windows 服务一样运行,我如何生成这个应用程序的安装程序? [复制]

如何使用flutter和kotlin在应用程序之外拥有小部件?

如何像 Interface Builder 一样调整 iOS UI 组件的大小

如何在继承 SKSpritenode 的类中拥有图像

在 React.js 中拥有像 componentWillMount 这样的函数的目的是啥?

如何拥有不带“www”和“https”前缀的应用链接(Android)网址