기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
애플리케이션에 Amazon Location 추적 추가
샘플 애플리케이션에 추적을 추가하려면 다음 단계를 따르세요.
프로젝트에 추적 및 인증 SDK 종속성을 추가합니다.
AndroidManifest.xml 파일에 권한 및 서비스 항목을 포함합니다.
compose를 사용하여 추적 시작/중지 버튼 코드를 설정합니다.
LocationTracker 객체를 생성하기 위한 코드를 추가하고 추적을 시작 및 중지합니다.
Android Emulator를 사용하여 테스트 경로를 생성합니다.
프로젝트에 추적 및 인증 SDK 종속성을 추가합니다.
프로젝트 창에서 gradle을 연 다음 트리 보기에서
libs.versions.toml
파일을 엽니다. 그러면 편집할libs.versions.toml
파일이 열립니다. 이제libs.versions.toml
파일에 아래 버전 및 라이브러리 데이터를 추가합니다.[versions] ... auth = "0.0.1" tracking = "0.0.1" [libraries] ... auth = { group = "software.amazon.location", name = "auth", version.ref = "auth" } tracking = { module = "software.amazon.location:tracking", version.ref = "tracking" } [plugins] ...
libs.versions.toml
파일 편집을 완료한 후 프로젝트를 다시 동기화해야 AndroidStudio 합니다.libs.versions.toml
편집 창 상단에서 가 동기화를 AndroidStudio 프롬프트합니다. 계속하기 전에 '지금 동기화'를 선택하여 프로젝트를 동기화합니다.프로젝트 창에서 트리 보기에서 Gradle Scripts를 열고 애플리케이션 모듈의
build.gradle
파일을 선택합니다. 그러면 편집할build.gradle
파일이 열립니다.파일 하단의 종속성 섹션에서 다음 종속성을 추가합니다.
dependencies { ... implementation(libs.auth) implementation(libs.tracking) }
Gradle 종속성 편집을 완료한 후에는 프로젝트를 다시 동기화해야 AndroidStudio 합니다. build.gradle 편집 창 상단에 가 동기화할 것을 AndroidStudio 프롬프트합니다. 계속하기 전에 프로젝트를 동기화SyncNow하려면 를 선택합니다.
AndroidManifest.xml 파일에 권한 및 서비스 항목을 포함합니다.
에 올바른 권한 및 서비스 항목을 포함하려면 파일을 다음 코드로
AndroidManifest.xml file
업데이트합니다.<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.INTERNET"/> <application android:allowBackup="true" android:dataExtractionRules="@xml/data_extraction_rules" android:fullBackupContent="@xml/backup_rules" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.AndroidQuickStartApp" tools:targetApi="31"> <activity android:name=".MainActivity" android:exported="true" android:label="@string/app_name" android:theme="@style/Theme.AndroidQuickStartApp"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
compose를 사용하여 추적 시작/중지 버튼 코드를 설정합니다.
ic_pause 및 ic_play라는 이름의 그리기 가능한 아래에 재생 및 일시 중지 이미지를 res에 추가합니다. 에서 이미지에 액세스할 수도 있습니다GitHub
. 파일이 아직 열리지 않은 경우 이전 절차에서와 같이
MapLoadScreen.kt
파일을 여세요. 다음 코드를 추가합니다. 이렇게 하면 추적을 시작하고 중지할 수 있는 구성 버튼 보기가 생성됩니다.// ...other imports import androidx.compose.material3.Button import androidx.compose.material3.ButtonDefaults @Composable fun MapLoadScreen( mapReadyCallback: OnMapReadyCallback, mainViewModel: MainViewModel, onStartStopTrackingClick: () -> Unit ) { Box( modifier = Modifier .fillMaxWidth() .fillMaxHeight(), ) { MapView(mapReadyCallback) Box( modifier = Modifier .align(Alignment.Center), ) { Image( painter = painterResource(id = R.drawable.red_marker), contentDescription = "marker", modifier = Modifier .size(40.dp) .align(Alignment.Center), ) } if (mainViewModel.isLabelAdded) { Column( modifier = Modifier.fillMaxSize(), verticalArrangement = Arrangement.Bottom ) { Box( modifier = Modifier .fillMaxWidth() .background(Color.White), ) { Text( text = mainViewModel.label, modifier = Modifier .padding(16.dp) .align(Alignment.Center) .testTag("label") .semantics { contentDescription = "label" }, fontSize = 14.sp, ) } Spacer(modifier = Modifier.height(80.dp)) } } Column( modifier = Modifier .fillMaxSize() .padding(bottom = 16.dp), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Bottom, ) { Button( onClick = onStartStopTrackingClick, modifier = Modifier .padding(horizontal = 16.dp) ) { Text( text = if (mainViewModel.isLocationTrackingForegroundActive) "Stop tracking" else "Start tracking", color = Color.Black ) Spacer(modifier = Modifier.size(ButtonDefaults.IconSpacing)) Image( painter = painterResource(id = if (mainViewModel.isLocationTrackingForegroundActive) R.drawable.ic_pause else R.drawable.ic_play), contentDescription = if (mainViewModel.isLocationTrackingForegroundActive) "stop_tracking" else "start_tracking" ) } } } } @Composable fun MapView(mapReadyCallback: OnMapReadyCallback) { AndroidView( factory = { context -> val mapView = org.maplibre.android.maps.MapView(context) mapView.onCreate(null) mapView.getMapAsync(mapReadyCallback) mapView }, ) }
LocationTracker 객체를 생성하기 위한 코드를 추가하고 추적을 시작 및 중지합니다.
MainViewModel.kt
파일에 다음 코드를 추가합니다.... var isLocationTrackingForegroundActive: Boolean by mutableStateOf(false) var locationTracker: LocationTracker? = null
다음 코드를
MainActivity.kt
파일에 추가합니다.// ...other imports import software.amazon.location.auth.AuthHelper import software.amazon.location.auth.LocationCredentialsProvider import software.amazon.location.tracking.LocationTracker import software.amazon.location.tracking.aws.LocationTrackingCallback import software.amazon.location.tracking.config.LocationTrackerConfig import software.amazon.location.tracking.database.LocationEntry import software.amazon.location.tracking.filters.DistanceLocationFilter import software.amazon.location.tracking.filters.TimeLocationFilter import software.amazon.location.tracking.util.TrackingSdkLogLevel class MainActivity : ComponentActivity(), OnMapReadyCallback, MapLibreMap.OnCameraMoveStartedListener, MapLibreMap.OnCameraIdleListener { private val mainViewModel: MainViewModel by viewModels() private val poolId = "
YOUR_AWS_IDENTITY_POOL_ID
" private val trackerName = "YOUR_AWS_TRACKER_NAME
" private val region = "YOUR_AWS_REGION
" private val mapName = "YOUR_AWS_MAP_NAME
" private val apiKey = "YOUR_AWS_API_KEY
" private val coroutineScope = MainScope() private lateinit var locationCredentialsProvider: LocationCredentialsProvider private lateinit var authHelper: AuthHelper override fun onCreate(savedInstanceState: Bundle?) { MapLibre.getInstance(this) super.onCreate(savedInstanceState) setContent { TestMapAppTheme { Surface( modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background ) { MapLoadScreen(this, mainViewModel, onStartStopTrackingClick = { if (mainViewModel.isLocationTrackingForegroundActive) { mainViewModel.isLocationTrackingForegroundActive = false mainViewModel.locationTracker?.stop() } else { if (checkLocationPermission(this)) return@MapLoadScreen mainViewModel.isLocationTrackingForegroundActive = true mainViewModel.locationTracker?.start(locationTrackingCallback = object : LocationTrackingCallback { override fun onLocationAvailabilityChanged(locationAvailable: Boolean) { } override fun onLocationReceived(location: LocationEntry) { } override fun onUploadSkipped(entries: LocationEntry) { } override fun onUploadStarted(entries: ListLocationEntry
) { } override fun onUploaded(entries: ListLocationEntry
) { } }) } }) } } } authenticateUser() } private fun authenticateUser() { coroutineScope.launch { authHelper = AuthHelper(applicationContext) locationCredentialsProvider = authHelper.authenticateWithCognitoIdentityPool( poolId, ) locationCredentialsProvider.let { val config = LocationTrackerConfig( trackerName = trackerName, logLevel = TrackingSdkLogLevel.DEBUG, latency = 1000, frequency = 5000, waitForAccurateLocation = false, minUpdateIntervalMillis = 5000, ) mainViewModel.locationTracker = LocationTracker( applicationContext, it, config, ) mainViewModel.locationTracker?.enableFilter(TimeLocationFilter()) mainViewModel.locationTracker?.enableFilter(DistanceLocationFilter()) } } } private fun checkLocationPermission(context: Context) = ActivityCompat.checkSelfPermission( context, Manifest.permission.ACCESS_FINE_LOCATION, ) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission( context, Manifest.permission.ACCESS_COARSE_LOCATION, ) != PackageManager.PERMISSION_GRANTED override fun onMapReady(map: MapLibreMap) { map.setStyle( Style.Builder() .fromUri( "https://maps.geo.$region.amazonaws.com/maps/v0/maps/$mapName/style-descriptor?key=$apiKey" ), ) { mainViewModel.mapLibreMap = map map.uiSettings.isAttributionEnabled = true map.uiSettings.isLogoEnabled = false map.uiSettings.attributionGravity = Gravity.BOTTOM or Gravity.END val initialPosition = LatLng(47.6160281982247, -122.32642111977668) map.cameraPosition = CameraPosition.Builder() .target(initialPosition) .zoom(14.0) .build() map.addOnCameraMoveStartedListener(this) map.addOnCameraIdleListener(this) map.cameraPosition.target?.let { latLng -> mainViewModel.reverseGeocode( LatLng( latLng.latitude, latLng.longitude ), apiKey ) } } } override fun onCameraMoveStarted(p0: Int) { mainViewModel.label = "" mainViewModel.isLabelAdded = false } override fun onCameraIdle() { if (!mainViewModel.isLabelAdded) { mainViewModel.mapLibreMap?.cameraPosition?.target?.let { latLng -> mainViewModel.reverseGeocode( LatLng( latLng.latitude, latLng.longitude ), apiKey ) } } } }위 코드는 를 사용하여
LocationTracker
객체를 생성하는 방법과 를 사용하여 추적을 시작하고 중지하는AuthHelper
방법을 보여줍니다 LocationTracker.authenticateUser()
: 이 메서드는 AuthHelper 및 LocationTracker 객체를 생성합니다.onStartStopTrackingClick
: 이 콜백은 사용자가 추적 을 사용하여 start/stop tracking button, which will start/stop 추적을 클릭하면 트리거됩니다SDK.
Android Emulator를 사용하여 테스트 경로를 생성합니다.
Android Studio를 AVD 사용하여 를 시작하여 에뮬레이터를 엽니다.
에뮬레이터 도구 모음에서 더 보기(점 3개) 아이콘을 클릭하여 확장 제어를 엽니다.
사이드바에서 Location을 선택하여 Location을 엽니다.
GPX 데이터를 사용하거나 맵을 클릭하고 소스 및 대상 데이터를 선택하여 경로를 생성합니다.
를 클릭하여 GPS 경로 시뮬레이션PLAYROUTE을 시작하여 시뮬레이션을 시작합니다.
애플리케이션을 실행하고 시뮬레이션된 경로를 처리하는 방법을 관찰하여 애플리케이션을 테스트합니다.
Android Quick Start 애플리케이션의 전체 데모입니다.
다음에 있는 것
이제 빠른 시작 튜토리얼을 완료했으니 Amazon Location Service를 사용하여 애플리케이션을 구축하는 방법을 알 수 있습니다.
이 애플리케이션의 소스 코드는 에서 사용할 수 있습니다GitHub
Amazon Location을 최대한 활용하려면 다음 리소스를 확인하세요.
-
Amazon Location Service의 개념에 대해 더 자세히 알아보기
-
Amazon Location 특징 및 기능을 사용하는 방법에 대한 자세한 정보를 확인하세요.
-
Amazon Location을 사용하는 코드 예시를 살펴보고 이 샘플을 확장하고 더 복잡한 애플리케이션을 구축하는 방법 알아보기