Работа с геоданными (lecture 18 – geolocation)

21
Работа с геоданными Android

Upload: noveo

Post on 14-Apr-2017

100 views

Category:

Education


0 download

TRANSCRIPT

Page 1: Работа с геоданными (Lecture 18 – geolocation)

Работа с геоданнымиAndroid

Page 2: Работа с геоданными (Lecture 18 – geolocation)

Возможности Android

Работа с кучей сенсоров (если есть на устройстве)

Картографическйи движок (если установлены дополнения Google Play. нет только на Kindle и китайских устройствах)

Все богатство веб-сервисов

Page 3: Работа с геоданными (Lecture 18 – geolocation)

System permissions1 <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 включетсянеявно.

Page 4: Работа с геоданными (Lecture 18 – geolocation)

Получение геоданных

Хорошее приложениеОтдает точные координатыОтдает актуальные координатыЭкономит батарейку

Как это сделатьКэшированиеРабота с разными провайдерами

1 class LocationActivity extends Activity { 2 private LocationManager locationManager = 3 (LocationManager) getSystemService(Context.LOCATION_SERVICE); 4 5 private LocationListener locationListener = new LocationListener() { 6 void onLocationChanged(Location location) {//крординаты} 7 void onStatusChanged(String provider, int status, Bundle extras) {} 8 void onProviderEnabled(String provider) {} 9 void onProviderDisabled(String provider) {} 10 }; 11 12 void request() { 13 locationManager.requestLocationUpdates( 14 LocationManager.NETWORK_PROVIDER, 0, 0, locationListener); 15 //provider, minTime, minDistance, listener 16 } 17 }

Page 5: Работа с геоданными (Lecture 18 – geolocation)

GoogleApiClient - 1 шаг

1 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 2 package="com.noveogroup.your.application"> 3 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 4 <application...> 5 <meta-data android:name="com.google.android.gms.version" 6 android:value="@integer/google_play_services_version"/> 7 </application> 8 </manifest>

Дальше работаем с LocationServices.FusedLocationApi

Page 6: Работа с геоданными (Lecture 18 – geolocation)

GoogleApiClient - 2 шаг

com.google.android.gms:play-services-location:9.2.1.

1 class LocationGoogleActivity extends Activity { 2 3 private GoogleApiClient googleApiClient; 4 5 public void onCreate() { 6 googleApiClient = new GoogleApiClient.Builder(this) 7 .addApi(LocationServices.API) 8 .addConnectionCallbacks( 9 new ConnectionCallbacks() { 10 void onConnected(Bundle bundle) {} 11 void onConnectionSuspended(int i) {} 12 }) 13 .addOnConnectionFailedListener( 14 new OnConnectionFailedListener() { 15 void onConnectionFailed(ConnectionResult result) {} 16 }) 17 .build(); 18 } 19 20 public void onStart() { googleApiClient.connect(); } 21 public void onStop() { googleApiClient.disconnect(); } 22 }

Page 7: Работа с геоданными (Lecture 18 – geolocation)

Получение местоположения

LocationServices.FusedLocationApi:

1 //доступен ли сервис? 2 LocationAvailability getLocationAvailability(GoogleApiClient client) 3 4 //последние закэшированные координаты 5 Location getLastLocation(GoogleApiClient client) 6 7 //работа с заглушками 8 PendingResult<Status> setMockLocation( 9 GoogleApiClient client, Location mockLocation) 10 PendingResult<Status> setMockMode( 11 GoogleApiClient client, boolean isMockMode) 12 13 //подписки 14 //Стартуем запрос обновлений и получаем через callback 15 PendingResult<Status> requestLocationUpdates(GoogleApiClient client, ...) 16 //Останавливаем запрос обновлений, нужно делать в onStop 17 PendingResult<Status> removeLocationUpdates(GoogleApiClient client, ...)

Page 8: Работа с геоданными (Lecture 18 – geolocation)

Особенности геолокации

Геолокация очень затранта по работе с аккумуляторомРекомендуется устанавливать разумные таймауты и отключать геолокационные сервисына время бездействия приложенияГеолокация не всегда отдает точное положение, особенно для статичного объекта(погрешнрость GPS - порядка 50 метров, GSM - до километров)Google специально из соображений безопасности отдает положение в случае определнияпо GSM с большой погрешностьюХолодные старт довольно долгийВ Китае сложно пользоваться:)

Page 9: Работа с геоданными (Lecture 18 – geolocation)

Что еще есть

Google Places API:Это web-сервисВыбор и поиск местАвтодополнение адресовПоиск адреса по координатам и в радиусе

Geofencing:GeofenceTransitionsIntentService

Вам будут присылать, когда пользователь в нужно местеActivity Recognition:

Распознавание активности: бег, ходьба, велосипед

Page 10: Работа с геоданными (Lecture 18 – geolocation)

Как отобразить

Google API for Android, компонент MapViewGoogle Play Services, компонент MapFragmentYandex mapsWebView + GoogleMaps/Bing Maps/Yandex Maps...3rd-party libraries (OsmDroid, Mapsforge) - OpenStreetMaps, другие движки, можно написатьконнектор к любому сервисуВнешнее приложение (Waze, Google Maps, ...)

Page 11: Работа с геоданными (Lecture 18 – geolocation)

Внешнее приложение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"

Page 12: Работа с геоданными (Lecture 18 – geolocation)

WebView

Особенности

Перед нам все богатство всяческих веб-сервисовЗагружаем нужную страницу, если необходимо - передаем через параметры позициюМинусы - вся работа через JavaScript WebView позволяет прицепить обработчики на Java ккоду на JavaScript, но это ухудшает быстродействие.Сложнее писать свои дополнительные слои

Как вызвать

Кидаем Intent.ACTION_VIEW с Uri формата веб-сервиса. Обычно это похоже на uri для вызова внешнего приложения.

Page 13: Работа с геоданными (Lecture 18 – geolocation)

Google Maps

Подключаем Google Play Services.Регистрируем приложение:

1. Добавляем к приложению свой *.keystore (если нет - генерим новый с помощью keytool)

2. Регистрируем приложение в Google Developers Console3. Создаем новый проект4. В настройках (APIs & auth -> APIs) включаем Google Maps Android API v25. В настройках (APIs & auth -> Credentials) добавляем ключ для Public API access. Пригодятся сертификат из keystore и пакет приложения

Добавляем API_KEY в AndroidManifest1 <meta-data android:name="com.google.android.geo.API_KEY " 2 android:value="%API_KEY%"/>

Page 14: Работа с геоданными (Lecture 18 – geolocation)

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...

Page 15: Работа с геоданными (Lecture 18 – geolocation)

Google Maps

Можем включить отображениеСпутник GoogleMap.MAP_TYPE_SATELLITEГибрид GoogleMap.MAP_TYPE_HYBRIDУлицы GoogleMap.MAP_TYPE_NORMAL Если эти прелести есть для данной локации

Не надо беспокоиться насчет памяти - MapFragment выделяет память под картинкинативно, использует Bitmap pool. Если оно и решит сломаться, вы сможете толькособолезновать.Можно делать оверлеи!

Page 16: Работа с геоданными (Lecture 18 – geolocation)

Маркеры

Отображаем какую-либо точку на экране, по нажатию - баббл с информацией.

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"));

Page 17: Работа с геоданными (Lecture 18 – geolocation)

Маркеры

Можно переопределить у GoogleMap:

.setOnMarkerClickListener(OnMarkerClickListener) — вместо показа баббла своё действие.setOnMarkerDragListener(OnMarkerDragListener) — на перетаскивание (по умолчанию не работает).setOnInfoWindowClickListener(OnInfoWindowClickListener) — нажатие на баббл.

Page 18: Работа с геоданными (Lecture 18 – geolocation)

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));

Page 19: Работа с геоданными (Lecture 18 – geolocation)

Google Maps не всесильны

Ограничения на бесплатное использование Лицензия >>Закрытый исходный кодПривязано к гуглокартамНе все можно модифицировать

Помогут сторонние библиотеки Mapsforge, OsmDroid, другие

Идут в комплекте с коннекторами для других источников карт (OpenStreetMaps)Стараются повторять контракт гуглокарт (легче миграция)Можно подключить свой источник

Page 20: Работа с геоданными (Lecture 18 – geolocation)

Тайловые карты

Карта разбивается на квадратикиВ зависимосит от уровня зума обеще число квадратиков больше-меньше(пропорционально степеням двойки)В общих словах, мы должны просто реализовать метод, позволяющий для уровня зума Nпредоставить картинку для квадрата с координатами (X, Y).Движок сам управляет подгрузкой, пока более деталеьные изображения не загрузились,ресмэплит картинки другого масштаба.