LXF162:Android
|
|
|
» Программирование Наладим взаимодействие Android и Google
Android:
Фото на карте
LXF111.tut_adv.jkemp.psd Наш эксперт
Джульетта Кемп пишет статьи для различных изданий и сейчас думает над тем, как бы воспользоваться HTTP-подключением своего телефона к серверу.
Информация о местоположении
Информация о местоположении включает не только широту и долготу, но и кучу других параметров. Для доступа к ним есть несколько методов в классе Location, а для их представления в человеко-читаемом виде пригодится метод toString() – результат получится примерно такой:
Location[mProvider=gps,mTime=1339624800000,
mLatitude=55.0, mLongitude=0.0,mHasAltitude=true,
mAltitude=0.0,mHasSpeed=false,mSpeed=0.0,
mHasBearing=false,mBearing=0.0,mHasAccuracy=
false,mAccuracy=0.0,mExtras= Bundle[mParcelledData.dataSize=4]]
Вот полная информация об этих параметрах:
» Provider – провайдер местоположения, обычные значения – GPS или Network [Сеть]. » Time – время съемки по Гринвичу (в миллисекундах с 1 января 1970 года). » Latitude и Longitude – как следует из названия, широта и долгота в градусах. » hasAltitude, Altitude – если привязка содержит информацию о высоте над уровнем моря (т. е. если hasAltitude равно true), Altitude содержит высоту в метрах. » hasSpeed, Speed – если привязка содержит информацию о скорости, значение Speed будет ненулевым. По умолчанию информации о скорости не содержится. » hasBearing, Bearing – если привязка содержит информацию об азимуте, Bearing содержит направление движения в градусах к востоку от географического севера. На эмуляторе этих данных нет, но на реальном устройстве они бывают. » hasAccuracy, Accuracy – если у провайдера есть данные о точности, Accuracy содержит значение допуска в метрах. » Extras содержит всю дополнительную информацию о привязке в виде пар «имя/значение». Одним из таких параметров может быть число спутников, использованное для получения привязки. Полная строка с параметрами расположения не слишком полезна программе, зато очень полезна программисту. Например, с помощью параметра Bearing можно сориентировать стрелку на карте (также есть метод bearingTo(), который возвращает направление для заданной конечной точки).
Если имеется точная информация о высоте, то ее можно записывать через определенные интервалы времени, чтобы отслеживать свой подъем – это особенно удобно при езде на велосипеде.
Джульетта Кемп пишет простую программу, которая привяжет фотографии к Google Maps с GPS.
На этом уроке мы рассмотрим интерфейс GPS, а также вернемся к некоторым другим компонентам системы, использованным в наших предыдущих статьях – API карты [Map], базы данных [Database] и камеры [Camera]. Подробно этот код мы разбирать не будем, но весь он присутствует на DVD, поэтому при необходимости его можно скопировать, вставить и заставить работать (обратите внимание, что код, помещенный на DVD, не скомпилируется в том виде, как он есть – нужно создать новый проект, вручную или в Eclipse, и импортировать его).
Шаг 1: Базовая настройка GPS
Интерфейс нашего приложения прост: тестовое поле (в котором будет показано местоположение после его определения) и три кнопки: Get Location [Определить местоположение], Take Photo [Сделать снимок] и Show Map of Photos [Показать карту с фотографиями]. На DVD найдите XML-файл res/layout/main.xml. Первые несколько методов в нашем GPSPhoto выглядят так:
private LocationManager lm; private TextView locationText;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
setUpButtons();
locationText = (TextView) findViewById(R.id.location);
lm = (LocationManager) getSystemService(LOCATION_SERVICE);
}
public void setUpButtons() {
Button getLocationButton = (Button) findViewById (R.id.button_getlocation);
getLocationButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
getCurrentLocation();
}
});
}
Задание объекта LocationManager в методе onCreate() позволит нам работать с различными провайдерами и параметрами местоположения. С его помощью мы получаем провайдер местоположения и текущее местоположение в методе getCurrentLocation():
public void getCurrentLocation() {
LocationListener locationListener = new LocationListener() {
public void onLocationChanged(Location location) {
locationText.setText(location.toString());
lm.removeUpdates(this);
}
public void onStatusChanged(String provider, int status, Bundle extras) {}
public void onProviderEnabled(String provider) {} public void onProviderDisabled(String provider){}
};
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
Location lastKnownLocation = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (lastKnownLocation != null) {
locationText.setText(lastKnownLocation.toString());
} else {
locationText.setText(“Последнее местоположение не получить”);
}
}
LocationListener, как можно догадаться по названию, отслеживает изменения местоположения и, заметив таковое, запускает метод onLocationChanged(). Когда местоположение меняется, мы устанавливаем значение текстового поля [TextView] locationText в строковое значение GPS. Остальные методы LocationListener несущественны – пока оставим их пустыми.
По создании LocationListener его нужно зарегистрировать в LocationManager и выбрать провайдера. Здесь мы пользуемся провайдером GPS (если он недоступен, обработку ошибки см. далее). Чтобы воспользоваться провайдером GPS, также нужно установить следующие права доступа в AndroidManifest.xml:
<uses-permission android:name=”android.permission.ACCESS_FINE_LOCATION” />
Иногда на получение информации о местоположении требуется время – в процессе ожидания можно, если удастся, получить последнее известное местоположение вручную и использовать его, пока LocationListener не оповестит нас о следующем.
Если выполнить этот код, у нас получится результат следующего вида:
Location[mProvider=gps,mTime=1338588000000, mLatitude=37.422005,mLongitude=-122.084095,
mHasAltitude=true,mAltitude=0.0,mHasSpeed=false,mSpeed=0.0,mHasBearing=false,mBearing=0.0,mHasAccuracy=false, mAccuracy=0.0,mExtras=Bundle[mParcelledData.dataSize=4]]
Здесь немало параметров, которые могут нам пригодиться – подробности см. во врезке «Информация о местоположениии». Вытащим отсюда широту и долготу и выведем их с тремя знаками после запятой с помощью класса DecimalFormat. Для этого заменим вызов setText() таким кодом:
DecimalFormat latLngFormat = new DecimalFormat(“#.###”);
String lat = Double.toString(Double.valueOf(latLngFormat.format(currentLocation.getLatitude())));
String lng = Double.toString(Double.valueOf(latLngFormat.format(currentLocation.getLongitude()))); locationText.setText(“Шир: “ + lat + “, долг: “ + lng);
Отправьте одно значение перед перезагрузкой эмулятора, затем нажмите на кнопку Get Location и отправьте еще одно, и вы увидите, как значение изменится. Если вы сделаете это еще раз, значение меняться не будет, так как листенер выключен. Конечно, можно оставить его включенным, но это довольно быстро разрядит батарею, поэтому лучше выключать и снова включать его при необходимости. В нашем случае – при каждом вызове getCurrent Location(), т. е. при нажатии кнопки или при съемке фотографии.