如何在应用程序中拥有像“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 组件的大小