2. Возможности Android
Работа с кучей сенсоров
(если есть на устройстве)
Картографическйи движок
(если установлены дополнения Google Play.
нет только на Kindle и китайских устройствах)
Все богатство веб-сервисов
3. System permissions
1 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
Разрешает получать информацию из сети
(на базе вышек сотовой связи, wi- , и т.д.),
соответствует LocationManager.NETWORK_PROVIDER.
1 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
Использование GPS,
соответствует LocationManager.GPS_PROVIDER.
*Когда мы используем ACCESS_FUNE_LOCATION, использование ACCESS_COARSE_LOCATION включется
неявно.
8. Особенности геолокации
Геолокация очень затранта по работе с аккумулятором
Рекомендуется устанавливать разумные таймауты и отключать геолокационные сервисы
на время бездействия приложения
Геолокация не всегда отдает точное положение, особенно для статичного объекта
(погрешнрость GPS - порядка 50 метров, GSM - до километров)
Google специально из соображений безопасности отдает положение в случае определния
по GSM с большой погрешностью
Холодные старт довольно долгий
В Китае сложно пользоваться:)
9. Что еще есть
Google Places API:
Это web-сервис
Выбор и поиск мест
Автодополнение адресов
Поиск адреса по координатам и в радиусе
Geofencing:
GeofenceTransitionsIntentService
Вам будут присылать, когда пользователь в нужно месте
Activity Recognition:
Распознавание активности: бег, ходьба, велосипед
10. Как отобразить
Google API for Android, компонент MapView
Google Play Services, компонент MapFragment
Yandex maps
WebView + GoogleMaps/Bing Maps/Yandex Maps...
3rd-party libraries (OsmDroid, Mapsforge) - OpenStreetMaps, другие движки, можно написать
коннектор к любому сервису
Внешнее приложение (Waze, Google Maps, ...)
11. Внешнее приложение
1 static String LOCATION_FORMAT = "geo:%.6f,%.6f";
2 static String ZOOM_FORMAT = "geo:%.6f,%.6f?z=zoom";
3 static String LABEL_FORMAT = "geo:0,0?q=%.6f,%.6f(%s)";
4 static String QUERY_FORMAT = "geo:0,0?q=%s";
5
6 String uri = String.format(ZOOM_FORMAT, latitude, longitude, zoom);
7 Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
8 startActivity(intent);
* все строки должны быть закодированы (encoded)
например "Noveo Group" будет "Noveo%20Group"
12. WebView
Особенности
Перед нам все богатство всяческих веб-сервисов
Загружаем нужную страницу, если необходимо - передаем через параметры позицию
Минусы - вся работа через JavaScript WebView позволяет прицепить обработчики на Java к
коду на JavaScript, но это ухудшает быстродействие.
Сложнее писать свои дополнительные слои
Как вызвать
Кидаем Intent.ACTION_VIEW с Uri формата веб-сервиса.
Обычно это похоже на uri для вызова внешнего приложения.
13. Google Maps
Подключаем Google Play Services.
Регистрируем приложение:
1. Добавляем к приложению свой *.keystore
(если нет - генерим новый с помощью keytool)
2. Регистрируем приложение в Google Developers Console
3. Создаем новый проект
4. В настройках (APIs & auth -> APIs) включаем Google Maps Android API v2
5. В настройках (APIs & auth -> Credentials) добавляем ключ для Public API access.
Пригодятся сертификат из keystore и пакет приложения
Добавляем API_KEY в AndroidManifest
1 <meta-data android:name="com.google.android.geo.API_KEY "
2 android:value="%API_KEY%"/>
14. Google Maps
Начиная с API v2, карты отображаются в фрагментах.
1 <fragment android:id="@+id/map"
2 android:layout_width="match_parent"
3 android:layout_height="match_parent"
4 class="com.google.android.gms.maps.SupportMapFragment"/>
1 MapFragment mapFragment =
2 (MapFragment) getFragmentManager().findFragmentById(R.id.map);
3 GoogleMap mapView = mapFragment.getMap();
4 mapView.setMapType(GoogleMap.MAP_TYPE_HYBRID)
5 //and so on...
15. Google Maps
Можем включить отображение
Спутник GoogleMap.MAP_TYPE_SATELLITE
Гибрид GoogleMap.MAP_TYPE_HYBRID
Улицы GoogleMap.MAP_TYPE_NORMAL Если эти прелести есть для данной локации
Не надо беспокоиться насчет памяти - MapFragment выделяет память под картинки
нативно, использует Bitmap pool. Если оно и решит сломаться, вы сможете только
соболезновать.
Можно делать оверлеи!
16. Маркеры
Отображаем какую-либо точку на экране, по нажатию - баббл с информацией.
1 Marker marker = googleMapView.addMarker(new MarkerOptions()
2 .position(new LatLng(55.049035f, 92.912304f))
3 .title("Noveo city office")
4 .snippet("Lecture about Geodata"));
17. Маркеры
Можно переопределить у GoogleMap:
.setOnMarkerClickListener(OnMarkerClickListener) —
вместо показа баббла своё действие
.setOnMarkerDragListener(OnMarkerDragListener) —
на перетаскивание (по умолчанию не работает)
.setOnInfoWindowClickListener(OnInfoWindowClickListener) —
нажатие на баббл.
18. Google Maps
Можно очень классно управлять наклоном, поворотом, местоположением и анимацией.
1 private static final LatLng SYDNEY = new LatLng(-33.88,151.21);
2 private static final LatLng MOUNTAIN_VIEW = new LatLng(37.4, - 122.1);
3
4 private GoogleMap map;
5
6 map.moveCamera(CameraUpdateFactory.newLatLngZoom(SYDNEY, 15));
7 map.animateCamera(CameraUpdateFactory.zoomIn());
8 map.animateCamera(CameraUpdateFactory.zoomTo(10), null, 2000);
9
10 CameraPosition cameraPosition = new CameraPosition.Builder()
11 .target(MOUNTAIN_VIEW)
12 .zoom(17)
13 .bearing(90)
14 .tilt(30)
15 .build();
16 map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
19. Google Maps не всесильны
Ограничения на бесплатное использование Лицензия >>
Закрытый исходный код
Привязано к гуглокартам
Не все можно модифицировать
Помогут сторонние библиотеки Mapsforge, OsmDroid, другие
Идут в комплекте с коннекторами для
других источников карт (OpenStreetMaps)
Стараются повторять контракт гуглокарт
(легче миграция)
Можно подключить свой источник
20. Тайловые карты
Карта разбивается на квадратики
В зависимосит от уровня зума обеще число квадратиков больше-меньше
(пропорционально степеням двойки)
В общих словах, мы должны просто реализовать метод, позволяющий для уровня зума N
предоставить картинку для квадрата с координатами (X, Y).
Движок сам управляет подгрузкой, пока более деталеьные изображения не загрузились,
ресмэплит картинки другого масштаба.