Android için Tüketici SDK'sını Kullanmaya Başlama

Tüketici SDK'sını kullanarak temel bir tüketici uygulaması geliştirip çalıştırabilirsiniz: İsteğe Bağlı Yolculuklar ve Teslimatlar Çözümü arka uç hizmetleriyle entegredir. Proje bilgilerini bir Gezi ve Sipariş İlerlemesi uygulaması, ve gezi güncellemelerini yapın.

Tüketici SDK'sının modüler bir mimarisi olduğu için entegre etmek için kullanabileceğiniz bir API'ye ihtiyacınız var. API'leriniz, Fleet Engine tarafından sağlanan arka uç hizmetleri ve Google Maps Platform'un gelişmiş API'lerini kullanıma sunduk.

Minimum sistem gereksinimleri

Mobil cihazda Android yüklü olmalıdır. 6,0 (API düzeyi 23) veya üzeri.

Derleme ve bağımlılık yapılandırması

Tüketici SDK'sı 1.99.0 ve sonraki sürümleri Google Maven kullanılarak kullanılabilir depodur. Daha önce kullanılan özel depo kanalı kullanımdan kaldırıldı.

Gradle

build.gradle dosyanıza aşağıdakileri ekleyin:

repositories {
    ...
    google()
}

Maven

pom.xml dosyanıza aşağıdakileri ekleyin:

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

Proje Yapılandırması

Android için Tüketici SDK'sını kullanmak istiyorsanız uygulamanızın minSdkVersion 23 veya sonraki sürümler.

Android, Consumer SDK ile oluşturulmuş bir uygulamayı çalıştırmak için cihazda şunlar olmalıdır: Google Play Hizmetleri yüklendi.

Geliştirme projenizi oluşturun

Geliştirme projenizi oluşturmak ve API anahtarı almak için Google Cloud Console'da projeniz için:

  1. Kullanmak için yeni bir Google Cloud Console projesi oluşturun veya mevcut bir projeyi seçin . Birkaç dakika bekleyin. Google Cloud Console'da görünür olduğundan emin olun.

  2. Demo uygulamayı çalıştırmak için projenizin Haritalar SDK'sına erişimi olmalıdır Android için. Google Cloud Console'da aşağıdakilerden birini seçin: API'ler ve Hizmetler > Kitaplık'ı tıklayın, ardından şunun için Haritalar SDK'sını arayın: Android

  3. Şu seçeneği belirleyerek proje için bir API anahtarı alın: API'ler ve Hizmetler > Kimlik Bilgileri > Kimlik bilgileri oluştur > API anahtarı. API anahtarı alma hakkında daha fazla bilgi için bkz. API anahtarı alın.

Tüketici SDK'sını uygulamanıza ekleyin

Tüketici SDK'sı özel bir Maven deposu üzerinden kullanılabilir. İlgili içeriği oluşturmak için kullanılan deposu, SDK'nın Proje Nesne Modeli (.pom) dosyalarını ve Javadocs'u içerir. Tüketici SDK'sını uygulamanıza eklemek için:

  1. Ortamınızı, ana makine Maven deposuna erişecek şekilde ayarlayın. Bunun için aşağıdaki adımları uygulayın: geri dönüp bakarsınız.

    Şurada beyan edilen merkezi bağımlılık yönetimi yapılandırmanızı varsa: settings.gradle, aşağıdaki gibi devre dışı bırakın.

    • settings.gradle ürününde aşağıdaki kod bloğunu kaldırın:

      import org.gradle.api.initialization.resolve.RepositoriesMode
      dependencyResolutionManagement {
          repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
          repositories {
              google()
              mavenCentral()
          }
      }
      
  2. Aşağıdaki bağımlılığı Gradle veya Maven yapılandırmanıza ekleyin. Tüketici SDK'sının istenen sürümü için VERSION_NUMBER yer tutucusu.

    Gradle

    build.gradle cihazınıza şunları ekleyin:

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

    Maven

    pom.xml cihazınıza şunları ekleyin:

    <dependencies>
      ...
      <dependency>
        <groupId>com.google.android.libraries.mapsplatform.transportation</groupId>
        <artifactId>transportation-consumer</artifactId>
        <version>VERSION_NUMBER</version>
      </dependency>
    </dependencies>
    
  3. Tüketici SDK'sı, Haritalar SDK'sına bağlıdır. Bu bağımlılık Bu şekilde, Haritalar SDK'sı sürümü açıkça belirtilen şekilde tanımlanmamışsa, Haritalar'ın yeni bir sürümü yüklendiğinde aşağıdaki gibi bir derleme yapılandırma dosyası SDK yayınlandıktan sonra, Tüketici SDK'sı minimum izleme ayarlarını kullanmaya devam edecek desteklenen Google Haritalar SDK sürümü gerekir.

    Gradle

    build.gradle cihazınıza şunları ekleyin:

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

    Maven

    pom.xml cihazınıza şunları ekleyin:

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

API anahtarını uygulamanıza ekleyin

Tüketici SDK'sını uygulamanıza ekledikten sonra API anahtarını uygulamanıza ekleyin. geliştirme projenizi oluşturun.

Bu bölümde, daha güvenli olması için API anahtarınızı nasıl depolayacağınız açıklanmaktadır. veya üçüncü taraf uygulamadır. Sürümünüzde API anahtarınızı kontrol etmemelisiniz kontrol sistemi. Bu veriler, local.properties dosyasında depolanmalıdır. klasörünün herhangi bir bölümünde bulunur. Daha fazla bilgi için local.properties dosyası için bkz. Gradle özellikleri dosyaları.

Bu görevi kolaylaştırmak için Android için Secrets Gradle Plugin.

Eklentiyi yüklemek ve API anahtarınızı saklamak için:

  1. Kök düzeyindeki build.gradle dosyanızı açın ve aşağıdaki kodu buildscript altında dependencies öğesi.

    Modern

    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. Uygulama düzeyindeki build.gradle dosyanızı açın ve aşağıdaki kodu plugins öğesi.

    Modern

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

    Kotlin

    id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin")
    
  3. Android Studio kullanıyorsanız projenizi Gradle ile senkronize edin.

  4. Proje düzeyindeki dizinde local.properties dosyasını açın ve aşağıdaki kodu kullanabilirsiniz. YOUR_API_KEY kısmını API anahtarınızla değiştirin.

    MAPS_API_KEY=YOUR_API_KEY
    
  5. AndroidManifest.xml dosyanızda com.google.android.geo.API_KEY adresine gidin ve android:value özelliğini şu şekilde güncelleyin:

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

Aşağıdaki örnekte, örnek bir uygulama için eksiksiz bir manifest gösterilmektedir:

<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>

Uygulamanıza gerekli ilişkilendirmeleri dahil edin

Uygulamanızda Tüketici SDK'sı kullanıyorsanız şunu eklemelisiniz: uygulamanızın yasal uyarılarının bir parçası olarak atıf metni ve açık kaynak lisansları bölümüne bakın. İlişkilendirmeleri bağımsız bir menü öğesi veya her zaman bir Hakkında menü öğesinin bir bölümüdür.

Lisans bilgileri "third_party_LICENSEs.txt" dosyasında bulunabilir şurada dosyala: arşivden çıkarılan AAR dosyasına dokunun.

https://developers.google.com/android/guides/opensource konusunda daha fazla bilgi edinin.

Tüketici SDK'sı Kimlik Doğrulaması

Tüketici SDK'sı, JSON Web Jetonları kullanarak kimlik doğrulama sağlar. JSON Web Token (JWT), JSON tabanlı bir erişim jetonudur ve hak talebi veya daha fazla talebiniz olur. Örneğin, bir sunucu "giriş, yönetici olarak giriş yapıldı" iddiasına sahip bir jeton ve tüm bunların karar verebilir. Müşteri daha sonra bu jetonu kullanarak yönetici olarak giriş yapıldı.

Tüketici SDK'sı, uygulama tarafından sağlanan JSON Web Jetonu'nu kullanır Fleet Engine ile iletişim kurmak için idealdir. Daha fazla bilgi için Fleet Engine Kimlik Doğrulaması ve Yetkilendirmesi bölümüne bakın.

Yetkilendirme jetonunun jetonunda bir tripid:TRIP_ID talebi bulunmalıdır authorization üstbilgisi; burada TRIP_ID, gezi kimliğidir. Bu, tüketicinin Araç konumu, rota ve TVS dahil olmak üzere gezi ayrıntılarına SDK erişimi.

JSON Web Jetonu geri çağırmaları

Tüketici SDK'sı bir yetkilendirme jetonu geri çağırması kaydeder ilk kullanıma hazırlama sırasında uygulamayla birlikte yürütülür. SDK, uygulamayı çağırır kullanarak yetkilendirme gerektiren tüm ağ istekleri için bir jeton alabilirsiniz.

Geri çağırma uygulamanızın önbellek yetkilendirmesini kullanmanızı jetonları yenilemeli ve bunları yalnızca expiry zamanı geçtiğinde yenilemelidir. Jetonlar bir saatlik son geçerlilik tarihi olmalıdır.

Yetkilendirme jetonu geri çağırması hangi hizmet jetonunun gerektiğini belirtir TripService hizmeti için. Ayrıca gerekli tripId daha iyi anlamanızı sağlar.

Aşağıdaki kod örneği, bir yetkilendirmenin nasıl uygulanacağını gösterir jeton geri çağırması.

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'yi başlatma

Bu prosedürler uygulanmadan önce ve Tüketici SDK'sını kullanabilirsiniz.

ConsumerApi örneğini alın

Tüketici SDK'sını kullanmak için uygulamanızın başlatılması gerekiyor eşzamansız olarak ConsumerApi. API tek bir API'dir. Başlatma yöntemi AuthTokenFactory sürer. Fabrikada, yeni mühendisliğin Gerektiğinde kullanıcı için JWT jetonları.

providerId, Google Cloud projenizin proje kimliğidir. Bkz. Fleet Engine Kullanım Kılavuzu göz atmayı unutmayın.

Uygulamanız, AuthTokenFactory öğesini şurada açıklandığı şekilde kullanmalıdır: Tüketici SDK'sı Kimlik Doğrulaması.

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
}

Haritalar SDK'sı ve harita oluşturucuları

Tüketici SDK'sı v2.x.x sürümü, Android 18.1.0 ve üzeri sürümler için Haritalar SDK'sını destekler. Tablo Aşağıda, Haritalar SDK'sı sürümüne göre varsayılan oluşturucu ve desteklenebilirlik düzeyi özetlenmiştir. her iki oluşturucuyu da gösterir. Yine de ihtiyacınız varsa en son oluşturucuyu kullanmanızı öneririz. eski oluşturucuyu kullanmak istiyorsanız bunu, MapsInitializer.initialize().

Haritalar SDK'sı sürümü En son oluşturucuyu destekliyor Eski oluşturucuyu destekler Varsayılan oluşturucu
V18.1.0 ve önceki sürümler Evet Evet Eski*
V18.2.0 Evet Evet Son yüklenenler

* Yeni Haritalar Oluşturucu'nun kullanıma sunulmasıyla Varsayılan olarak Son oluşturucu kullanılır.

Bağımlılık olarak Haritalar SDK'sı ekleme

Gradle

build.gradle cihazınıza şunları ekleyin:

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

Maven

pom.xml cihazınıza şunları ekleyin:

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

Tüketici SDK'sını başlatmadan önce Haritalar SDK'sını başlatın

Application veya başlangıç Activity sınıfınızda şu numarayı arayın: MapsInitializer.initialize() ve başlatmadan önce oluşturucu istek sonucunu bekleyin Tüketici SDK'sı.

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()
      }
    })
  }

Kullanıcı Arayüzünü Oluşturma

ConsumerMapFragment veya için kullanıcı arayüzünü oluşturmak üzere ConsumerMapView kabul edersiniz. ConsumerMapFragment, şunları tanımlamanıza olanak tanır: haritanızı Fragment, ConsumerMapView ise şunu kullanmanıza olanak tanır: View. Araç paylaşma işlevsellik hem ConsumerMapView hem de ConsumerMapFragment: Böylece, ihtiyaçlarınıza göre bir seçim yapabilirsiniz. View veya Fragment, uygulamanız için daha iyidir.

API 19 (KitKat) ve Vector çekilebilir öğeleri için destek

Uygulamanızın tasarımı için API 19 (KitKat) cihazlar ve vektör çekilebilir öğeleri için destek gerekiyorsa aşağıdaki kodu Etkinliğinize ekleyin. Bu kodların kullanım kapsamı AppCompatActivity Tüketici SDK'sındaki vektör çekilebilir öğeleri.

Java

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

// ...

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

Kotlin

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

// ...

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

Harita parçasını veya görünümü ekleme

Yolculuk paylaşımını bir Android parçasında göstermek için harita oluşturursunuz veya bir görünüm oluşturabilirsiniz. Bu görünüm, uygulama düzeni XML dosyanızda ( /res/layout) bilgileri gösterilir. Ardından parça (veya görünüm), yolculuğa erişim sağlar uygulamanızın erişip değiştirebileceği bir harita paylaşımında bulunun. Harita ayrıca ConsumerController için tutma yeri, uygulamanızın kontrol ve kontrol etmesini sağlar. yolculuk paylaşımı deneyimini özelleştirebilirsiniz.

Yolculuk paylaşımı haritası ve denetleyici

Yolculuk paylaşımı haritasını bir parça ( ConsumerMapFragment) veya görünüm olarak (ConsumerMapView kullanılarak) aşağıdaki kod örneğini inceleyebilirsiniz. Sonrasında, onCreate() yönteminiz şunu çağırır: ConsumerGoogleMap değerini döndüren getConsumerGoogleMapAsync(callback) eşzamansız olarak çağırmanızı sağlar. Daha sonra, ConsumerGoogleMap öğesini kullanarak ve gerektiğinde uygulamanız tarafından güncellenebilir.

ConsumerMapFragment

Parçayı aşağıdaki gibi uygulama düzeni XML dosyanızda tanımlarsınız: aşağıdaki kod örneğine bakalım.

<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" />

getConsumerGoogleMapAsync() numaralı telefona yapılacak arama onCreate() kaynağından gelecek yöntemidir.

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

Görünüm, XML dosyası olarak kaydedin.

<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" />

getConsumerGoogleMapAsync() numaralı telefona yapılacak arama onCreate() olacaktır. İçinde geri çağırma parametresine ek olarak, parçası ve yapılandırmayı içeren GoogleMapOptions (boş olabilir) özellikleri MapView için geçerlidir. Etkinlik veya parça temel sınıfı sağladığı için (sırasıyla) bir FragmentActivity veya destek Fragment (sırasıyla) yaşam döngüsüne erişmelerini sağlar.

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,
    )
  }
}

Bir parçadaki MapView, içindeki MapView için yukarıdaki örnekte olduğuyla aynıdır. Ancak parçanın, şunu içeren düzeni şişirmesi dışında: MapView, parça onCreateView() yönteminde kullanılıyor.

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)
  }
}

Bir yolculuğa odaklanmak için kameranın yakınlaştırmasını ayarlama

Haritalar SDK'sında yerleşik olarak bulunan varsayılan Konumum düğmesi, kamerayı cihaz konumuna göre ortalar.

Etkin bir yolculuk paylaşımı oturumu varsa kamerayı ortalamak isteyebilirsiniz. cihaz konumu yerine yolculuğa odaklanmaya çalışın.

Yerleşik Android çözümü için Tüketici SDK'sı: AutoKamera

Cihaz konumu yerine yolculuğa odaklanmanızı sağlamak için Tüketici SDK'sı, otomatik kamera özelliği sayesinde varsayılan olarak etkindir. Kamera, yolculuk paylaşımı rotasına odaklanmak için görüntüyü yakınlaştırır ve seyahat edeceğim bir sonraki ara noktayı gösterin.

AutoCamera

Kamera davranışını özelleştirme

Kamera davranışı üzerinde daha fazla kontrole ihtiyacınız varsa bu özelliği devre dışı bırakabilir veya etkinleştirebilirsiniz ConsumerController.setAutoCameraEnabled() aracılığıyla otomatik kamera.

ConsumerController.getCameraUpdate(), önerilen kamera sınırlarını döndürür. Ardından bu CameraUpdate öğesini bağımsız değişken olarak sağlayabilirsiniz. GoogleMap.moveCamera() veya GoogleMap.animateCamera().

Araç paylaşımına ve haritalara erişme

Uygulamanızda araç paylaşımı ve harita etkileşimini desteklemek için ConsumerGoogleMap ve ConsumerController. ConsumerMapFragment ve ConsumerMapView her ikisi de eşzamansız olarak döndürülür ConsumerMapReadyCallback içinde ConsumerGoogleMap. ConsumerGoogleMap karşılığında iade getConsumerController() satıcısından ConsumerController. Siz ConsumerGoogleMap ve ConsumerController gibi.

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, şunun için bir sarmalayıcı sınıfıdır: GoogleMap sınıf. Uygulamanız için; örneğin, eşlemeye eşdeğer bir API kullanarak haritayla etkileşime geçme GoogleMap Tüketici haritasını kullanmak, uygulamanızı ve yolculuk temelde yer alan aynı Google Haritası ile sorunsuz bir şekilde etkileşimde bulunabilmenizi sağlar. Örneğin, GoogleMap yalnızca tek bir geri arama kaydına izin verir, ancak ConsumerGoogleMap, çift kayıtlı geri çağırmayı destekler. Bu geri çağırma işlevleri, uygulamanızın ve araç paylaşımının çağrılır.

ConsumerController

ConsumerController, şu gibi yolculuk paylaşımı işlevleri için erişim sağlar: seyahatleri izleme, gezi durumunu kontrol etme ve yer belirleme gibi.

Yolculuk paylaşımını ayarlayın

Arka uç, bir tüketiciyi araçla eşleştirdikten sonra JourneySharingSession işlevini kullanın. yolculuk paylaşımı kullanıcı arayüzünü başlatın. Yolculuk paylaşımında, eşleşen bilgiler gösterilir Aracın konumu ve rotası. SDK'yı uygulamanıza ekledikten sonra gezileri izleme, güncellemeleri dinleme ve hataları ele alma işlevleri. Aşağıdaki prosedürlerde arka uç hizmetlerinin yürürlükte olduğu ve Müşterileri araçlarla eşleştirmeye yönelik hizmetler çalışır durumda.

  1. Şununla ilgili ayrıntıları almak için bir TripModel nesnesinde işleyici kaydedin tahmini varış saati ve mesafe gibi bilgiler de içerir. varıştan önce seyahat etmesi gerekir.

    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. TripModelOptions kullanarak gezinizi yapılandırın.

    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)
    

Yolculuk paylaşımını durdur

Artık ihtiyaç duyulmadığında (ör. düzenleyen kullanıcının kaldırılması gibi) yolculuk paylaşımını durdurduğunuzdan emin olun. Yolculuk paylaşımının durdurulması, Fleet Engine'e yapılan ağ isteklerini de durdurur ve bellek sızıntılarını önler.

Aşağıdaki örnek kod, yolculuk paylaşımının nasıl durdurulacağını gösterir.

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()
  }
}

Gezi hatalarını işleme

onTripRefreshError yöntemi, gezi izleme sırasında oluşan hataları gösterir. Tüketici SDK'sı eşleme hataları için belirlenen HTTP/RPC yönergelerine uyun, Google Cloud Platform'a gidin. Gezi izleme sırasında sıklıkla karşılaşılan hatalar şunlardır:

HTTP TBG Açıklama
400 INVALID_ARGUMENT Müşteri, geçersiz bir gezi adı belirtti. İlgili içeriği oluşturmak için kullanılan gezi adı biçime uygun olmalıdır providers/{provider_id}/trips/{trip_id} provider_id, Servis sağlayıcıya ait Cloud projesi.
401 KİMLİK DOĞRULAMADI Aşağıdaki nedenden dolayı isteğin kimliği doğrulanmadı: Geçersiz JWT jetonu. Bu hata oluşur JWT jetonu seyahat olmadan imzalanmışsa id veya JWT jetonunun süresi dolmuş.
403 PERMISSION_DENIED İstemci, izni gerekir. Bu hata, JWT jetonu geçersiz, istemcide mevcut anahtar ya da API, karar vermenize yardımcı olacaktır. JWT jetonu şöyle olabilir: eksik veya jeton bir geziyle imzalanmış istenen gezi kimliğiyle eşleşmeyen kimlik.
429 RESOURCE_EXHAUSTED Kaynak kotası sıfır veya hızdadır sınırı aşıyor.
503 UNAVAILABLE Hizmet kullanılamıyor. Genellikle sunucu düştü.
504 DEADLINE_EXCEEDED İstek son tarihi aşıldı. Bu, yalnızca arayan kişi bir son tarih belirlerse gerçekleşir yöntemin varsayılan değerinden daha kısadır (ör. istenen son tarihin sunucu tarafından işleme alınması için isteği yerine getirilmedi) takip etmeniz gerekir.

Daha fazla bilgi için bkz. Tüketici SDK'sı Hatalarını Giderme.