LocationManager->LocationListener的OnLocationChanged 定位回调无效问题

问题描述

LocationListenerOnLocationChanged不被回调(触发)

问题分析

locationManager.requestLocationUpdates(provider, 3000, 0, locationListener);

中的provider一般都是使用

provider = locationManager.getBestProvider(criteria, true);

获取的,但是这个provider并不是在所有情况下都可用:

  • 如果使用的是GPS_PROVIDER,并且设备在Low Power或者Power Save模式的时候,将无法收取到onLocationChanged
  • 另外,GPS在室内环境很难获取到位置信息,也会造成没有回调的情况。

解决方式

优先使用NETWORK_PROVIDER,或者同时监听多个provider的变化,例如同时监听GPSNETWORK

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);

参考

OnLocationChanged callback is never called

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是一个简单的示例代码,可以通过设置 LocationManager 的 LocationListener 监听器来获取当前位置。 首先,需要在 AndroidManifest.xml 文件中添加获取位置信息的权限: ```xml <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> ``` 然后,在代码中实现 LocationListener 接口,重写 onLocationChanged() 方法来处理位置变化的: ```java public class MyLocationListener implements LocationListener { @Override public void onLocationChanged(Location location) { // 处理位置变化的 double latitude = location.getLatitude(); // 获取纬度 double longitude = location.getLongitude(); // 获取经度 Log.d("MyLocationListener", "latitude=" + latitude + ", longitude=" + longitude); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { // 处理位置状态变化的 } @Override public void onProviderEnabled(String provider) { // 处理位置提供器启用的 } @Override public void onProviderDisabled(String provider) { // 处理位置提供器禁用的 } } ``` 接下来,在代码中创建 LocationManager 对象,并注册 LocationListener 监听器: ```java // 获取 LocationManager 对象 LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); // 创建 LocationListener 对象 LocationListener locationListener = new MyLocationListener(); // 注册 LocationListener 监听器 locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener); ``` 在上面的代码中,我们使用 GPS_PROVIDER 作为位置提供器来获取位置信息,也可以使用 NETWORK_PROVIDER、PASSIVE_PROVIDER 等提供器。第二个参数和第三个参数分别表示位置变化的最小时间间隔和最小位移距离,这里设置为 0 表示尽可能快地获取位置信息。 最后,在不需要位置信息时,要记得取消注册 LocationListener 监听器: ```java locationManager.removeUpdates(locationListener); ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值