#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, или вы не определили их как переменные в используемых методах. Я предлагаю разбить ваш код на автономные блоки, которые люди здесь могли бы более легко отладить для вас.