Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Verwenden von The MapLibre Native SDK für Android mit Amazon Location Service
Verwenden Sie MapLibreNative
The MapLibre Native SDK für Android ist eine Bibliothek, die auf Mapbox Native
In diesem Tutorial wird beschrieben, wie Sie MapLibre Native SDK für Android in Amazon Location integrieren. Die Beispielanwendung für dieses Tutorial ist als Teil des Amazon Location Service Samples Repository unter verfügbar GitHub
Erstellung der Anwendung: Initialisierung
Um Ihre Anwendung zu initialisieren:
-
Erstellen Sie ein neues Android Studio-Projekt aus der Vorlage Empty Activity.
-
Stellen Sie sicher, dass Kotlin für die Projektsprache ausgewählt ist.
-
Wählen Sie mindestens API 14 SDK aus: Android 4.0 (Ice Cream Sandwich) oder neuer.
-
Öffnen Sie die Projektstruktur und gehen Sie dann zu Datei > Projektstruktur... um den Abschnitt Abhängigkeiten auszuwählen.
-
Wenn diese <All Modules>Option ausgewählt ist, klicken Sie auf die Schaltfläche +, um eine neue Bibliotheksabhängigkeit hinzuzufügen.
-
Fügen Sie AWSSDKAndroid-Version 2.20.0 oder höher hinzu. Zum Beispiel:
com.amazonaws:aws-android-sdk-core:2.20.0
-
Fügen Sie die MapLibre native Version 9.4.0 oder höher SDK für Android hinzu. Zum Beispiel:
org.maplibre.gl:android-sdk:9.4.0
-
Fügen Sie auf Projektebene Ihrer build.gradle-Datei das folgende Maven-Repository hinzu, um auf die Pakete für Android zuzugreifen: MapLibre
allprojects { repositories { // Retain your existing repositories google() jcenter() // Declare the repositories for MapLibre mavenCentral() } }
Die Anwendung erstellen: Konfiguration
So konfigurieren Sie Ihre Anwendung mit Ihren Ressourcen und Ihrer AWS Region:
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="identityPoolId">
us-east-1:54f2ba88-9390-498d-aaa5-0d97fb7ca3bd
</string> <string name="mapName">ExampleMap
</string> <string name="awsRegion">us-east-1
</string> </resources>
Erstellung der Anwendung: Aktivitätslayout
Bearbeitenapp/src/main/res/layout/activity_main.xml
:
-
Füge eine hinzu
MapView
, die die Karte rendert. Dadurch wird auch der ursprüngliche Mittelpunkt der Karte festgelegt. -
Fügen Sie eine hinzu
TextView
, wodurch die Zuordnung angezeigt wird.
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <com.mapbox.mapboxsdk.maps.MapView android:id="@+id/mapView" android:layout_width="match_parent" android:layout_height="match_parent" app:mapbox_cameraTargetLat="49.2819" app:mapbox_cameraTargetLng="-123.1187" app:mapbox_cameraZoom="12" app:mapbox_uiAttribution="false" app:mapbox_uiLogo="false" /> <TextView android:id="@+id/attributionView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#80808080" android:padding="5sp" android:textColor="@android:color/black" android:textSize="10sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" tools:ignore="SmallSp" /> </androidx.constraintlayout.widget.ConstraintLayout>
Anmerkung
Sie müssen für jeden Datenanbieter, den Sie verwenden, entweder in Ihrer Anwendung oder in Ihrer Dokumentation eine Wortmarke oder eine Textattribution angeben. Zuordnungszeichenfolgen sind in der Antwort auf den Stildeskriptor unter den Tasten sources.esri.attribution
sources.here.attribution
, und enthalten. source.grabmaptiles.attribution
Wenn Sie Amazon-Standortressourcen mit Datenanbietern verwenden, lesen Sie unbedingt die Servicebedingungen
Erstellung der Anwendung: Transformation anfordern
Erstellen Sie eine Klasse mit SigV4Interceptor
dem Namen „AWSAnfragen abfangen“ und signieren Sie sie mit Signature Version 4. Dies wird bei dem HTTP Client registriert, der zum Abrufen der Kartenressourcen verwendet wird, wenn die Hauptaktivität erstellt wird.
package aws.location.demo.okhttp import com.amazonaws.DefaultRequest import com.amazonaws.auth.AWS4Signer import com.amazonaws.auth.AWSCredentialsProvider import com.amazonaws.http.HttpMethodName import com.amazonaws.util.IOUtils import okhttp3.HttpUrl import okhttp3.Interceptor import okhttp3.Request import okhttp3.Response import okio.Buffer import java.io.ByteArrayInputStream import java.net.URI class SigV4Interceptor( private val credentialsProvider: AWSCredentialsProvider, private val serviceName: String ) : Interceptor { override fun intercept(chain: Interceptor.Chain): Response { val originalRequest = chain.request() if (originalRequest.url().host().contains("amazonaws.com")) { val signer = if (originalRequest.url().encodedPath().contains("@")) { // the presence of "@" indicates that it doesn't need to be double URL-encoded AWS4Signer(false) } else { AWS4Signer() } val awsRequest = toAWSRequest(originalRequest, serviceName) signer.setServiceName(serviceName) signer.sign(awsRequest, credentialsProvider.credentials) return chain.proceed(toSignedOkHttpRequest(awsRequest, originalRequest)) } return chain.proceed(originalRequest) } companion object { fun toAWSRequest(request: Request, serviceName: String): DefaultRequest<Any> { // clone the request (AWS-style) so that it can be populated with credentials val dr = DefaultRequest<Any>(serviceName) // copy request info dr.httpMethod = HttpMethodName.valueOf(request.method()) with(request.url()) { dr.resourcePath = uri().path dr.endpoint = URI.create("${scheme()}://${host()}") // copy parameters for (p in queryParameterNames()) { if (p != "") { dr.addParameter(p, queryParameter(p)) } } } // copy headers for (h in request.headers().names()) { dr.addHeader(h, request.header(h)) } // copy the request body val bodyBytes = request.body()?.let { body -> val buffer = Buffer() body.writeTo(buffer) IOUtils.toByteArray(buffer.inputStream()) } dr.content = ByteArrayInputStream(bodyBytes ?: ByteArray(0)) return dr } fun toSignedOkHttpRequest( awsRequest: DefaultRequest<Any>, originalRequest: Request ): Request { // copy signed request back into an OkHttp Request val builder = Request.Builder() // copy headers from the signed request for ((k, v) in awsRequest.headers) { builder.addHeader(k, v) } // start building an HttpUrl val urlBuilder = HttpUrl.Builder() .host(awsRequest.endpoint.host) .scheme(awsRequest.endpoint.scheme) .encodedPath(awsRequest.resourcePath) // copy parameters from the signed request for ((k, v) in awsRequest.parameters) { urlBuilder.addQueryParameter(k, v) } return builder.url(urlBuilder.build()) .method(originalRequest.method(), originalRequest.body()) .build() } } }
Erstellung der Anwendung: Hauptaktivität
Die Hauptaktivität ist für die Initialisierung der Ansichten verantwortlich, die den Benutzern angezeigt werden. Das beinhaltet:
-
Instanziierung eines Amazon Cognito.
CredentialsProvider
-
Registrierung des Signature Version 4-Interceptors.
-
Konfiguration der Karte, indem Sie auf einen Deskriptor für den Kartenstil zeigen und die entsprechende Zuordnung anzeigen.
MainActivity
ist auch dafür verantwortlich, Lebenszyklusereignisse an die Kartenansicht weiterzuleiten, sodass das aktive Ansichtsfenster zwischen Aufrufen beibehalten werden kann.
package aws.location.demo.maplibre import android.os.Bundle import android.widget.TextView import androidx.appcompat.app.AppCompatActivity import aws.location.demo.okhttp.SigV4Interceptor import com.amazonaws.auth.CognitoCachingCredentialsProvider import com.amazonaws.regions.Regions import com.mapbox.mapboxsdk.Mapbox import com.mapbox.mapboxsdk.maps.MapView import com.mapbox.mapboxsdk.maps.Style import com.mapbox.mapboxsdk.module.http.HttpRequestUtil import okhttp3.OkHttpClient private const val SERVICE_NAME = "geo" class MainActivity : AppCompatActivity() { private var mapView: MapView? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // configuration val identityPoolId = getString(R.string.identityPoolId) val region = getString(R.string.awsRegion) val mapName = getString(R.string.mapName) // Credential initialization val credentialProvider = CognitoCachingCredentialsProvider( applicationContext, identityPoolId, Regions.fromName(identityPoolId.split(":").first()) ) // initialize MapLibre Mapbox.getInstance(this, null) HttpRequestUtil.setOkHttpClient( OkHttpClient.Builder() .addInterceptor(SigV4Interceptor(credentialProvider, SERVICE_NAME)) .build() ) // initialize the view setContentView(R.layout.activity_main) // initialize the map view mapView = findViewById(R.id.mapView) mapView?.onCreate(savedInstanceState) mapView?.getMapAsync { map -> map.setStyle( Style.Builder() .fromUri("https://maps.geo.${region}.amazonaws.com/maps/v0/maps/${mapName}/style-descriptor") ) { style -> findViewById<TextView>(R.id.attributionView).text = style.sources.first()?.attribution } } } override fun onStart() { super.onStart() mapView?.onStart() } override fun onResume() { super.onResume() mapView?.onResume() } override fun onPause() { super.onPause() mapView?.onPause() } override fun onStop() { super.onStop() mapView?.onStop() } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) mapView?.onSaveInstanceState(outState) } override fun onLowMemory() { super.onLowMemory() mapView?.onLowMemory() } override fun onDestroy() { super.onDestroy() mapView?.onDestroy() } }
Wenn Sie diese Anwendung ausführen, wird eine Karte im Vollbildmodus im Stil Ihrer Wahl angezeigt. Dieses Beispiel ist als Teil des Amazon Location Service Samples Repository unter verfügbar GitHub