即使GPS提供商可用,也不会调用onLocationChanged

时间:2014-10-17 12:35:12

标签: java android gps location

我尝试使用MyCustomLocationListener获取设备当前位置。

我的代码在这里传递,并指出GPS和网络提供商都可用。

// getting GPS status
isGPSEnabled = androidLocationManager
        .isProviderEnabled(LocationManager.GPS_PROVIDER);

// getting network status
isNetworkEnabled = androidLocationManager
        .isProviderEnabled(LocationManager.NETWORK_PROVIDER);

if (!isGPSEnabled && !isNetworkEnabled) {
    // no network provider is enabled
    Log.e(MyLogger.TAG, "Non providers are enabled");

    showEnableGpsDialog();
    return;
}

if (isGPSEnabled) {
    androidLocationManager.requestLocationUpdates(
            LocationManager.GPS_PROVIDER, 0, 0,
            saveToSharedPrefListener);
    Log.d(MyLogger.TAG, "GPS Enabled");
}

if (isNetworkEnabled) {
    if (androidLocationManager == null) {
        androidLocationManager.requestLocationUpdates(
                LocationManager.NETWORK_PROVIDER, 0, 0,
                saveToSharedPrefListener);
        Log.d(MyLogger.TAG, "Network Enabled");
    }
}

但是当我在室内时,onLocationChanged从未被调用过。

仅当我使用Fake GPS应用时,才会调用onLocationChanged

如何编写回退(使用\ out超时)强制调用onLocationChanged

我过去常常使用其他API requestSingleUpdate

这两者在室内工作方面有什么区别?

if (isGPSEnabled) {
    androidLocationManager.requestLocationUpdates(
            LocationManager.GPS_PROVIDER, 0, 0,
            saveToSharedPrefListener);
    Log.d(MyLogger.TAG, "GPS Enabled");
}

if (BaseApplication.getCurrentActivity() != null) {
    locationManager.requestSingleUpdate(LocationManager.GPS_PROVIDER,
            saveToSharedPrefListener, BaseApplication.getCurrentActivity()
            .getMainLooper());

2 个答案:

答案 0 :(得分:2)

  • 但是当我在室内时,永远不会调用onLocationChanged。

你无能为力。但是,有些手机可以在室内获得该位置,它与手机的 GPS接收器有关,因此存在硬件问题。

然后,如果您了解自己在室内,则可以使用LocationManager.NETWORK_PROVIDER获取位置。但是,它的工作精度高于LocationManager.GPS_PROVIDER

  • 这两者在室内工作方面有什么区别?

    1. 如果您的GPS接收器无法获得位置更新(有时候 室内,有时是恶劣的天气,也与您的手机有关 硬件),你使用哪个块并不重要。
    2. 如果您的GPS接收器可以获取位置更新,请使用第一个更新您的位置。

请注意:" GPS提供商可用"并不意味着你可以获得它的位置。不合理但在Android设备上的情况就是这样。

我希望有所帮助。

答案 1 :(得分:1)

我认为根据代码中的空值检查,永远不会要求网络位置提供程序进行位置更新,否则您会看到异常:

if (isNetworkEnabled) {
    if (androidLocationManager == null) {
        androidLocationManager.requestLocationUpdates(
                LocationManager.NETWORK_PROVIDER, 0, 0,
                saveToSharedPrefListener);
        Log.d(MyLogger.TAG, "Network Enabled");
    }
}