【问题标题】:Location is not working in my app properly位置在我的应用程序中无法正常工作
【发布时间】:2013-05-17 06:29:28
【问题描述】:

下面粘贴的是我从用户那里获取坐标的类。但有时,我将纬度和经度设为空。我知道这是因为我没有足够的网络,或者我在建筑物内,或者其他什么......但奇怪的是,在那一刻,我去谷歌地图或其他地图应用程序,并且“地理定位我”按钮效果很好。

我错过了什么别人没有?

public class LocationActivity extends BaseActivity {

private LocationManager locationManager = null;

LocationListener onLocationChange=new LocationListener() 
{
    public void onLocationChanged(Location loc) {
        LocalSession.lat = loc.getLatitude();
        LocalSession.lng = loc.getLongitude();
    }

    public void onProviderDisabled(String provider) {}

    public void onProviderEnabled(String provider) {}

    public void onStatusChanged(String provider, int status, Bundle extras) {}
};

@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
}

@Override
public void onPause() {
    super.onPause();
    locationManager.removeUpdates(onLocationChange);
}

@Override
public void onDestroy() {
    super.onDestroy();
    locationManager.removeUpdates(onLocationChange);
}

@Override
public void onResume() {
    super.onResume();
    try {
        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,0,10000.0f,onLocationChange);
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,10000.0f,onLocationChange);
    } catch (Exception e) {
    }
}

}

【问题讨论】:

    标签: android geolocation gps locationmanager


    【解决方案1】:

    您在位置信息中得到 NULL 值,这是因为 GPS_PROVIDER 需要开阔的天空来获取位置信息。

    如果您使用NETWORK_PROVIDER 提供商,您甚至可以在房间内获得位置信息,因为您的设备正在房间内获得网络覆盖。

    您使用的代码包含两个提供者,

    try 
    {
         locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,0,10000.0f,onLocationChange);
         locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,10000.0f,onLocationChange);
    } catch (Exception e) {}
    

    因此第二个提供者 (GPS_PROVIDER) 将替换第一个提供者 (NETWORK_PROVIDER),因为您使用的是相同的 LocationManager 类的对象。

    我的建议是使用以下任一方式,

    • 使用 NETWORK_PROVIDER
    • 在两个提供商之间切换,即。 e.如果 GPS_PROVIDER 返回 NULL,则只尝试 NETWORK_PROVIDER

    【讨论】:

    • 是的,@Lucifer 的回答一针见血。检查这个link for ref
    【解决方案2】:

    注意:试试下面的代码。这是使用 GPS 或网络获取位置的流行代码。在那里可以使用。

    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;
    }
    

    【讨论】:

    • @Segi,您的答案不是与this 答案重复吗?你不应该那样做。
    • @Lucifer 我不知道。但我从 androidhive 网站使用它。我在我的代码中使用的。
    【解决方案3】:

    我的建议是同时使用 NETWORK_PROVIDER 和 GPS_PROVIDER,使用我在此处的答案中发布的代码将两个结果输入卡尔曼滤波器:Smooth gps data。使用的信息越多越好。如果 GPS 和网络提供商的准确度估计都可靠,则卡尔曼滤波器方法会更好,即,只要伴随的准确度指定,任何估计是否不可靠都没有关系。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-02
      • 1970-01-01
      相关资源
      最近更新 更多