2. Возможности Android
Работа с кучей сенсоров (если есть на устройстве).
Картографический движок (если установлены дополнения
Google Play — нет только на Kindle и чрезмерно китайских
устройствах).
Всё богатство вебсервисов.
2 Работа с геоданными
3. Получение местоположения
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
— разрешает получать информацию из сети (на базе
вышек сотовой связи, wi-fi, и т.д.), соответствует
LocationManager.NETWORK_PROVIDER.
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
— использование GPS, соответствует
LocationManager.GPS_PROVIDER.
Когда мы используем ACCESS_FINE_LOCATION, использование
ACCESS_COARSE_LOCATION включается неявно.
3 Работа с геоданными
4. Получение местоположения
Добавляем в Activity необходимые Listener-ы:
public class MainActivity extends FragmentActivity implements
LocationListener,
GooglePlayServicesClient.ConnectionCallbacks,
GooglePlayServicesClient.OnConnectionFailedListener
{ ...
Реализуем их методы:
public interface LocationListener {
void onLocationChanged(Location location);
}
static interface OnConnectionFailedListener {
void onConnectionFailed(ConnectionResult connectionResult);
}
static interface ConnectionCallbacks {
void onConnected(Bundle bundle);
void onDisconnected();
}
Создаём подключение:
public LocationClient( Context context,
GooglePlayServicesClient.ConnectionCallbacks connectionCallbacks,
GooglePlayServicesClient.OnConnectionFailedListener failedListener) {
LocationClient client = new LocationClient(this, this, this);
}
4 Работа с геоданными
5. Получение местоположения
Создаём запрос:
LocationRequest request = LocationRequest.create();
request.setInterval(5 * 1000); // в мс
request.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
request.setFastestInterval(1 * 1000);
Управляем в пределах времени жизни:
client.connect(); // в onStart
client.disconnect(); // в onStop
client.requestLocationUpdates(request, this);
// стартуем запрос обновлений, получаем через callback
client.removeLocationUpdates(this);
// останавливаем запрос обновлений, нужно делать в onStop
Location currentLocation = client.getLastLocation(); // получаем самое свежее
5 Работа с геоданными
6. Особенности геолокации
Геолокация очень затратна по работе с аккумулятором.
Рекомендуется устанавливать разумные таймауты и
отключать геолокационные сервисы на время бездействия
приложения.
Геолокация не всегда отдаёт точное положение, особенно
для статичного объекта (погрешность GPS — порядка 50
метров, GSM — до километров).
Google специально из соображений безопасности отдаёт
положение в случае определения по GSM с большой
погрешностью.
Холодный старт довольно долгий.
В Китае сложно пользоваться.
6 Работа с геоданными
7. Что есть ещё
Через Geocoding можно узнать не только координаты, но и
текущий адрес.
Geofencing — вам будут присылаться обновления, когда
пользователь находится в определённом месте.
Activity Recognition — определяется вид активности
(ходьба, бег, велосипед, транспорт)
7 Работа с геоданными
8. Как отобразить
Google API for Android, компонент MapView.
Google Play Services, компонент MapFragment.
Yandex maps.
WebView ← Google maps, Bing maps, Yandex maps,
whatever you want.
3rd-party libraries (OsmDroid, Mapsforge) —
OpenStreetMaps, другие движки, можно написать
коннектор к любому сервису.
Внешнее приложение.
8 Работа с геоданными
9. Внешнее приложение
String uri = String.format("geo:%.6f,%.6f?z=%d", latitude, longitude, zoom);
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
startActivity(intent);
9 Работа с геоданными
10. WebView
Перед нами всё богатство всяческих вебсервисов.
Загружаем нужную страницу, если необходимо —
передаём через параметры позицию.
Минусы — вся работа через JavaScript. WebView позволяет
прицепить обработчики на Java к коду на JavaScript, но это
ухудшает быстродействие.
Сложнее писать свои дополнительные слои.
10 Работа с геоданными
11. Google Maps
Подключаем Google Play Services.
Получаем ключ для Google Maps API.
Добавляем описание использования карт в манифест.
Подробнее — https://developers.google.com/
maps/documentation/android/start
11 Работа с геоданными
12. Google Maps
Начиная с API v2, карты отображаются в фрагментах.
<fragment
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.google.android.gms.maps.MapFragment"/>
private GoogleMap map =
((MapFragment)getFragmentManager().findFragmentById(R.id.map)).getMap();
map.setMapType(GoogleMap.MAP_TYPE_HYBRID);
12 Работа с геоданными
13. Google Maps
Можем включить отображение спутниковой карты,
траффика или Street View (всё это, если эти прелести есть
для данной локации).
Не надо беспокоиться насчёт памяти — MapFragment
аллоцирует память под картинки нативно, использует
Bitmap pool. Так что если оно и решит сломаться, вы
сможете только соболезновать.
Можно делать оверлеи!
13 Работа с геоданными
14. Маркеры
Отображаем какую-либо точку на экране, по нажатию — баббл
с информацией.
static final LatLng MELBOURNE = new LatLng(-37.81319, 144.96298);
Marker melbourne = map.addMarker(new MarkerOptions()
.position(MELBOURNE)
.title("Melbourne")
.snippet("Population: 4,137,400"));
14 Работа с геоданными
16. Google Maps
Можно очень классно управлять наклоном, поворотом,
местоположением и анимацией.
private static final LatLng SYDNEY = new LatLng(-33.88,151.21);
private static final LatLng MOUNTAIN_VIEW = new LatLng(37.4, - 122.1);
private GoogleMap map;
map.moveCamera(CameraUpdateFactory.newLatLngZoom(SYDNEY, 15));
map.animateCamera(CameraUpdateFactory.zoomIn());
map.animateCamera(CameraUpdateFactory.zoomTo(10), null, 2000);
CameraPosition cameraPosition = new CameraPosition.Builder()
.target(MOUNTAIN_VIEW)
.zoom(17)
.bearing(90)
.tilt(30)
.build();
map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
16 Работа с геоданными
17. Google Maps не всесильны
Ограничения на бесплатное использование
Закрытый исходный код
Привязано к гуглокартам
Не всё можно модифицировать.
17 Работа с геоданными
18. Google Maps не всесильны
Сторонние библиотеки Mapsforge, OsmDroid, другие.
Идут в комплекте с коннекторами для других источников
карт (OpenStreetMaps).
Стараются повторять контракт гуглокарт (легче миграция).
Можно подключить свой источник.
18 Работа с геоданными
19. Тайловые карты
Карта разбивается на квадратики
В зависимости от уровня зума общее число квадратиков
больше-меньше (пропорционально степеням двойки)
В общих словах, мы должны просто реализовать метод,
позволяющий для уровня зума N предоставить картинку
для квадрата с координатами (X, Y).
Движок сам управляет подгрузкой, пока более детальные
изображения не загрузились, ресэмплит картинки другого
масштаба.
19 Работа с геоданными