我一直在Android中获得一个不准确的位置

时间:2011-08-25 20:17:48

标签: android gps

我的应用程序在点击按钮时记录gps位置;但是,当我这样做时,我说距离大约三个街区,而且非常不准确。你能看看我的代码,看看我如何改进它?感谢

@Override
        protected Void doInBackground(Void... arg0) {
            SharedPreferences prefs = getSharedPreferences("Settings", 0);
            final String id = prefs.getString("ID", "");
            DefaultHttpClient httpclient = new DefaultHttpClient();
            HttpPost httpost = new HttpPost(
                    "http://iphone-radar.com/gps/gps_locations");

            JSONObject holder = new JSONObject();

            try {
                holder.put("id", id);
                LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
                Criteria criteria = new Criteria();
                String bestProvider = locationManager.getBestProvider(criteria,
                        false);
                LocationListener loc_listener=new LocationListener() {

                    @Override
                    public void onStatusChanged(String provider, int status, Bundle extras) {
                        // TODO Auto-generated method stub

                    }

                    @Override
                    public void onProviderEnabled(String provider) {
                        // TODO Auto-generated method stub

                    }

                    @Override
                    public void onProviderDisabled(String provider) {
                        // TODO Auto-generated method stub

                    }

                    @Override
                    public void onLocationChanged(Location location) {
                        // TODO Auto-generated method stub

                    }
                };
                try{
                    Looper.prepare();
                locationManager.requestLocationUpdates(bestProvider, 0, 0, loc_listener);
                }catch(Exception e){
                    e.printStackTrace();
                }
                Location location=locationManager.

getLastKnownLocation(bestProvider);
            Calendar c = Calendar.getInstance();
            SimpleDateFormat sdf = new SimpleDateFormat("hh:mmaa dd'/'MM'/'yyyy");

            holder.put("time", sdf.format(c.getTime()));
            holder.put("time_since_epoch", System.currentTimeMillis());
            try {
                holder.put("lat", location.getLatitude());
                holder.put("lon", location.getLongitude());
            } catch (NullPointerException e) {
                try {
                    holder.put("lat", -1.0);
                    holder.put("lon", -1.0);
                } catch (JSONException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }

            StringEntity se = new StringEntity(holder.toString());
            httpost.setEntity(se);
            httpost.setHeader("Accept", "application/json");
            httpost.setHeader("Content-type", "application/json");

            ResponseHandler responseHandler = new BasicResponseHandler();
            String response = httpclient.execute(httpost, responseHandler);
            org.json.JSONObject obj;

                obj = new org.json.JSONObject(response);

        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

4 个答案:

答案 0 :(得分:4)

是的,绝对是,尝试为Criteria ...

添加一些准确性
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);

Criteria状态的默认构造函数(强调我的)

  

构造一个新的Criteria对象。新对象对准确性,功率或响应时间没有要求;不需要高度,速度或方位;并且不会允许货币成本。

答案 1 :(得分:3)

一个愚蠢的问题。你的GPS启用了吗?当您在同一地点时,您的设备是否在其他应用程序(即Goolge Maps)中提供更好的精确度?

如果是这样,请使用精度更高的Criteria

  

criteria.setAccuracy(Criteria.ACCURACY_FINE)

或使用

  

locationManager.getProvider(LocationManager.GPS_PROVIDER)

而是,强制设备使用GPS,从而获得精度米。

答案 2 :(得分:3)

这里有很多事情需要注意。首先,GPS可能由于多种原因而不准确。一个可能是恶劣的天气条件,另一个是足够数量的GPS卫星的可见性。手机本身的GPS接收器可能不佳。最后,您的手机可能没有与足够的卫星连接以获得准确的修复。

特别是在您的代码中,您使用的getLastKnownLocation()带有未指定的条件,如果我没记错的话,将使用任何提供商。很可能是使用网络提供商而不是GPS提供商。建立与GPS信号的高质量连接可能需要相当长的时间,因此只有在GPS实际运行的情况下静止一段时间后才能使用getLastKnownLocation(在通知栏中查找卫星接收器图标)。您应该实施特定的GPS标准,然后在确定位置后实施onLocationChanged来执行某些操作。

答案 3 :(得分:1)

试试这个:

criteria.setAccuracy(Criteria.ACCURACY_FINE);