本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
將 Amazon Location 追蹤新增至您的應用程式
若要將追蹤新增至範例應用程式,請依照下列步驟進行:
將追蹤和身分驗證SDK相依性新增至您的專案。
在 AndroidManifest.xml 檔案中包含許可和服務項目。
使用 編寫設定開始/停止追蹤按鈕程式碼。
新增用於建立 LocationTracker 物件的程式碼,以及開始和停止追蹤。
使用 Android Emulator 建立測試路由。
將追蹤和身分驗證SDK相依性新增至您的專案。
在專案視窗中,開啟漸層,然後在樹狀結構檢視中開啟
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 Script,並選取應用程式模組
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>
使用 編寫設定開始/停止追蹤按鈕程式碼。
在名為 ic_pause 和 ic_play 的可繪製 res 中新增兩個 Play and Pause 影像。 您也可以從 存取映像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 建立測試路由。
AVD 使用 Android Studio 啟動 來開啟模擬器。
按一下模擬器工具列中的更多 (三個點) 圖示,開啟延伸控制項。
從側邊列選取位置來開啟位置。
使用GPX資料建立路由,或按一下地圖並選擇來源和目的地資料。
按一下 PLAY ROUTE 以開始模擬 以開始模擬GPS路由。
透過執行您的應用程式並觀察應用程式處理模擬路由的方式來測試應用程式。
這是 Android Quick Start 應用程式的完整示範。
下一步是什麼
您已完成快速入門教學課程,並應了解如何使用 Amazon Location Service 建置應用程式。
此應用程式的原始程式碼可在 上取得GitHub
若要進一步了解 Amazon Location,您可以查看下列資源:
-
查看使用 Amazon Location 的程式碼範例,了解如何擴展此範例並建置更複雜的應用程式