I keep getting inaccurate location in Android

my application records the location of gps with the click of a button; however, when I do this, I am talking about three blocks and is extremely inaccurate. Can you take a look at my code to see how I can improve it? Thanks

@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
source share
4 answers

Yes, no, try adding some precision to Criteria ...

 Criteria criteria = new Criteria(); criteria.setAccuracy(Criteria.ACCURACY_FINE); 

The default constructor for Criteria states (highlight mine)

Creates a new Criteria object. The new facility will not require accuracy , power or response time; Will not require height, speed or bearing; and will not allow cash costs.

+4
source

Stupid question. Is your GPS turned on? Does your device support better accuracy in other applications (like Goolge maps) when you're in the same place?

If so, use Criteria with higher precision.

criteria.setAccuracy (Criteria.ACCURACY_FINE)

or use

locationManager.getProvider (LocationManager.GPS_PROVIDER)

instead, to force the device to use GPS, thus obtaining the accuracy of the counters.

+3
source

There are a few things here. First, GPS may be inaccurate for a number of reasons. There may be adverse weather conditions, and the other is the visibility of a sufficient number of GPS satellites. The phone itself may have a poor GPS receiver. Finally, your phone may not connect to enough satellites to get an accurate fix.

In particular, your code uses getLastKnownLocation() with an undefined criterion, which, if I call it right, will use any Provider. It is very likely that the network provider is being used, and not your GPS provider. It can take quite a while to establish a good connection with the GPS signal, so getLastKnownLocation will only work if you sit still for a while when your GPS really works (look for the satellite receiver icon in the notification panel). You must implement certain GPS criteria and then implement onLocationChanged to do something once the location is determined.

+3
source

Try the following:

 criteria.setAccuracy(Criteria.ACCURACY_FINE); 
+1
source

Source: https://habr.com/ru/post/1369040/


All Articles