Erste Schritte mit dem Consumer SDK für Android

Sie können das Consumer SDK verwenden, um eine einfache, mit den Backend-Diensten der On-demand Rides and Deliveries-Lösung. Sie können eine Fahrt- und Bestellfortschritts-App, die eine aktive Fahrt anzeigen kann, auf Fahrtaktualisierungen zu reagieren und Fahrtfehler zu beheben.

Da das Consumer SDK eine modulare Architektur hat, können Sie die Teile der API, die Sie für Ihre Anwendung verwenden möchten, und integrieren Sie diese eigenen APIs, Back-End-Diensten von Fleet Engine, und zusätzlich APIs der Google Maps Platform.

Mindestsystemanforderungen

Auf dem Mobilgerät muss Android ausgeführt werden. 6,0 (API-Level 23) oder höher.

Build- und Abhängigkeiten-Konfiguration

Consumer SDK-Versionen 1.99.0 und höher sind mit dem Google Maven verfügbar zu erstellen. Der zuvor verwendete Kanal für das private Repository wurde eingestellt.

Gradle

Fügen Sie der Datei build.gradle Folgendes hinzu:

repositories {
    ...
    google()
}

Maven

Fügen Sie der Datei pom.xml Folgendes hinzu:

<project>
  ...
  <repositories>
    <repository>
      <id>google-maven-repository</id>
      <url>https://maven.google.com</url>
    </repository>
  </repositories>
  ...
</project>

Projektkonfiguration

Um das Consumer SDK for Android zu verwenden, muss deine App minSdkVersion 23 oder höher.

Um eine App auszuführen, die mit dem Consumer SDK erstellt wurde, enthält das Android- muss ein Google Play-Dienste installiert haben.

Entwicklungsprojekt einrichten

So richten Sie Ihr Entwicklungsprojekt ein und rufen einen API-Schlüssel ab für das Projekt in der Google Cloud Console:

  1. Erstellen Sie ein neues Google Cloud Console-Projekt oder wählen Sie ein vorhandenes Projekt aus. mit dem Consumer SDK. Warten Sie ein paar Minuten, bis Das neue Projekt ist in der Google Cloud Console sichtbar.

  2. Zum Ausführen der Demo-App muss Ihr Projekt Zugriff auf das Maps SDK haben für Android. Wählen Sie in der Google Cloud Console APIs und Dienste > Bibliothek. Suchen Sie dann nach dem Maps SDK und aktivieren Sie es für Android

  3. Rufen Sie einen API-Schlüssel für das Projekt ab, indem Sie APIs und Dienste > Anmeldedaten > Anmeldedaten erstellen > API-Schlüssel. Weitere Informationen zum Abrufen eines API-Schlüssels finden Sie unter Fordern Sie einen API-Schlüssel an.

Consumer SDK zur App hinzufügen

Das Consumer SDK ist über ein privates Maven-Repository verfügbar. Die enthält das Project Object Model (.pom) des SDK und Javadocs. So fügen Sie Ihrer App das Consumer SDK hinzu:

  1. Richten Sie Ihre Umgebung so ein, dass sie auf das Maven-Repository des Hosts zugreifen kann, wie unter im vorherigen Abschnitt.

    Wenn Sie die Konfiguration der zentralen Abhängigkeitsverwaltung in deklariert haben, settings.gradle, deaktivieren Sie ihn so:

    • Entfernen Sie den folgenden Codeblock in settings.gradle:

      import org.gradle.api.initialization.resolve.RepositoriesMode
      dependencyResolutionManagement {
          repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
          repositories {
              google()
              mavenCentral()
          }
      }
      
  2. Fügen Sie Ihrer Gradle- oder Maven-Konfiguration die folgende Abhängigkeit hinzu. Ersetzen Sie dabei den Parameter VERSION_NUMBER-Platzhalter für die gewünschte Version des Consumer SDK.

    Gradle

    Fügen Sie zum build.gradle Folgendes hinzu:

    dependencies {
      ...
      implementation 'com.google.android.libraries.mapsplatform.transportation:transportation-consumer:VERSION_NUMBER'
    }
    

    Maven

    Fügen Sie zum pom.xml Folgendes hinzu:

    <dependencies>
      ...
      <dependency>
        <groupId>com.google.android.libraries.mapsplatform.transportation</groupId>
        <artifactId>transportation-consumer</artifactId>
        <version>VERSION_NUMBER</version>
      </dependency>
    </dependencies>
    
  3. Das Consumer SDK hängt vom Maps SDK ab. Diese Abhängigkeit wird so konfiguriert, Wenn die Version des Maps SDK nicht explizit definiert ist, wie unten dargestellt, wenn eine neue Version von Maps SDK veröffentlicht wurde, verwendet das Consumer SDK weiterhin die Mindestanforderung unterstützte Maps SDK-Version.

    Gradle

    Fügen Sie zum build.gradle Folgendes hinzu:

    dependencies {
      ...
      implementation 'com.google.android.gms:play-services-maps:18.1.0'
    }
    

    Maven

    Fügen Sie zum pom.xml Folgendes hinzu:

    <dependencies>
      ...
      <dependency>
        <groupId>com.google.android.gms</groupId>
        <artifactId>play-services-maps</artifactId>
        <version>18.1.0</version>
      </dependency>
    </dependencies>
    

API-Schlüssel in die App einfügen

Fügen Sie Ihrer App den API-Schlüssel hinzu, nachdem Sie das Consumer SDK hinzugefügt haben. Sie müssen den Projekt-API-Schlüssel verwenden, den Sie bei der ein Entwicklungsprojekt eingerichtet.

In diesem Abschnitt wird beschrieben, wie Sie Ihren API-Schlüssel speichern, um sicherer zu werden. auf den in Ihrer App verwiesen wird. Sie sollten Ihren API-Schlüssel nicht in Ihre Version einchecken zu steuern. Sie sollte in der Datei local.properties gespeichert werden, im Stammverzeichnis Ihres Projekts. Weitere Informationen zur local.properties-Datei, siehe Gradle-Attributdateien.

Sie können das Secrets Gradle Plugin for Android verwenden, um diese Aufgabe zu optimieren.

So installieren Sie das Plug-in und speichern Ihren API-Schlüssel:

  1. Öffnen Sie die Datei build.gradle auf Stammebene und fügen Sie folgenden Code in das dependencies-Element unter buildscript.

    Groovy

    buildscript {
        dependencies {
            // ...
            classpath "com.google.android.libraries.mapsplatform.secrets-gradle-plugin:secrets-gradle-plugin:2.0.0"
        }
    }
    

    Kotlin

    buildscript {
        dependencies {
            // ...
            classpath("com.google.android.libraries.mapsplatform.secrets-gradle-plugin:secrets-gradle-plugin:2.0.0")
        }
    }
    
  2. Öffnen Sie die Datei build.gradle auf App-Ebene und fügen Sie folgenden Code in den plugins-Element.

    Groovy

    id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin'
    

    Kotlin

    id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin")
    
  3. Wenn Sie Android Studio verwenden, Ihr Projekt mit Gradle synchronisieren.

  4. Öffnen Sie die Datei local.properties in Ihrem Verzeichnis auf Projektebene und fügen Sie den folgenden Code. Ersetzen Sie dabei YOUR_API_KEY durch Ihren eigenen API-Schlüssel.

    MAPS_API_KEY=YOUR_API_KEY
    
  5. Gehen Sie in der Datei AndroidManifest.xml zu com.google.android.geo.API_KEY und aktualisieren Sie das Attribut android:value so:

    <meta-data
        android:name="com.google.android.geo.API_KEY"
        android:value="${MAPS_API_KEY}" />
    

Das folgende Beispiel zeigt ein vollständiges Manifest für eine Beispiel-App:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.consumerapidemo">
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/_AppTheme">

        <meta-data
            android:name="com.google.android.geo.API_KEY"
            android:value="${MAPS_API_KEY}" />

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

Fügen Sie Ihrer App die erforderlichen Quellenangaben hinzu.

Wenn Sie das Consumer SDK in Ihrer App verwenden, müssen Sie Attributionstext und Open-Source-Lizenzen als Teil der rechtlichen Hinweise Ihrer App . Die Quellenangaben sollten am besten als eigenständiges Menüelement im Menüpunkt Info.

Die Lizenzinformationen finden Sie in der Datei "third_party_Licenses.txt". Datei in nicht mehr archivierte AAR-Dateien.

Weitere Informationen finden Sie unter https://developers.google.com/android/guides/opensource. zur Einbindung von Open-Source-Hinweisen.

SDK-Authentifizierung für Verbraucher

Das Consumer SDK ermöglicht die Authentifizierung mithilfe von JSON Web Tokens. Ein JSON Web Token (JWT) ist ein Zugriffstoken auf JSON-Basis, das eine oder mehr Ansprüche auf einen Dienst erheben. Zum Beispiel könnte ein Server ein Token mit dem Anspruch „als Administrator angemeldet“ und vorzugeben, dass an einen Auftraggebenden. Der Kunde könnte dann mit diesem Token nachweisen, ist er als Administrator angemeldet.

Das Consumer SDK verwendet das von der Anwendung bereitgestellte JSON Web Token für die Kommunikation mit der Fleet Engine. Weitere Informationen finden Sie unter Fleet Engine-Authentifizierung und -Autorisierung.

Das Autorisierungstoken muss die Anforderung tripid:TRIP_ID im authorization-Header, wobei TRIP_ID die Fahrt-ID ist. Dies verschafft dem Verbraucher SDK-Zugriff auf Fahrtdetails wie Fahrzeugposition, Route und voraussichtliche Ankunftszeit.

JSON Web Token-Callbacks

Das Consumer SDK registriert einen Callback für ein Autorisierungstoken während der Initialisierung mit der Anwendung. Das SDK ruft die Anwendung auf. um ein Token für alle Netzwerkanfragen abzurufen, die eine Autorisierung erfordern.

Wir empfehlen dringend, die Cache-Autorisierung der Callback-Implementierung Tokens erstellen und sie nur nach Ablauf der expiry-Zeit aktualisieren. Tokens sollten mit einer Ablaufzeit von einer Stunde ausgestellt werden.

Der Rückruf für das Autorisierungstoken gibt an, welches Diensttoken erforderlich ist für den Dienst TripService. Außerdem werden die erforderlichen tripId für den Kontext.

Das folgende Codebeispiel zeigt, wie eine Autorisierung implementiert wird. Callback des Tokens an.

Java

class JsonAuthTokenFactory implements AuthTokenFactory {

  private static final String TOKEN_URL =
      "https://yourauthserver.example/token";

  private static class CachedToken {
    String tokenValue;
    long expiryTimeMs;
    String tripId;
  }

  private CachedToken token;

  /*
  * This method is called on a background thread. Blocking is OK. However, be
  * aware that no information can be obtained from Fleet Engine until this
  * method returns.
  */
  @Override
  public String getToken(AuthTokenContext context) {
    // If there is no existing token or token has expired, go get a new one.
    String tripId = context.getTripId();
    if (tripId == null) {
      throw new RuntimeException("Trip ID is missing from AuthTokenContext");
    }
    if (token == null || System.currentTimeMillis() > token.expiryTimeMs ||
        !tripId.equals(token.tripId)) {
      token = fetchNewToken(tripId);
    }
    return token.tokenValue;
  }

  private static CachedToken fetchNewToken(String tripId) {
    String url = TOKEN_URL + "/" + tripId;
    CachedToken token = new CachedToken();

    try (Reader r = new InputStreamReader(new URL(url).openStream())) {
      com.google.gson.JsonObject obj
          = com.google.gson.JsonParser.parseReader(r).getAsJsonObject();

      token.tokenValue = obj.get("ServiceToken").getAsString();
      token.expiryTimeMs = obj.get("TokenExpiryMs").getAsLong();

      /*
      * The expiry time could be an hour from now, but just to try and avoid
      * passing expired tokens, we subtract 5 minutes from that time.
      */
      token.expiryTimeMs -= 5 * 60 * 1000;
    } catch (IOException e) {
      /*
      * It's OK to throw exceptions here. The error listeners will receive the
      * error thrown here.
      */
      throw new RuntimeException("Could not get auth token", e);
    }
    token.tripId = tripId;

    return token;
  }
}

Kotlin

class JsonAuthTokenFactory : AuthTokenFactory() {

  private var token: CachedToken? = null

  /*
  * This method is called on a background thread. Blocking is OK. However, be
  * aware that no information can be obtained from Fleet Engine until this
  * method returns.
  */
  override fun getToken(context: AuthTokenContext): String {
    // If there is no existing token or token has expired, go get a new one.
    val tripId = 
      context.getTripId() ?: 
        throw RuntimeException("Trip ID is missing from AuthTokenContext")

    if (token == null || System.currentTimeMillis() > token.expiryTimeMs ||
        tripId != token.tripId) {
      token = fetchNewToken(tripId)
    }

    return token.tokenValue
  }

  class CachedToken(
    var tokenValue: String? = "", 
    var expiryTimeMs: Long = 0,
    var tripId: String? = "",
  )

  private companion object {
    const val TOKEN_URL = "https://yourauthserver.example/token"

    fun fetchNewToken(tripId: String) {
      val url = "$TOKEN_URL/$tripId"
      val token = CachedToken()

      try {
        val reader = InputStreamReader(URL(url).openStream())

        reader.use {
          val obj = com.google.gson.JsonParser.parseReader(r).getAsJsonObject()

          token.tokenValue = obj.get("ServiceToken").getAsString()
          token.expiryTimeMs = obj.get("TokenExpiryMs").getAsLong()

          /*
          * The expiry time could be an hour from now, but just to try and avoid
          * passing expired tokens, we subtract 5 minutes from that time.
          */
          token.expiryTimeMs -= 5 * 60 * 1000
        }
      } catch (e: IOException) {
        /*
        * It's OK to throw exceptions here. The error listeners will receive the
        * error thrown here.
        */
        throw RuntimeException("Could not get auth token", e)
      }

      token.tripId = tripId

      return token
    }
  }
}

API initialisieren

Bevor Sie diese Schritte ausführen, wird davon ausgegangen, dass Sie die Funktion die entsprechenden Dienste und das Consumer SDK.

ConsumerApi-Instanz abrufen

Damit du das Consumer SDK verwenden kannst, muss deine App initialisiert werden. ConsumerApi asynchron. Die API ist ein Singleton-Element. Die Initialisierungsmethode verwendet eine AuthTokenFactory. In der Fabrik werden neue Bei Bedarf JWT-Tokens für den Nutzer.

providerId ist die Projekt-ID Ihres Google Cloud-Projekts. Weitere Informationen finden Sie in der Fleet Engine-Nutzerhandbuch finden Sie weitere Informationen zum Erstellen des Projekts.

Deine App sollte die AuthTokenFactory implementieren, wie unter Consumer SDK Authentication (SDK-Authentifizierung für Nutzer).

Java

Task<ConsumerApi> consumerApiTask = ConsumerApi.initialize(
    this, "myProviderId", authTokenFactory);

consumerApiTask.addOnSuccessListener(
  consumerApi -> this.consumerApi = consumerApi);

Kotlin

val consumerApiTask =
  ConsumerApi.initialize(this, "myProviderId", authTokenFactory)

consumerApiTask?.addOnSuccessListener { consumerApi: ConsumerApi ->
  this@YourActivity.consumerApi = consumerApi
}

Maps SDK und Karten-Renderer

Consumer SDK 2.x.x unterstützt das Maps SDK for Android 18.1.0 und höher. Tabelle Im Folgenden finden Sie eine Übersicht über den Standard-Renderer nach Maps SDK-Version und die unterstützten Funktionen. beider Renderer. Wir empfehlen jedoch, den neuesten Renderer zu verwenden, um den alten Renderer zu verwenden, können Sie ihn explizit mit MapsInitializer.initialize()

Maps SDK-Version Unterstützt den neuesten Renderer Unterstützt den alten Renderer Standard-Renderer
V18.1.0 und niedriger Ja Ja Alt*
V18.2.0 Ja Ja Neueste

* Mit der Einführung des neuen Maps Renderer wird standardmäßig der neueste Renderer verwendet.

Maps SDK als Abhängigkeit hinzufügen

Gradle

Fügen Sie zum build.gradle Folgendes hinzu:

dependencies {
  //...
  implementation "com.google.android.gms:play-services-maps:VERSION_NUMBER"
}

Maven

Fügen Sie zum pom.xml Folgendes hinzu:

 <dependencies>
   ...
   <dependency>
     <groupId>com.google.android.gms</groupId>
     <artifactId>play-services-maps</artifactId>
     <version>18.1.0</version>
   </dependency>
 </dependencies>

Initialisieren Sie das Maps SDK, bevor Sie das Consumer SDK initialisieren

Rufen Sie in Ihrem Application- oder Start-up-Kurs Activity MapsInitializer.initialize() Warten Sie mit der Initialisierung auf das Ergebnis der Renderer-Anfrage Consumer SDK:

Java

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  initViews();

  MapsInitializer.initialize(getApplicationContext(), Renderer.LATEST,
      new OnMapsSdkInitializedCallback() {
        @Override
        public void onMapsSdkInitialized(Renderer renderer) {
          switch (renderer) {
            case LATEST:
              Log.i("maps_renderer", "LATEST renderer");
              break;
            case LEGACY:
              Log.i("maps_renderer", "LEGACY renderer");
              break;
          }

          initializeConsumerSdk();
        }
      });
}

Kotlin

fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  setContentView(R.layout.main)
  initViews()

  MapsInitializer.initialize(
    getApplicationContext(), Renderer.LATEST,
    object : OnMapsSdkInitializedCallback() {
      fun onMapsSdkInitialized(renderer: Renderer?) {
        when (renderer) {
          LATEST -> Log.i("maps_renderer", "LATEST renderer")
          LEGACY -> Log.i("maps_renderer", "LEGACY renderer")
        }
        initializeConsumerSdk()
      }
    })
  }

Benutzeroberfläche erstellen

Sie können entweder ConsumerMapFragment oder ConsumerMapView, um die Benutzeroberfläche für Ihr . Mit ConsumerMapFragment können Sie mithilfe eines Fragment und ConsumerMapView ermöglicht die Verwendung eines View Mitfahrgelegenheiten ist die Funktionalität in ConsumerMapView und ConsumerMapFragment, sodass Sie basierend auf den entweder View oder Fragment ist für Ihre Anwendung besser geeignet.

Unterstützung für API 19 (KitKat) und Vektor-Drawables hinzufügen

Wenn Ihr App-Design Unterstützung für API 19-Geräte (KitKat) und Vektor-Drawables benötigt, Fügen Sie Ihrer Aktivität den folgenden Code hinzu. Dieser Code bezieht sich auf AppCompatActivity, um den Vektor-Drawables im Consumer SDK

Java

// ...
import android.support.v7.app.AppCompatActivity;

// ...

public class ConsumerTestActivity extends AppCompatActivity {
  // ...
}

Kotlin

// ...
import android.support.v7.app.AppCompatActivity

// ...

class ConsumerTestActivity : AppCompatActivity() {
  // ...
}

Kartenfragment oder -ansicht hinzufügen

Sie erstellen die Karte für die Anzeige der Journey Share entweder in einem Android-Fragment oder eine Ansicht, die Sie in der XML-Datei für das Anwendungslayout (unter /res/layout. Das Fragment (oder die Ansicht) bietet dann Zugriff auf die Journey. teilen, auf die deine App zugreifen und sie ändern kann. Die Karte enthält auch ein Handle auf das ConsumerController-Element, mit dem deine App steuern und die Reisefreigabe anpassen.

Karte und Controller teilen

Sie definieren die Journey-Sharing-Karte entweder als Fragment (mithilfe ConsumerMapFragment) oder als Ansicht (mit ConsumerMapView) angezeigt werden, wie in den folgenden Codebeispielen. Die Methode onCreate() sollte dann getConsumerGoogleMapAsync(callback), die den ConsumerGoogleMap zurückgibt asynchron im Callback verwendet. Anschließend verwenden Sie ConsumerGoogleMap, um sich und kann bei Bedarf von Ihrer App aktualisiert werden.

ConsumerMapFragment

Sie definieren das Fragment in Ihrer Anwendungslayout-XML-Datei, wie in im folgenden Codebeispiel.

<fragment
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:name="com.google.android.libraries.mapsplatform.transportation.consumer.view.ConsumerMapFragment"
    android:id="@+id/consumer_map_fragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

Der Aufruf von getConsumerGoogleMapAsync() sollte aus onCreate() kommen. .

Java

public class SampleAppActivity extends AppCompatActivity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {

    // Find the ConsumerMapFragment.
    ConsumerMapFragment consumerMapFragment =
        (ConsumerMapFragment) fragmentManager.findFragmentById(R.id.consumer_map_fragment);

    // Initiate the callback that returns the map.
    if (consumerMapFragment != null) {
      consumerMapFragment.getConsumerGoogleMapAsync(
          new ConsumerMapReadyCallback() {
            // The map returned in the callback is used to access the ConsumerController.
            @Override
            public void onConsumerMapReady(@NonNull ConsumerGoogleMap consumerGoogleMap) {
              ConsumerController consumerController = consumerGoogleMap.getConsumerController();
            }
          });
    }
  }

}

Kotlin

class SampleAppActivity : AppCompatActivity() {
  override fun onCreate(savedInstanceState: Bundle?) {
    // Find the ConsumerMapFragment.
    val consumerMapFragment =
      fragmentManager.findFragmentById(R.id.consumer_map_fragment) as ConsumerMapFragment

    consumerMapFragment.getConsumerGoogleMapAsync(
      object : ConsumerMapReadyCallback() {
        override fun onConsumerMapReady(consumerGoogleMap: ConsumerGoogleMap) {
          val consumerController = consumerGoogleMap.getConsumerController()!!
        }
      }
    )
  }
}
ConsumerMapView

Die Ansicht kann entweder in einem Fragment oder in einer Aktivität verwendet werden, wie in Ihrem XML-Datei.

<com.google.android.libraries.mapsplatform.transportation.consumer.view.ConsumerMapView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/consumer_map_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

Der Aufruf von getConsumerGoogleMapAsync() sollte von onCreate() stammen. In muss zusätzlich zum Callback-Parameter die beinhaltende Aktivität oder Fragment und GoogleMapOptions (die null sein können), die die Konfiguration Attribute für die MapView. Die Aktivitäts- oder Fragment-Basisklasse muss entweder eine FragmentActivity bzw. eine Support-Fragment, da sie eine Zugriff auf ihren Lebenszyklus haben.

Java

public class SampleAppActivity extends AppCompatActivity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    ConsumerMapView mapView = findViewById(R.id.consumer_map_view);

    if (mapView != null) {
      mapView.getConsumerGoogleMapAsync(
          new ConsumerMapReadyCallback() {
            // The map returned in the callback is used to access the ConsumerController.
            @Override
            public void onConsumerMapReady(@NonNull ConsumerGoogleMap consumerGoogleMap) {
              ConsumerController consumerController = consumerGoogleMap.getConsumerController();
            }
          }, this, null);
    }
  }

}

Kotlin

class SampleAppActivity : AppCompatActivity() {
  override fun onCreate(savedInstanceState: Bundle?) {
    val mapView = findViewById(R.id.consumer_map_view) as ConsumerMapView

    mapView.getConsumerGoogleMapAsync(
      object : ConsumerMapReadyCallback() {
        // The map returned in the callback is used to access the ConsumerController.
        override fun onConsumerMapReady(consumerGoogleMap: ConsumerGoogleMap) {
          val consumerController = consumerGoogleMap.getConsumerController()!!
        }
      },
      /* fragmentActivity= */ this,
      /* googleMapOptions= */ null,
    )
  }
}

Ein MapView in einem Fragment ist dasselbe wie im obigen Beispiel für MapView in Aktivität, mit der Ausnahme, dass das Fragment das Layout, das die MapView in der onCreateView()-Methode des Fragments.

Java

public class MapViewInFragment extends Fragment {

  @Override
  public View onCreateView(
      @NonNull LayoutInflater layoutInflater,
      @Nullable ViewGroup viewGroup,
      @Nullable Bundle bundle) {
    return layoutInflater.inflate(R.layout.consumer_map_view, viewGroup, false);
  }

}

Kotlin

class MapViewInFragment : Fragment() {
  override fun onCreateView(
    layoutInflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?,
  ): View {
    return layoutInflater.inflate(R.layout.consumer_map_view, viewGroup, false)
  }
}

Den Kamerazoom so anpassen, dass er sich auf eine Reise fokussiert

Mit der standardmäßigen Schaltfläche „Mein Standort“ im Maps SDK wird die Kamera auf den Gerätestandort zentriert.

Wenn gerade eine Sitzung geteilt wird, sollten Sie die Kamera zentrieren um sich auf die Reise und nicht auf den Gerätestandort zu konzentrieren.

Consumer SDK for Android – integrierte Android-Lösung: AutoCamera

Damit Sie sich auf die Reise statt auf den Gerätestandort konzentrieren können, Consumer SDK bietet eine AutoCamera-Funktion, die ist standardmäßig aktiviert. Die Kamera zoomt, um die Route zu fokussieren, zum nächsten Wegpunkt.

AutoCamera

Kameraverhalten anpassen

Wenn Sie das Verhalten der Kamera genauer steuern möchten, können Sie sie deaktivieren oder aktivieren. mit ConsumerController.setAutoCameraEnabled()

ConsumerController.getCameraUpdate() gibt zu diesem Zeitpunkt die empfohlenen Kameragrenzen zurück. Sie können diese CameraUpdate dann als Argument für GoogleMap.moveCamera() oder GoogleMap.animateCamera().

Mitfahrdienste und Karten abrufen

Damit Sie Mitfahrdienste und Karteninteraktionen in Ihrer App unterstützen können, benötigen Sie Zugriff an ConsumerGoogleMap und ConsumerController. ConsumerMapFragment und ConsumerMapView geben beide asynchron zurück „ConsumerGoogleMap“ in ConsumerMapReadyCallback. ConsumerGoogleMap Rückgaberecht ConsumerController von getConsumerController(). Ich kann auf ConsumerGoogleMap und ConsumerController.

Java

private ConsumerGoogleMap consumerGoogleMap;
private ConsumerController consumerController;
private ConsumerMapView consumerMapView;

consumerMapView.getConsumerGoogleMapAsync(
    new ConsumerMapReadyCallback() {
      @Override
      public void onConsumerMapReady(@NonNull ConsumerGoogleMap consumerMap) {
        consumerGoogleMap = consumerMap;
        consumerController = consumerMap.getConsumerController();
      }
    },
    this, null);

Kotlin

var consumerGoogleMap: ConsumerGoogleMap
var consumerController: ConsumerController
val consumerMapView = findViewById(R.id.consumer_map_view) as ConsumerMapView

consumerMapView.getConsumerGoogleMapAsync(
  object : ConsumerMapReadyCallback() {
    override fun onConsumerMapReady(consumerMap: ConsumerGoogleMap) {
      consumerGoogleMap = consumerMap
      consumerController = consumerMap.getConsumerController()
    },
    /* fragmentActivity= */ this,
    /* googleMapOptions= */ null,
  }
)

ConsumerGoogleMap

ConsumerGoogleMap ist eine Wrapper-Klasse für die Klasse GoogleMap. Dadurch kann Ihre App mit der Karte interagieren. Hierzu wird ein API verwendet, das äquivalent zu GoogleMap Mit der Consumer Map können Sie Teilen, um nahtlos mit derselben zugrunde liegenden GoogleMap-Datei zu interagieren. Beispiel: GoogleMap lässt nur eine Callback-Registrierung zu, aber ConsumerGoogleMap unterstützt doppelt registrierte Callbacks. Über diese Callbacks können deine App und deine Mitfahrgelegenheit Callbacks registrieren, die werden sequenziell aufgerufen.

ConsumerController

ConsumerController bietet Zugriff auf Mitfahrdienstfunktionen wie Fahrten überwachen, Fahrtstatus steuern und Standorte festlegen.

Teilen der Reise einrichten

Nachdem das Backend einem Nutzer ein Fahrzeug zugeordnet hat, verwenden Sie JourneySharingSession. um die Benutzeroberfläche der Journey Sharing zu starten. Beim Teilen von Reisen werden die übereinstimmenden Standort und Route des Fahrzeugs. Nachdem Sie das SDK in Ihrer App implementiert haben, können Sie Funktionen zum Überwachen von Fahrten, Überwachen von Updates und Beheben von Fehlern Bei den folgenden Verfahren wird davon ausgegangen, dass die Back-End-Dienste vorhanden sind und dass Ihre für die Vermittlung von Verbrauchern und Fahrzeugen in Betrieb ist.

  1. Listener für ein TripModel-Objekt registrieren, um Details zu erhalten etwa die geschätzte Ankunftszeit und die Entfernung die das Fahrzeug vor der Ankunft zurücklegen muss.

    Java

    // Create a TripModel instance for listening to updates to the trip specified by this trip name.
    String tripName = ...;
    TripModelManager tripModelManager = consumerApi.getTripModelManager();
    TripModel tripModel = tripModelManager.getTripModel(tripName);
    
    // Create a JourneySharingSession instance based on the TripModel.
    JourneySharingSession session = JourneySharingSession.createInstance(tripModel);
    
    // Add the JourneySharingSession instance on the map for updating the UI.
    consumerController.showSession(session);
    
    // Register for trip update events.
    tripModel.registerTripCallback(new TripModelCallback() {
      @Override
      public void onTripETAToNextWaypointUpdated(
          TripInfo tripInfo, @Nullable Long timestampMillis) {
        // ...
      }
    
      @Override
      public void onTripActiveRouteRemainingDistanceUpdated(
          TripInfo tripInfo, @Nullable Integer distanceMeters) {
        // ...
      }
    
      // ...
    });
    

    Kotlin

    // Create a TripModel instance for listening to updates to the trip specified by this trip name.
    val tripName = "tripName"
    val tripModelManager = consumerApi.getTripModelManager()
    val tripModel = tripModelManager.getTripModel(tripName)
    
    // Create a JourneySharingSession instance based on the TripModel.
    val session = JourneySharingSession.createInstance(tripModel)
    
    // Add the JourneySharingSession instance on the map for updating the UI.
    consumerController.showSession(session)
    
    // Register for trip update events.
    tripModel.registerTripCallback(
      object : TripModelCallback() {
        override fun onTripETAToNextWaypointUpdated(
          tripInfo: TripInfo,
          timestampMillis: Long?,
        ) {
          // ...
        }
    
        override fun onTripActiveRouteRemainingDistanceUpdated(
          tripInfo: TripInfo,
          distanceMeters: Int?,
        ) {
          // ...
        }
    
      // ...
    })
    
  2. Konfiguriere deine Fahrt mit TripModelOptions.

    Java

    // Set refresh interval to 2 seconds.
    TripModelOptions tripOptions =
        TripModelOptions.builder().setRefreshIntervalMillis(2000).build();
    tripModel.setTripModelOptions(tripOptions);
    

    Kotlin

    // Set refresh interval to 2 seconds.
    val tripOptions = TripModelOptions.builder().setRefreshIntervalMillis(2000).build()
    tripModel.setTripModelOptions(tripOptions)
    

Teilen der Reise beenden

Deaktivieren Sie die Freigabe von Reiseplänen, wenn sie nicht mehr benötigt werden, z. B. wenn die Hostaktivität gelöscht wird. Dadurch werden auch Netzwerkanfragen an Fleet Engine gestoppt und Speicherlecks verhindert.

Der folgende Beispielcode zeigt, wie Sie die Freigabe von Kaufprozessen beenden.

Java

public class MainActivity extends AppCompatActivity
    implements ConsumerViewModel.JourneySharingListener  {

  // Class implementation

  @Override
  protected void onDestroy() {
    super.onDestroy();

    if (journeySharingSession != null) {
      journeySharingSession.stop();
    }
  }
}

Kotlin

class SampleAppActivity : AppCompatActivity(), ConsumerViewModel.JourneySharingListener {

  // Class implementation

  override fun onDestroy() {
    super.onDestroy()

    journeySharingSession?.stop()
  }
}

Fehler bei Fahrten verarbeiten

Die Methode onTripRefreshError zeigt Fehler an, die während der Fahrtüberwachung auftreten. Zuordnung für das Consumer SDK folgen denselben HTTP/RPC-Richtlinien wie für Google Cloud Platform: Folgende Fehler treten bei der Fahrtüberwachung auf:

HTTP RPC Beschreibung
400 INVALID_ARGUMENT Der Kunde hat einen ungültigen Reisenamen angegeben. Die Fahrtname muss dem Format providers/{provider_id}/trips/{trip_id} Die provider_id muss die ID des Cloud-Projekt, das dem Dienstanbieter gehört.
401 NICHT AUTHENTIFIZIERT Anfrage konnte aufgrund eines Ungültiges JWT-Token. Dieser Fehler tritt auf wenn das JWT-Token ohne Fahrt signiert ist ID oder das JWT-Token ist abgelaufen.
403 PERMISSION_DENIED Kunde hat nicht genügend Berechtigung. Dieser Fehler tritt auf, wenn das JWT Token ungültig ist, hat der Client keine oder die API ist nicht für des Kundenprojekts. Das JWT-Token ist möglicherweise Fehlt oder das Token ist mit einer Fahrt unterschrieben. ID, die nicht mit der angeforderten Reise-ID übereinstimmt.
429 RESOURCE_EXHAUSTED Das Ressourcenkontingent beträgt null oder hat den Wert des Traffics überschreitet das Limit.
503 UNAVAILABLE Dienst nicht verfügbar: In der Regel ist gesunken.
504 DEADLINE_EXCEEDED Die Frist der Anfrage wurde überschritten. Dadurch wird nur passieren, wenn der Aufrufer eine Frist festlegt der kürzer als der Standardwert der Methode ist Frist (d.h., der angeforderte Termin ist nicht damit der Server die Daten Anfrage) und die Anfrage wurde nicht abgeschlossen. innerhalb der Frist einhalten.

Weitere Informationen finden Sie unter Fehlerbehandlung beim Consumer SDK.