关于Android调用系统GPS模块时的minTime和minDistance参数解析

之前在开发Android程序调用GPS时,都是直接用函数

public void requestLocationUpdates (long minTime, float minDistance, Criteria criteria, PendingIntent intent)

但是最近客户说手机的GPS不够精确,所以特意从google developer官网了解了一下这个函数签名中的两个参数,翻译如下(如有不准确欢迎纠正):

  •        minTime:应用程序接收GPS更新的最短时间(即只有超过这个时间设定,系统才可能通知我们的程序说“GPS"——单位毫秒
  •        minDistance:应用程序接收GPS更新的最短距离(即只有超过这个距离,系统才可能通知我们的程序来更新GPS数据)——单位米
注1:两者都设置时(都不为0),那必须在两个条件同时满足时才通知我们的应用
注2:由于长期使用GPS模块非常耗电,所有Android建议我们在允许的范围内尽可能地将minTime设置长一些(特别是后台的线程)
注3:当minTime设置不为0(哪怕是1秒),每隔一秒尝试去获取gps数据时都要重新搜星(也就是不会基于上次的定位快速优化并提高精度)。

参看原文

翻译:

注册定位更新服务(可指定不同的定位类型和回调事件)

当前的activity通过requestLocationUpdates() 或requestSingleUpdate() 注册,根据provider、或者根据符合特定条件的 Criteria周期性地更新定位和状态。

第一次定位可能会花费一定的时间(一般在30~60秒左右,依不同设备而定)。如果要立即获取定位数据,建议使用getLastKnownLocation(String) 方法(获取最后一次定位记录的数据,所以可能是很旧的数据)。

定位数据更新时,会执行 回调函数LocationListener,或者一个intent广播。

如果调用者提供了一个intent, 那么定位数据的更新会发送一个KEY_LOCATION_CHANGED 和 一个Location 对象(通过这两个对象可以获取最新的定位数据)。

定位更新的间隔可以通过minTime参数来控制。两次定位更新所间隔的时间必然大于minTime,然而它更受到定位类型和其它注册应用设置的间隔时间的影响。

设置一个合理的minTime值对于提高电池的使用时间及其重要。任何的GPS、WIFI、Cell和其他的无线通讯的更新都消耗电量。在用户可接受的程度范围内,尽可能得将minTime设置的越大越好。如果你的应用不在前台运行,并且只给用户显示定位数据,那么你的应用可以使用主动 provider(如 NETWORK_PROVIDERGPS_PROVIDER),但是如果你非用不可,那么尽可能悬着minTime=5*60*1000(5分钟)或者更长。如果你的应用运行在前台并且给用户实时显示,那么可以选择一个更短的间隔。

minDistance也可以控制定位更新的频率。如果该值大于0,那么定位服务只会在距离变更超过minDistance米时才会通知你的应用,而且至少经过minTime毫秒之后。但是minDistance相对而言更加费电,因此minTime还是省点的首选参数。

如果你的应用只是被动得通过其它应用通知定位数据的更新,而不消耗任何其它的电量,那么可以采用PASSIVE_PROVIDER。该模式不会主动打开或者修改定位服务,因此你不需要对minTime和minDistance的值特别谨慎。如果你的应用对定位数据(如网络定位数据)更新要求特别高,并且有另一个应用程序注册开启了极其快速的定位数据更新,那么你应该为minTimeminDistance一个非0的值,以此来限制你自己应用更新的频率。

当用户关闭了某种定位类型(假设A),那么该类型定位的数据更新将被迫停止,然而一个可用的定位类型将被采用(假设B)。一旦该服务(A)又被开启,定位数据更新将立即被唤起。各种定位类型能在任何时间发送更新状态,或者仅仅指定某中类型的状态变化。如果回调函数被设置,那么可通过过 onProviderDisabled(String),onProviderEnabled(String) 或者 onStatusChanged(String, int, Bundle)这三个函数来获取状态。同理,如果一个intent被设置,那么装好和可用的更新将会被广播( KEY_PROVIDER_ENABLED or KEY_STATUS_CHANGED)。

如果一个没有特定的消息(Looper)的LocationListener被设置,那么当前调用的线程必须是一个拥有消息(Looper)的线程比如说应用的主线程。 If a Looper is specified with a LocationListener then callbacks are made on the supplied Looper thread.(实在懂不了。。。)

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 中,可以通过 LocationManager 类获取 GPS 的各种位置信息。以下是获取 GPS 位置信息的示例代码: 1.在 AndroidManifest.xml 中声明权限: ```xml <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> ``` 2.在代码中获取 LocationManager 对象: ```java LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); ``` 3.启用 GPS: ```java if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); startActivity(intent); } ``` 4.注册位置监听器: ```java LocationListener locationListener = new LocationListener() { @Override public void onLocationChanged(Location location) { // 当位置发生变化回调此方法 double latitude = location.getLatitude(); double longitude = location.getLongitude(); float accuracy = location.getAccuracy(); // 其他方法获取位置信息 } @Override public void onStatusChanged(String provider, int status, Bundle extras) { // 当位置提供者状态发生变化回调此方法 } @Override public void onProviderEnabled(String provider) { // 当位置提供者可用回调此方法 } @Override public void onProviderDisabled(String provider) { // 当位置提供者不可用回调此方法 } }; long minTime = 1000; // 位置更新的最短间间隔,单位毫秒 float minDistance = 0; // 位置更新的最短距离,单位米 locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, minTime, minDistance, locationListener); ``` 5.获取最近的位置信息: ```java Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); if (location != null) { double latitude = location.getLatitude(); double longitude = location.getLongitude(); float accuracy = location.getAccuracy(); // 其他方法获取位置信息 } ``` 除了上述方法外,还可以通过 Location 类的其他方法获取位置信息,例如: ```java float bearing = location.getBearing(); // 方向角度 float speed = location.getSpeed(); // 速度 long time = location.getTime(); // 间戳 double altitude = location.getAltitude(); // 海拔高度 ``` 需要注意的是,GPS 在室内或高楼建筑物密集的城市区域可能无法正常工作,此可以使用基站定位或 Wi-Fi 定位等其他方式获取位置信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值