Приложение, которое позволяет делать фото, сохраняет фотографии и отображает превью фотографий на карте в местоположении, где эти фотографии были сделаны.
- Для фото необходимо использовать библиотеку 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()
вывестиToast
c сообщением об удачном сохранении фото. - В созданном экземпляре
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
- В классе