Precisão gps

Como faço para aumentar a precisão de localização do gps, no meu caso o teste que eu estou fazendo o endereço que o gps está dando é uma rua perto daqui, mais nao a rua que eu estou. alguém consegue me ajudar?

package br.teste;

import java.io.IOException;
import java.util.List;
import java.util.Locale;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.location.Address;
import android.location.Criteria;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.Toast;

public class WebViewActivity extends Activity {
	/** Called when the activity is first created. */

	LocationManager LM = null;
	LocationListener locListener = null;
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		final WebView telaBrowser = (WebView)findViewById(R.id.webview);
		Button b = (Button) findViewById(R.id.cliqueAqui);
		b.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
								
				boolean gps_enabled = false;
				boolean network_enabled = false;

				try {
					gps_enabled = LM.isProviderEnabled(LocationManager.GPS_PROVIDER);
				} catch (Exception ex) {

				}
				try {
					network_enabled = LM.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
				} catch (Exception ex) {

				}

				if (gps_enabled) {
					LM.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locListener);
				}
				if (network_enabled) {
					LM.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locListener);
				}
			}
		});


		telaBrowser.getSettings().setJavaScriptEnabled(true);
		//        telaBrowser.loadUrl("http://www.uol.com.br");
		telaBrowser.loadUrl("file:///android_asset/script.html");
		telaBrowser.getSettings().setJavaScriptEnabled(true);
		telaBrowser.getSettings().setSaveFormData(true);
		telaBrowser.getSettings().setBuiltInZoomControls(true);
		telaBrowser.addJavascriptInterface(new JavaScriptInterface(this, telaBrowser, this), "Android");

		WebViewClient client = new MyWebViewClient(this)
		{
			@Override
			public void launchExternalBrowser(String url) {
				Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
				startActivity(intent);
			}

		};

		telaBrowser.setWebViewClient(client);

		telaBrowser.setWebChromeClient(new MyWebChromeClient(this));

		LM = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
		locListener = new LocListener();

	}

	public void teste() {
//		turnGPSOn(true);
		LM.removeUpdates(locListener);
		Criteria criteria = new Criteria();
		criteria.setAccuracy(Criteria.ACCURACY_FINE);
		criteria.setSpeedRequired(true);
		criteria.setAltitudeRequired(false);
		criteria.setBearingRequired(false);
		criteria.setCostAllowed(true);
		criteria.setPowerRequirement(Criteria.POWER_LOW);
		String bestProvider = LM.getBestProvider(new Criteria(),true);
		Location l = LM.getLastKnownLocation(bestProvider);

		double latitude = l.getLatitude();
		double longitude = l.getLongitude();

		System.out.println(latitude + " - " + longitude);
		Toast.makeText(this, latitude + " | " + longitude, Toast.LENGTH_LONG).show();
		Toast.makeText(this, getAdress(l), Toast.LENGTH_LONG).show();
		
		//		turnGPSOn(false);
	}

	private void turnGPSOn(boolean ativar){
		Intent intent = new Intent("android.location.GPS_ENABLED_CHANGE");
		intent.putExtra("enabled", ativar); //trocar para false para desabilitar
		sendBroadcast(intent);
	}
	
	private String getAdress(Location location) {
		Geocoder gc = new Geocoder(this, Locale.getDefault());

        try {

            List<Address> addresses = gc.getFromLocation(location.getLatitude(), location.getLongitude(), 1);
            StringBuilder sb = new StringBuilder();

            if (addresses.size() > 0) {
                Address address = addresses.get(0);

                for (int i = 0; i < address.getMaxAddressLineIndex(); i++)
                    sb.append(address.getAddressLine(i)).append("\n");

                sb.append(address.getCountryName());
            }
           String addressString = sb.toString();
           
           
           return addressString;
        } catch (IOException e) {
        }
        
        return "";
    } 
	
	private class LocListener implements LocationListener {

		@Override
		public void onLocationChanged(Location location) {
			teste();
		}

		@Override
		public void onProviderDisabled(String provider) {

		}

		@Override
		public void onProviderEnabled(String provider) {

		}

		@Override
		public void onStatusChanged(String provider, int status, Bundle extras) {

		}

	}

}

Nao tenho conhecimento com desenv. mobile, mto menos com gps…

mas penso que essa precisao depende mais do hardware do que do software, visto também que vc usa bibliotecas proprias do android para isso ja, sem nenhuma lógica para obter a localizacao

import android.location.Location; import android.location.LocationManager;

Isto depende muito do aparelho nem todos tem gps nativo o qual consome muita bateria quando é ligado. Alguns usam as torres de telefonia o que não da uma precisão exata do local… Tendo uma variação comum de 30 metros.

Meu Motorola RAZR nao usa internet pra navegacao do GPS, mas é muito exato, tanto é que falo isso usando ponto de referência passando por uma trilha de trem, e não uma esquina, o que da mais precisão…

Uso o GPS Sygic do android

Mais a forma que eu usei para pegar a latitude e longitude é a forma mais correta?

Cara, então… correto é.

mas acontece o seguinte, vc tá usando a localização pela internet e pelo gps… ele pega mais rapido a da internet (A-GPS, informações que a torre pega da posição dos satelites para agilizar), então provavelmente ele não vai chegar pegar a do GPS (EU ACHO, MAS NAO TENHO CERTEZA), pois vc coloca no onLocationChanged pra chamar aquela função Teste(), que dentro dela tem o removeUpdates, que é quando ele para de solicitar novas localizações… ou seja, ele vai pegar uma posição com uma margem de erro grande pelo A-GPS, que é a do network provider, e vai desativar o provider logo em seguida… sem que a localização seja refinada com o GPS do satélite mesmo.

na minha aplicação, eu pego só o do GPS, e não da internet, que é bem preciso… porém, quando tá em lugar coberto (dentro de casa por exemplo) ele demora mais pra pegar a posição, e normalmente fica com uma margem de erro meio grande mesmo, por causa de reflexo de sinal, e td mais…

quando vc fala “Location l = LM.getLastKnownLocation(bestProvider);”, você tá pegando a posição dos 2 providers e verificando a que tem a menor margem de erro… porém, como você tá falando “removeUpdates” logo que ele pega uma posição nova, então ele vai pegar a da internet mesmo, e logo já desligar… sendo assim, faça o teste de substituir por isso: “getLastKnownLocation(LocationManager.GPS_PROVIDER);” que aí vai pegar só o do gps mesmo… provavelmente vai ficar uma posição melhor, porém, vai demorar mais pra pegar a localização se tiver dentro de casa. Daí pra contornar isso, você pode fazer o requestUpdates antes, pra quando o usuario for usar essa parte do código, o gps já vai ter adiantado a localização (por exemplo, no onCreate da tela que vc vai usar), daí vc coloca o removeUpdates no onClick ao invés de deixar dentro da função Teste() que é chamada logo que acontece o onLocationChanged.

espero ter ajudado e não viajado na maionese… rs