【问题标题】:LocationManager requestLocationUpdates doesn't workLocationManager requestLocationUpdates 不起作用
【发布时间】:2012-06-10 22:04:18
【问题描述】:

我正在尝试使用 LocationManager 和 LocationListener 获取 android 中的当前位置,如http://developer.android.com/guide/topics/location/obtaining-user-location.html 所述

但是,永远不会调用 LocationListener 的 onLocationChanged 方法。我使用的是真正的安卓手机/也使用了模拟器,并使用 telnet 更改了模拟位置,如上面的链接中所述。

这是我的代码:

public class MyActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        /* Use the LocationManager class to obtain GPS locations */
        LocationManager mlocManager = (LocationManager) 
                getSystemService(Context.LOCATION_SERVICE);
        LocationListener mlocListener = new CustomLocationListener(
                getApplicationContext());
        // Location Providers
        String locationProvider = LocationManager.NETWORK_PROVIDER;
        // LocationProvider locationProvider = LocationManager.GPS_PROVIDER;
        mlocManager
                .requestLocationUpdates(locationProvider, 0, 0, mlocListener);
    }
}

还有我的 LocationListener:

public class CustomLocationListener implements LocationListener {

    private Context m_context;

    public CustomLocationListener(Context context) {
        m_context = context;
    }

    @Override
    public void onLocationChanged(Location location) {
        double latitude = location.getLatitude();
        double longitude = location.getLongitude();
        String Text = latitude + " " + longitude;
        Toast.makeText(m_context, Text, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onProviderDisabled(String provider) {
        // TODO
    }

    @Override
    public void onProviderEnabled(String provider) {
        // TODO
    }

    @Override
    public void onStatusChanged(String arg0, int arg1, Bundle arg2) {}
}

所以永远不会调用 onLocationChanged。 任何人都可以看到问题吗? 非常感谢

【问题讨论】:

  • 您是否在手机上启用了 GPS 服务并确认您应该有一个位置? (等待几分钟不是确认,如果您在服务差的地区,30 分钟可能还不够......)
  • 想问一下:你有清单中指定的位置权限吗?
  • @dymmeh 是的,我在清单中添加了权限
  • @Sam 我不明白 NETWORK_PROVIDER 不使用手机的 gps
  • @DanDinu 对不起,我读错了你的问题。如您所知,网络位置不需要启用 GPS 服务,它需要启用网络提供商。运气好能解决你的问题吗?您的代码看起来不错。

标签: android geolocation locationmanager


【解决方案1】:

您也可以让您的手机确定最佳提供商,而不仅仅是设置

String locationProvider = LocationManager.NETWORK_PROVIDER;

试试这个:

Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
criteria.setAltitudeRequired(false);
criteria.setBearingRequired(false);
criteria.setCostAllowed(true);
criteria.setPowerRequirement(Criteria.POWER_LOW);   
String locationProvider = mlocManager.getBestProvider(criteria, true);

另外,您是否通过将设备移动到新位置进行了测试?否则“onlocationchanged”事件可能不会触发。几年前,当我弄清楚这些东西时,我放了一些“祝酒词”来提醒我我的纬度/经度坐标,因为我绕着街区走来验证事件正在触发。

【讨论】:

  • 如何让模拟器“去一个新位置”?
  • @MathiasLykkegaardLorenzen:我总是使用设备进行开发,但如果您按照上面 Dan Dinu 原始问题的链接,您似乎可以在模拟器中模拟位置。转到该文章的底部并查看“在模拟器控制台中使用“geo”命令”。
  • 将我的设备移动到新位置解决了这个问题!谢谢
【解决方案2】:

这在我看来像 Android Bug 57707

如果是,重启设备应该会有所帮助,至少在一段时间内。

或者您可以使用Google Play Services Location API

通过同时使用 Wifi、GPS 和网络定位,Google Play Services Location API 将隐藏网络定位被破坏的事实;只有当您既没有 GPS 也没有 Wifi 时,这一点才会很明显。

【讨论】:

    【解决方案3】:

    确保在“设置”中启用了正确的定位服务。您还可以使用isProviderEnabled() 来检查您选择的特定提供商是否可以使用。并确保您在清单中具有 COARSE 或 FINE 位置权限。

    另外,请确保您在设备上进行测试。网络定位在模拟器中根本不起作用,只有使用模拟工具注入新数据点,GPS才会起作用。

    【讨论】:

    【解决方案4】:

    我也遇到过类似的问题。 Try replacing getApplication() with MainAvtivity.this

    另外,请确保您保留了 FINE 和 COARSE 位置的权限。如果您的目标 API 超过 23,您还应该处理来自 java 代码的权限。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-29
      • 2018-04-13
      • 2013-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-03
      相关资源
      最近更新 更多