Приложение, которое позволяет делать фото, сохраняет фотографии и отображает превью фотографий на карте в местоположении, где эти фотографии были сделаны.
- Для фото необходимо использовать библиотеку CameraX
- Во время фотографии отслеживать угол наклона телефона и выводить подсказки пользователю
- При сохранении фотографии добавлять координаты местоположения в метаданные фото
- Для отображения превью фото на карте использовать Google Maps
В большей степени приложение реализовано, однако требуется самостоятельно внести изменения и дополнения, чтобы оно собиралось и корректно работало.
В программном коде указанные задачи непосредственно размечены комментариями // TODO в точках внесения изменений.
Приложение, которое позволяет делать фото, сохраняет фотографии и отображает превью фотографий на карте в местоположении, где эти фотографии были сделаны.
- Для фото необходимо использовать библиотеку CameraX
- Во время фотографии отслеживать угол наклона телефона и выводить подсказки пользователю
- При сохранении фотографии добавлять координаты местоположения в метаданные фото
- Для отображения превью фото на карте использовать Google Maps
В большей степени приложение реализовано, однако требуется самостоятельно внести изменения и дополнения, чтобы оно собиралось и корректно работало. В программном коде указанные задачи непосредственно размечены комментариями // TODO в точках внесения изменений.
Проект размещен на GitHub https://github.com/ogndman/OTUS_MapsAndSensorsHW
- Инициализация карты #maps
- В
AndroidManifest.xmlесть блокmeta-data, в значение атрибута ключа android:value вставлена заглушка API key. Получить данный ключ можно через Google Console пройдя гайд https://developers.google.com/maps/documentation/android-sdk/get-api-key. После получения следует вставить его значение вместоYOUR_API_KEY. - В классе
MapsActivity, в переопределенном методеonCreat()необходимо запустить асинхронный процесс инициализации карты обратившись к экземпляру фрагмента карты*mapFragment*и вызвав методgetMapAsync()передав в него реализацию интерфейсаOnMapReadyCallback
- В
- Разрешения #permissions
- В
AndroidManifest.xmlнад блоком<applicationнеобходимо добавить все используемые пермишены для работы с местоположением и картой их может быть от 2-х до 3-х в зависимости от точности получаемого местоположения. - В классе
CameraActivityвcompanion object(внизу класса) в переменнойREQUIRED_PERMISSIONSперечислить требуемые пермишены, которые будут запрашиваться у пользователя при старте активити камеры
- В
- Получение местоположения #location
- В классе
CameraActivityв методеgetLastLocation()осуществить единоразовое получение текущего местоположения пользователя обращаясь к переменнойfusedLocationClientкоторая является экземпляромFusedLocationProviderМожно использоваться вызовыgetCurrentLocation()илиgetLastLocation() - Полученное местоположение – экземпляр класса
Locationнеобходимо передать в обратный вызовcallbackвызвав методinvoke()
- В классе
- Вызов камеры #camera
- В классе
CameraActivityв методеtakePhot()необходимо вызвать код для получения фотографии с камеры. Необходимо обратиться к переменнойimageCaptureи вызвать методtakePicture()передав в сигнатуру метода переменнуюoutputFileOptions,executorможно взять главный поток с помощью вызоваContextCompat.getMainExecutor(this)и созданный экземплярImageCapture.OnImageSavedCallback - В созданном экземпляре
ImageCapture.OnImageSavedCallbackв реализации методаonImageSaved()вывестиToastc сообщением об удачном сохранении фото. - В созданном экземпляре
ImageCapture.OnImageSavedCallbackв реализации методаonImageSaved()установить результат работы активити с помощью методаsetResult()передав в него константуSUCCESS_RESULT_CODEи вызватьfinish()для закрытия активити. - В созданном экземпляре
ImageCapture.OnImageSavedCallbackв реализации методаonError()вывести сообщение об ошибке с помощью любого инструмента и в свободном формате.
- В классе
- Метаданные местоположения в фото #camera
- В классе
CameraActivity, в методеtakePhoto(), при создании объектаoutputFileOptionsчерез методsetMetadata()у билдера, установить метаданные предварительно создавImageCapture.Metadata()с установленным в него свойствомlocationравнымlocationполученным из методаgetLastLocation **{** *location* **->**
- В классе
- Превью фотографии как маркер на карте #maps
- В классе
MapsActivityв методеshowPreviewOnMap()дополнить объектMarkerOptionsсвойствомiconи передатьBitmapDescriptorполученный с помощьюBitmapDescriptorFactoryи переменнойpinBimap - В классе
MapsActivityв методеshowPreviewOnMap()передвинуть камеру к местоположению одного фото с помощью вызоваmap.moveCamera()илиmap.animateCameraс произвольными параметрами
- В классе
- Датчики #sensors
- В классе
CameraActivityв методеonCreate()получить экземплярSensorManagerи присвоить значение переменнойsensorManager - С помощью созданного
sensorManagerпроверить и получить датчик акселерометра и присвоить его как значение переменнойtiltSensor - В методе жизненного цикла активити используя
sensorManagerподписаться на получение данных от датчика через методregisterListenerи слушательsensorEventListener - В методе жизненного цикла активити используя
sensorManagerотписаться от получения данных от датчика через методunregisterListener
- В классе