Localização GPS MUITO lenta

Boa tarde,

Estou criando um projeto para conhecimento da ferramenta, desenvolvimento android.

E estou fazendo uma busca via GPS para que quando efetuar um cadastro, grave tbm a localização que foi feito esse cadastro, algo muito simples!

Porém, quando faço uso dessa localização, o GPS demora muito para me retornar a posição exata, questao de 5/8min.

Alguém poderia me dizer o que está de errado nesse meu código, ou o que posso melhorar?

package com.example.cadastrocliente;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteCursor;
import android.database.sqlite.SQLiteDatabase;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.provider.Settings;
import android.view.View;
import android.widget.SimpleCursorAdapter;
import android.widget.Spinner;
import android.widget.Toast;

public class Vendas extends Activity implements LocationListener {

    private double longitude;
    private double latitude;
    private LocationManager lm = null;
    private ProgressDialog pd = null;
        
    @Override
    protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.vendas);
    }
        
    public void onResume() {
            super.onResume();

            Spinner sp = (Spinner) findViewById(R.id.spCliente);

            SQLiteDatabase db = openOrCreateDatabase("cliente.db",
                            Context.MODE_PRIVATE, null);

            Cursor cursor = db.rawQuery(
                            "select _id, nome from clientes order by nome", null);

            String[] from = { "_id", "nome" };
            int[] to = { R.id.txtId, R.id.txtNomeVenda };
            SimpleCursorAdapter ad = new SimpleCursorAdapter(getBaseContext(),
                            R.layout.spinner_venda, cursor, from, to);
            sp.setAdapter(ad);
            db.close();
    }

    public void SalvarVenda(View v) {
            try {
                        
                          /*LocationManager locationmanager = (LocationManager)
                          getSystemService(Context.LOCATION_SERVICE); isGPSEnabled =
                          locationmanager.isProviderEnabled(LocationManager.GPS_PROVIDER);
                          Criteria criteria = new Criteria(); String provider =
                          locationmanager.getBestProvider(criteria, true); Location
                          location = locationmanager.getLastKnownLocation(provider); //ultima localização do gps
                          */
                        
                    lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
                        
                    //String provider = "gps";
                    String provider = LocationManager.GPS_PROVIDER;
                    lm.requestLocationUpdates(provider, 3000, 0, this);
                    pd = ProgressDialog.show(Vendas.this, "Aguarde...", "Buscando Localização...",true,true);
                        
            } catch (Exception ex) {
                    Toast.makeText(getBaseContext(),
                                    "Erro Localização: " + ex.getMessage(), Toast.LENGTH_SHORT)
                                    .show();
            }

    }
        
    public void gravarRegistro(){
            try {
                    // Recuperando o item selecionado do Spinner
                    SQLiteDatabase db = openOrCreateDatabase("cliente.db",
                                    Context.MODE_PRIVATE, null);
                    Spinner sp = (Spinner) findViewById(R.id.spCliente);

                    SQLiteCursor dados = (SQLiteCursor) sp.getAdapter().getItem(
                                    sp.getSelectedItemPosition());

                    ContentValues ctv = new ContentValues();
                    ctv.put("cliente", dados.getInt(0));
                    ctv.put("produto", R.id.edProduto);
                    ctv.put("preco", R.id.editPreco);
                    ctv.put("longitude", longitude);
                    ctv.put("latitude", latitude);

                    if (db.insert("vendas", "_id", ctv) > 0) {
                            Toast.makeText(getBaseContext(), "Gravado com Sucesso!",
                                            Toast.LENGTH_SHORT).show();
                    } else {
                            Toast.makeText(getBaseContext(), "Erro ao gravar",
                                            Toast.LENGTH_SHORT).show();
                    }
                    db.close();
                    finish();
            } catch (Exception ex) {
                    Toast.makeText(getBaseContext(), "Erro: " + ex.getMessage(),
                                    Toast.LENGTH_SHORT).show();
            }
    }
        
        
    @Override
    public void onLocationChanged(Location location) {
            pd.dismiss();
            longitude = location.getLongitude();
            latitude  = location.getLatitude();
            lm.removeUpdates(this);
            gravarRegistro();

    }

    @Override
    public void onProviderDisabled(String provider) {
            Toast.makeText(getBaseContext(), "Necessário ativar o GPS para gravar a localização!",
                            Toast.LENGTH_LONG).show();
            Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);       
            startActivityForResult(intent, 1);  

    }

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

    }

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

    }

Obrigado

Você testou em quais aparelhos?

Testei em um Nexus 4 - Android 4.3, um LG P880 Android 4.1.2 e um Samsung Android 4.04

Em todos ocorreram o mesmo problema de lentidao para buscar a localidade do GPS

Obrigado!

Nesses aparelhos você consegue, no mesmo local, ter a localidade retornada mais rapidamente se usar outro software (tipo google maps)?

Sim, se por exemplo eu usar o proprio facebook que faz a localização pra check in ou o proprio google maps (que sao essas duas ferramentas que eu estou me baseando) a pesquisa da localização é praticamente imediata, demora alguns segundos.

Obrigado

ao invés de dar o requestlocationupdates na hora de salvar, já dá o request na hora que abre a tela… e deixa ele ficar com o gps ligado direto, só atualizando as variaveis de latitude e longitude…

daí até o usuario preencher todos os dados, e td mais, o gps ja vai ter achado, e na hora de salvar vc pega o que tá nas variaveis naquele momento…

e sobre o google maps e o facebook, ele pega mais rapido as informações pq ele nao usa só o GPS_PROVIDER, ele usa também o NETWORK_PROVIDER (que tem uma precisão menor, mas acha mais rapido de acordo com o aGPS, que usa informações da internet pra ajudar e talz)…

se for o caso do teu usuario estar conectado na internet, vc pode usar esses 2 providers aí, e depois usar a função getBestProvider (ou algo parecido com isso), que ele vai pegar o provider que tem menos margem de erro.