android - GPS不准确

时间:2012-09-22 18:08:42

标签: android gps coordinates

我想在地图上显示我的位置。 我在以色列,它告诉我我在埃及。 我尝试实现不同帖子的所有建议,并帮助我解决了我的问题。

  • 我打开了GPS。
  • 我已连接到互联网。
  • 当我启动MAPS默认的Android应用程序时,它会显示我的真实位置!

明确的许可:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

我还使用uses-library android:name =“com.google.android.maps”。

这是MapActivity的相关代码,它扩展了LocationListener:

        lm = (LocationManager) getSystemService(LOCATION_SERVICE);
    boolean enabled = lm
      .isProviderEnabled(LocationManager.GPS_PROVIDER);

    // Check if enabled and if not send user to the GSP settings
    // Better solution would be to display a dialog and suggesting to 
    // go to the settings
    if (!enabled) {
      Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
      startActivity(intent);
    } 


    if(came_from.matches("FollowLocation"))
    {
        Location location;
        Criteria criteria = new Criteria();
        criteria.setAccuracy(Criteria.ACCURACY_FINE);
        String providerName = lm.getBestProvider(criteria, true);
        // If no suitable provider is found, null is returned.
        if (providerName == null) 
        {
            // reflecting changes if distance travel by
            // user is greater than 20m from current location
            // and every 1 minute
            lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
            location=lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
        }
        else
        {
            // reflecting changes if distance travel by
            // user is greater than 20m from current location
            // and every 1 minute
            lm.requestLocationUpdates(providerName, 1*60*1000, 20, this);
            location=lm.getLastKnownLocation(providerName);
        }       


        gMapView = (MapView) findViewById(R.id.myGMap);
        gMapView.setStreetView(true);
        mc = gMapView.getController();
        if (location != null)   
        {
            lat = location.getLatitude();
            lng = location.getLongitude();
            mc.setZoom(14);
        }
        else    //in case we didn't get the location yet
        {
            lat = 32.08;
            lng = 35.84;
            mc.setZoom(9);
        }

        p = new GeoPoint((int) lat * 1000000, (int) lng * 1000000);
        mc.animateTo(p);

        // Adding zoom controls to Map
        gMapView.setBuiltInZoomControls(true);

        // Add a location mark
        MyLocationOverlay myLocationOverlay = new MyLocationOverlay();
        List<Overlay> list = gMapView.getOverlays();
        list.add(myLocationOverlay);



    }

}

/* This method is called when use position will get changed */
public void onLocationChanged(Location location) {
    if (location != null) {
        double lat = location.getLatitude();
        double lng = location.getLongitude();
        p = new GeoPoint((int) lat * 1000000, (int) lng * 1000000);
        mc.animateTo(p);
    }
}




public void onProviderDisabled(String provider) {
    // required for interface, not used
}

public void onProviderEnabled(String provider) {
    // required for interface, not used
}

public void onStatusChanged(String provider, int status, Bundle extras) {
    // required for interface, not used
}

protected boolean isRouteDisplayed() {
    return false;
}

这些坐标:lat = 32.08 lng = 35.84是以色列的一些地方...... 那么.....我做错了什么?或者我在做什么不对? :P

谢谢!

2 个答案:

答案 0 :(得分:0)

我会说getLastKnownLocation由于某种原因给你错误的位置。您的默认值32.08,35 .84永远不会达到,因为location永远不会为null。我建议使用调试器来查看对getLastKnownLocation的哪些调用被命中,以及返回的值是什么。

答案 1 :(得分:0)

我接受了我的代码并将其与互联网中的示例中的工作代码进行了比较。 不知道是什么解决了这个问题,但我确定你应该在完成配置其他所有内容之后再请求LocationUpdates。

遇到此问题的其他人 - 尝试从互联网上获取有效的代码并逐步进行比较,直到它适用于您的应用。