在您的应用程序中添加 Amazon 位置追踪 - Amazon Location Service

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

在您的应用程序中添加 Amazon 位置追踪

要向示例应用程序添加追踪功能,请按照以下步骤操作:

  1. 为您的项目添加跟踪和身份验证SDK依赖关系。

  2. 在 AndroidManifest .xml 文件中包含权限和服务条目。

  3. 使用 compose 设置开始/停止跟踪按钮代码。

  4. 添加用于创建 LocationTracker 对象并开始和停止跟踪的代码。

  5. 使用安卓模拟器创建测试路线。

  1. 为您的项目添加跟踪和身份验证SDK依赖关系。

    1. 在 “项目” 窗口中,打开 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] ...
    2. 编辑完libs.versions.toml文件后, AndroidStudio 必须重新同步项目。在libs.versions.toml编辑窗口的顶部, AndroidStudio 提示您进行同步。选择 “立即同步” 以同步您的项目,然后再继续。

    3. 在 “项目” 窗口中,在树视图中打开 Gradle 脚本,然后为您的应用程序模块选择build.gradle文件。这将会打开 build.gradle 文件以进行编辑。

    4. 在文件底部的依赖关系部分中,添加以下依赖关系。

      dependencies { ... implementation(libs.auth) implementation(libs.tracking) }
    5. 编辑 Gradle 依赖项后, AndroidStudio 必须重新同步项目。在 build.gradle 编辑窗口的顶部, AndroidStudio 会提示你进行同步。选择同步SyncNow您的项目,然后再继续。

  2. 在 AndroidManifest .xml 文件中包含权限和服务条目。

    1. 要在中包含正确的权限和服务条目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>
  3. 使用 compose 设置开始/停止跟踪按钮代码。

    1. 在名为 ic_pause 和 ic_play 的可绘制对象下添加两张以 res 形式播放和暂停的图像。您也可以从中访问该图像GitHub

    2. 如果文件尚未打开,请按照前面的步骤打开 MapLoadScreen.kt 文件。添加以下代码。这将创建一个 compose Button 视图,我们可以在其中单击它来开始停止跟踪。

      // ...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 }, ) }
  4. 添加用于创建 LocationTracker 对象并开始和停止跟踪的代码。

    1. MainViewModel.kt文件中添加以下代码。

      ... var isLocationTrackingForegroundActive: Boolean by mutableStateOf(false) var locationTracker: LocationTracker? = null
    2. 将以下代码添加到您的 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。

  5. 使用安卓模拟器创建测试路线。

    1. AVD使用安卓工作室启动@@ 模拟器,打开模拟器

    2. 点击模拟器工具栏中的更多(三个点)图标@@ 打开扩展控件

    3. 从边栏中选择 “位置”,打开 “位置”。

    4. 使用GPX数据或单击地图并选择源和目的地数据来@@ 创建路线

    5. 单击 “开始模拟PLAYROUTE,开始模拟GPS路线。

    6. 通过运行您的@@ 应用程序并观察它如何处理模拟路径来测试应用程序。

这是 Android 快速入门应用程序的完整演示。

接下来做什么

您已经完成了快速入门教程,应该对如何使用 Amazon Location Service 来构建应用程序有所了解。

此应用程序的源代码可在上找到GitHub

要了解更多关于 Amazon Location 的信息,您可以查看以下资源: