не удается получить текущее географическое местоположение в Android

#android

#Android

Вопрос:

я должен создать приложение для Android, в котором мне нужно найти текущее местоположение пользователя, а затем получить множество значений широты и длины из базы данных. После этого мне нужно найти расстояние между текущим местоположением пользователя и широтой, длинами …. и для всех тех расстояний, которые меньше 200 км, мне нужно добавить их в список.

ПРОБЛЕМА: я не могу найти текущее местоположение пользователя, и я всегда получаю 0,0. Я протестировал то же самое на эмуляторе, передав координаты с помощью DDMS. Я также пробовал то же самое на реальном устройстве, но все равно получаю 0,0 в качестве широты, long. Также вычисляемое расстояние неверно.

Вот мой код:

     LocationManager lm;
LocationListener ll;
@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.nearactivity);
    mHandler= new Handler();
    lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    ll = new mylocationlistener();
    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, ll);
    showProgress();
}

private void showProgress() {
    pd = new ProgressDialog(NearActivity.this);
    pd.setTitle("Nautic-Dates");
    pd.setMessage("Loading");
    pd.show();
    GetLocations gl = new GetLocations();
    gl.execute();
    try {
        setListAdapter(new CustomeAdapter(gl.get()));
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ExecutionException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    pd.dismiss();
}

public class GetLocations extends AsyncTask<Void, Void, ArrayList<String>> {

    @Override
    protected ArrayList<String> doInBackground(Void... arg0) {
        HandleDatabase hb = new HandleDatabase();
        String locations[] = hb.getLocationsFromDatabase();
        ArrayList<String> nearlocations = new ArrayList<String>();
        CustomGeoCoder cg = new CustomGeoCoder();
        for (int i = 0; i < locations.length; i  ) {
            String details[] = locations[i].split("--");
            if (details[0].trim().equals("")
                    || details[1].trim().equals("")||details[0].trim().equals("null")
                    || details[1].trim().equals("null")) {
                continue;
            } else {
                float distance = cg.checkLocation(details[0], details[1]);
                if (distance<RADIUS) {
                    nearlocations.add(locations[i] "--" distance);
                }
            }
        }
        return  nearlocations;
    }

}

public class CustomGeoCoder {


    public float checkLocation(String string, String string2) {
        Location locationA = new Location("pointA");

        Log.i("current loc", "lat "   lat   " lng "   lng);
        Log.i("checklocation loc", "lat "   string   " lng "   string2);
        locationA.setLatitude(lat);
        locationA.setLongitude(lng);

        Location locationB = new Location("pointB");

        try {
            locationB.setLatitude(Double.parseDouble(string));
        } catch (NumberFormatException e) {
            try {
                locationB.setLatitude(Float.parseFloat(string));
            } catch (NumberFormatException e1) {
                try {
                    locationB.setLatitude(Integer.parseInt(string));
                } catch (NumberFormatException e2) {
                    e2.printStackTrace();
                    return RADIUS 1;
                }

            }
        }
        try {
            locationB.setLongitude(Double.parseDouble(string2));
        } catch (NumberFormatException e) {
            try {
                locationB.setLongitude(Float.parseFloat(string2));
            } catch (NumberFormatException e1) {
                try {
                    locationB.setLongitude(Integer.parseInt(string2));
                } catch (NumberFormatException e2) {
                    e2.printStackTrace();
                    return RADIUS 1;
                }
            }
        }

        float distance = locationA.distanceTo(locationB);

//this code is returning wrong values.
        return distance/1000;
//          Log.i("distance", ""   distance);
//          if (distance / 1000 > RADIUS)
//              return false;
//          else
//              return true;
    }

}

private class mylocationlistener implements LocationListener {
    @Override
    public void onLocationChanged(Location location) {
        if (location != null) {
            Log.d("LOCATION CHANGED", location.getLatitude()   "");
            Log.d("LOCATION CHANGED", location.getLongitude()   "");
            lat = location.getLatitude();
            lng = location.getLongitude();
            Toast.makeText(NearActivity.this,"lng=" lng " lat=" lat, Toast.LENGTH_SHORT);
            showProgress();
        }
    }

    @Override
    public void onProviderDisabled(String provider) {
    }

    @Override
    public void onProviderEnabled(String provider) {
    }

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

я не могу понять, что происходит не так?

заранее благодарим вас за помощь.

Комментарии:

1. Ваш Android Manifest.xml содержит надлежащую авторизацию? ( developer.android.com/reference/android / … ) и вы видите что-нибудь в журнале?

2. да. я вижу следующее: 05-09 17:48: 59.877: INFO / current loc (1573): lat 0.0 lng 0.0 05-09 17:48:59.877: INFO / checklocation loc (1573): lat 41.2834563 lng -70.0994605

3. почему я получаю расстояние 0 из метода distanceTo?

Ответ №1:

Я загрузил ваш код в Eclipse, и хотя у меня нет его для запуска, потому что у меня, очевидно, нет ни вашего HandleDatabase кода класса, ни вашего CustomAdapter . Однако, что меня поразило, так это то, что, похоже, вы повторно используете lat и lon в качестве членов объекта для Activity, или вы не определили их как переменные в используемых методах. Я предлагаю разбить ваш код на автономные блоки, которые люди здесь могли бы более легко отладить для вас.