Работа с геоданными (lecture 18 – geolocation)
Post on 14-Apr-2017
100 Views
Preview:
TRANSCRIPT
Работа с геоданнымиAndroid
Возможности Android
Работа с кучей сенсоров (если есть на устройстве)
Картографическйи движок (если установлены дополнения Google Play. нет только на Kindle и китайских устройствах)
Все богатство веб-сервисов
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 включетсянеявно.
Получение геоданных
Хорошее приложениеОтдает точные координатыОтдает актуальные координатыЭкономит батарейку
Как это сделатьКэшированиеРабота с разными провайдерами
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 }
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
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 }
Получение местоположения
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, ...)
Особенности геолокации
Геолокация очень затранта по работе с аккумуляторомРекомендуется устанавливать разумные таймауты и отключать геолокационные сервисына время бездействия приложенияГеолокация не всегда отдает точное положение, особенно для статичного объекта(погрешнрость GPS - порядка 50 метров, GSM - до километров)Google специально из соображений безопасности отдает положение в случае определнияпо GSM с большой погрешностьюХолодные старт довольно долгийВ Китае сложно пользоваться:)
Что еще есть
Google Places API:Это web-сервисВыбор и поиск местАвтодополнение адресовПоиск адреса по координатам и в радиусе
Geofencing:GeofenceTransitionsIntentService
Вам будут присылать, когда пользователь в нужно местеActivity Recognition:
Распознавание активности: бег, ходьба, велосипед
Как отобразить
Google API for Android, компонент MapViewGoogle Play Services, компонент MapFragmentYandex mapsWebView + GoogleMaps/Bing Maps/Yandex Maps...3rd-party libraries (OsmDroid, Mapsforge) - OpenStreetMaps, другие движки, можно написатьконнектор к любому сервисуВнешнее приложение (Waze, Google Maps, ...)
Внешнее приложение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"
WebView
Особенности
Перед нам все богатство всяческих веб-сервисовЗагружаем нужную страницу, если необходимо - передаем через параметры позициюМинусы - вся работа через JavaScript WebView позволяет прицепить обработчики на Java ккоду на JavaScript, но это ухудшает быстродействие.Сложнее писать свои дополнительные слои
Как вызвать
Кидаем Intent.ACTION_VIEW с Uri формата веб-сервиса. Обычно это похоже на uri для вызова внешнего приложения.
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%"/>
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...
Google Maps
Можем включить отображениеСпутник GoogleMap.MAP_TYPE_SATELLITEГибрид GoogleMap.MAP_TYPE_HYBRIDУлицы GoogleMap.MAP_TYPE_NORMAL Если эти прелести есть для данной локации
Не надо беспокоиться насчет памяти - MapFragment выделяет память под картинкинативно, использует Bitmap pool. Если оно и решит сломаться, вы сможете толькособолезновать.Можно делать оверлеи!
Маркеры
Отображаем какую-либо точку на экране, по нажатию - баббл с информацией.
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"));
Маркеры
Можно переопределить у GoogleMap:
.setOnMarkerClickListener(OnMarkerClickListener) — вместо показа баббла своё действие.setOnMarkerDragListener(OnMarkerDragListener) — на перетаскивание (по умолчанию не работает).setOnInfoWindowClickListener(OnInfoWindowClickListener) — нажатие на баббл.
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));
Google Maps не всесильны
Ограничения на бесплатное использование Лицензия >>Закрытый исходный кодПривязано к гуглокартамНе все можно модифицировать
Помогут сторонние библиотеки Mapsforge, OsmDroid, другие
Идут в комплекте с коннекторами для других источников карт (OpenStreetMaps)Стараются повторять контракт гуглокарт (легче миграция)Можно подключить свой источник
Тайловые карты
Карта разбивается на квадратикиВ зависимосит от уровня зума обеще число квадратиков больше-меньше(пропорционально степеням двойки)В общих словах, мы должны просто реализовать метод, позволяющий для уровня зума Nпредоставить картинку для квадрата с координатами (X, Y).Движок сам управляет подгрузкой, пока более деталеьные изображения не загрузились,ресмэплит картинки другого масштаба.
Полезные ссылки
Android LocationAndroid Adding MapsGoogle MapsOSMDroidMapsforge
top related