Gelişmiş gezinme ve izleme özellikleri sunmak için Driver SDK'sını kullanabilirsiniz. ve Sipariş İlerlemesi başvurunuza ekleyin. Sürücü SDK'sı, İsteğe Bağlı Yolculuklar ve Teslimatlar Çözümü Filo Motoru'nda araç konumu ve görev güncellemeleri.
Sürücü SDK'sı, Fleet Engine hizmetlerini ve özel hizmetlerinizi haberdar eder
konumunu ve durumunu görebilirsiniz. Örneğin, araç ONLINE
olabilir
veya OFFLINE
ve gezi ilerledikçe aracın konumu değişir.
Minimum sistem gereksinimleri
Mobil cihaz Android 6.0 sürümünü çalıştırmalıdır (API düzeyi 23) veya üzeri.
Derleme ve bağımlılık yapılandırması
Sürücü SDK'sı 4.99 ve sonraki sürümleri Google Maven deposundan kullanılabilir.
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ı
Sürücü SDK'sını kullanmak için uygulamanızın şunu hedeflemesi gerekir:
minSdkVersion
23 veya sonraki sürümler.
Sürücü SDK'sı ile oluşturulmuş bir uygulamayı çalıştırmak için Android 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:
Kullanmak için yeni bir Google Cloud Console projesi oluşturun veya mevcut bir projeyi seçin Sürücü SDK'sı ile. Birkaç dakika bekleyin. Google Cloud Console'da görünür olduğundan emin olun.
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
Ş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.
Sürücü SDK'sını uygulamanıza ekleyin
Sürücü SDK'sı, Google Maven deposundan edinilebilir. İ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. Sürücü SDK'sını uygulamanıza eklemek için:
Aşağıdaki bağımlılığı Gradle veya Maven yapılandırmanıza ekleyin. Sürücü 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-driver:VERSION_NUMBER' }
Maven
pom.xml
cihazınıza şunları ekleyin:<dependencies> ... <dependency> <groupId>com.google.android.libraries.mapsplatform.transportation</groupId> <artifactId>transportation-driver</artifactId> <version>VERSION_NUMBER</version> </dependency> </dependencies>
Sürücü SDK'sı, Navigasyon SDK'sına bağlıdır. Bu bağımlılık Bu şekilde, belirli bir Gezinme SDK'sı sürümü gerekiyorsa o sürümün aşağıdaki gibi derleme yapılandırma dosyasında açıkça tanımlanır, belirtilen kod bloğunun atlanması, projenin her zaman Navigasyon SDK'sının ana sürüm sürümüne sahip olması gerekir. Driver SDK'nın son sürümlerinin ve bu sürümlerin birlikte çalışan Gezinme SDK'sı, yayınlanmadan önce titiz testlerden geçmiştir.
Geliştirme ve sürümünüzün bağımlılık yapılandırmasını düzenleyin uygun şekilde düzenlemenizi sağlar.
Gradle
build.gradle
cihazınıza şunları ekleyin:dependencies { ... implementation 'com.google.android.libraries.navigation:navigation:5.0.0' }
Maven
pom.xml
cihazınıza şunları ekleyin:<dependencies> ... <dependency> <groupId>com.google.android.libraries.navigation</groupId> <artifactId>navigation</artifactId> <version>5.0.0</version> </dependency> </dependencies>
API anahtarını uygulamanıza ekleyin
Driver SDK'sını uygulamanıza ekledikten sonra API anahtarını uygulamanıza ekleyin. Siz 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:
Kök düzeyindeki
build.gradle
dosyanızı açın ve aşağıdaki kodubuildscript
altındadependencies
öğ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") } }
Uygulama düzeyindeki
build.gradle
dosyanızı açın ve aşağıdaki koduplugins
öğesi.Modern
id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin'
Kotlin
id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin")
Android Studio kullanıyorsanız projenizi Gradle ile senkronize edin.
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
AndroidManifest.xml
dosyanızdacom.google.android.geo.API_KEY
adresine gidin veandroid: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.driverapidemo">
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_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 Sürücü SDK'sını kullanıyorsanız uygulamanızın yasal uyarılarının bir parçası olarak atıf metni ve açık kaynak lisansları bölümüne ekleyin. İ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.
Bağımlılıklar
ProGuard kullanıyorsanız derlemelerinizi optimize etmek için aşağıdaki satırları ProGuard'a eklemeniz gerekebilir: yapılandırma dosyası:
-dontwarn com.google.**
-dontwarn okio.**
Desteklenen minimum API düzeyi 23'tür.
SDK'yı Başlatma
Şu işlemleri gerçekleştirmek için bir sağlayıcı kimliği (genellikle Google Cloud proje kimliği) gereklidir:
DriverContext
nesnesini başlatın. Chrome Tarayıcı'yı kurma hakkında daha fazla
Google Cloud projesi için bkz.
Authentication and Authorization (Kimlik Doğrulama ve Yetkilendirme).
Sürücü SDK'sını kullanmadan önce ilk kullanıma hazırlamanız gerekir gezinme SDK'sı. SDK'yı başlatmak için:
NavigationApi
öğesinden birNavigator
nesnesi alın.Java
NavigationApi.getNavigator( this, // Activity new NavigationApi.NavigatorListener() { @Override public void onNavigatorReady(Navigator navigator) { // Keep a reference to the Navigator (used to configure and start nav) this.navigator = navigator; } } );
Kotlin
NavigationApi.getNavigator( this, // Activity object : NavigatorListener() { override fun onNavigatorReady(navigator: Navigator) { // Keep a reference to the Navigator (used to configure and start nav) this@myActivity.navigator = navigator } }, )
Zorunlu alanları doldurarak bir
DriverContext
nesnesi oluşturun.Java
DriverContext driverContext = DriverContext.builder(application) .setProviderId(providerId) .setVehicleId(vehicleId) .setAuthTokenFactory(authTokenFactory) .setNavigator(navigator) .setRoadSnappedLocationProvider( NavigationApi.getRoadSnappedLocationProvider(application)) .build();
Kotlin
val driverContext = DriverContext.builder(application) .setProviderId(providerId) .setVehicleId(vehicleId) .setAuthTokenFactory(authTokenFactory) .setNavigator(navigator) .setRoadSnappedLocationProvider(NavigationApi.getRoadSnappedLocationProvider(application)) .build()
*DriverApi
öğesini başlatmak içinDriverContext
nesnesini kullanın.Java
RidesharingDriverApi ridesharingDriverApi = RidesharingDriverApi.createInstance(driverContext);
Kotlin
val ridesharingDriverApi = RidesharingDriverApi.createInstance(driverContext)
API nesnesinden
RidesharingVehicleReporter
öğesini alın. (*VehicleReporter
,NavigationVehicleReporter
süresini uzatır.)Java
RidesharingVehicleReporter vehicleReporter = ridesharingDriverApi.getRidesharingVehicleReporter();
Kotlin
val vehicleReporter = ridesharingDriverApi.getRidesharingVehicleReporter()
AuthTokenFactory
üzerinde kimlik doğrulanıyor
Sürücü SDK'sı konum güncellemeleri oluşturduğunda
bu güncellemeleri
emin olmaktır. Bu isteklerin kimliğini doğrulamak için
Sürücü SDK'sı, arayan tarafından sağlanan bir kullanıcıya çağrı yapar
AuthTokenFactory
örneği.
Fabrika, konumda kimlik doğrulama jetonları oluşturmaktan sorumludur
güncelleme zamanı.
Jetonların tam olarak nasıl oluşturulduğu her geliştiricinin kendi durumuna göre değişir. Ancak, uygulama işlemi için muhtemelen:
- bir HTTPS sunucusundan JSON biçiminde kimlik doğrulama jetonu getirme
- jetonu ayrıştırıp önbelleğe alın
- Süresi dolduğunda jetonu yenile
Fleet Engine sunucusunun beklediği jetonların ayrıntıları için bkz. Yetkilendirme için JSON Web Token (JWT) oluşturma.
Aşağıda AuthTokenFactory
iskelet uygulaması verilmiştir:
Java
class JsonAuthTokenFactory implements AuthTokenFactory {
private String token; // initially null
private long expiryTimeMs = 0;
// This method is called on a thread whose only responsibility is to send
// location updates. Blocking is OK, but just know that no location updates
// can occur until this method returns.
@Override
public String getToken(AuthTokenContext authTokenContext) {
if (System.currentTimeMillis() > expiryTimeMs) {
// The token has expired, go get a new one.
fetchNewToken(authTokenContext.getVehicleId());
}
return token;
}
private void fetchNewToken(String vehicleId) {
String url =
new Uri.Builder()
.scheme("https")
.authority("yourauthserver.example")
.appendPath("token")
.appendQueryParameter("vehicleId", vehicleId)
.build()
.toString();
try (Reader r = new InputStreamReader(new URL(url).openStream())) {
com.google.gson.JsonObject obj
= com.google.gson.JsonParser.parseReader(r).getAsJsonObject();
token = obj.get("Token").getAsString();
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 10 minutes from that time.
expiryTimeMs -= 10 * 60 * 1000;
} catch (IOException e) {
// It's OK to throw exceptions here. The StatusListener you passed to
// create the DriverContext class will be notified and passed along the failed
// update warning.
throw new RuntimeException("Could not get auth token", e);
}
}
}
Kotlin
class JsonAuthTokenFactory : AuthTokenFactory() {
private var token: String = ""
private var expiryTimeMs: Long = 0
// This method is called on a thread whose only responsibility is to send
// location updates. Blocking is OK, but just know that no location updates
// can occur until this method returns.
override fun getToken(context: AuthTokenContext): String {
if (System.currentTimeMillis() > expiryTimeMs) {
// The token has expired, go get a new one.
fetchNewToken(authTokenContext.getVehicleId())
}
return token
}
fun fetchNewToken(vehicleId: String) {
val url =
Uri.Builder()
.scheme("https")
.authority("yourauthserver.example")
.appendPath("token")
.appendQueryParameter("vehicleId", vehicleId)
.build()
.toString()
try {
val reader = InputStreamReader(URL(url).openStream())
reader.use {
val obj = com.google.gson.JsonParser.parseReader(r).getAsJsonObject()
token = obj.get("ServiceToken").getAsString()
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 10 minutes from that time.
expiryTimeMs -= 10 * 60 * 1000
}
} catch (e: IOException) {
// It's OK to throw exceptions here. The StatusListener you passed to
// create the DriverContext class will be notified and passed along the failed
// update warning.
throw RuntimeException("Could not get auth token", e)
}
}
}
Bu özel uygulama, bir web sitesini jetonunu, geliştiricinin kimlik doğrulama sunucusundan JSON biçiminde kaydetmesini isteyin. Jeton yeniden kullanılmak üzere kaydedildi. Eski jeton 10 dakika içindeyse jeton yeniden getirilir sona ereceğini unutmayın.
Uygulamanız, arka plan ileti dizisi kullanmak gibi bazı işlemleri farklı yapabilir tıklayın.
AuthTokenFactory
politikasındaki istisnalar, gerçekleşmedikleri sürece geçici olarak değerlendirilecek
tekrar tekrar. Bir dizi denemeden sonra Sürücü SDK'sı
sayfanın
hatası kalıcıdır ve artık güncelleme göndermeyi durduracaktır.
StatusListener
ile Durum ve Hata Bildirimi
Sürücü SDK'sı
bazı durumlarda bildirimleri tetiklemek için StatusListener
hata, uyarı veya hata ayıklama mesajı gibi çeşitli etkinliklerin meydana gelmesidir. Hatalar şunlar olabilir:
geçici (BACKEND_CONNECTIVITY_ERROR
gibi) veya
konum güncellemelerinin kalıcı olarak durdurulmasına neden olur (ör. VEHICLE_NOT_FOUND
,
Bu bir yapılandırma hatası anlamına gelir).
Aşağıdaki gibi isteğe bağlı bir StatusListener
uygulaması sağlarsınız:
Java
class MyStatusListener implements StatusListener {
/** Called when background status is updated, during actions such as location reporting. */
@Override
public void updateStatus(
StatusLevel statusLevel, StatusCode statusCode, String statusMsg) {
// Status handling stuff goes here.
// StatusLevel may be DEBUG, INFO, WARNING, or ERROR.
// StatusCode may be DEFAULT, UNKNOWN_ERROR, VEHICLE_NOT_FOUND,
// BACKEND_CONNECTIVITY_ERROR, or PERMISSION_DENIED.
}
}
Kotlin
class MyStatusListener : StatusListener() {
/** Called when background status is updated, during actions such as location reporting. */
override fun updateStatus(statusLevel: StatusLevel, statusCode: StatusCode, statusMsg: String) {
// Status handling stuff goes here.
// StatusLevel may be DEBUG, INFO, WARNING, or ERROR.
// StatusCode may be DEFAULT, UNKNOWN_ERROR, VEHICLE_NOT_FOUND,
// BACKEND_CONNECTIVITY_ERROR, or PERMISSION_DENIED.
}
}
SSL/TLS ile İlgili Notlar
Sürücü SDK'sı uygulaması dahili olarak,
Güvenli iletişim için SSL/TLS
ana makine öğrenimi. Android'in eski sürümleri (API sürümleri 19 veya
daha düşük) ile iletişim kurulabilmesi için bir SecurityProvider
yaması gerekebilir
sunucu. Şunu görmeniz gerekir:
makale
sayfasını ziyaret edin. Makalede ayrıca
güvenlik sağlayıcısına yama uygulamak için kullanılan kod örneklerini içerir.
Konum güncellemelerini etkinleştirme
Bir *VehicleReporter
örneğiniz olduğunda konum güncellemelerinin etkinleştirilmesi
basittir:
Java
RidesharingVehicleReporter reporter = ...;
reporter.enableLocationTracking();
Kotlin
val reporter = ...
reporter.enableLocationTracking()
Araç durumu şu olduğunda düzenli aralıklarla konum güncellemeleri gönderilir:
ONLINE
reporter.enableLocationTracking()
adlı kişiye çağrı yapmanın
araç durumunu otomatik olarak ONLINE
değerine ayarladı. Şunu yapmalısınız:
araç durumunu açık bir şekilde ayarlayabilirsiniz.
Varsayılan olarak raporlama aralığı 10 saniyedir. Raporlama aralığı
reporter.setLocationReportingInterval(long, TimeUnit)
ile değiştirilir. İlgili içeriği oluşturmak için kullanılan
desteklenen minimum güncelleme aralığı 5 saniyedir. Güncelleme sıklığı arttıkça
daha yavaş istek ve hatalara neden olur.
Konum güncellemeleri devre dışı bırakılıyor
Sürücünün vardiyası bittiğinde konum güncellemeleri durdurulabilir ve
araç sesli arama yapılarak çevrimdışı işaretlendi
DeliveryVehicleReporter.disableLocationTracking
veya
RidesharingVehicleReporter.disableLocationTracking
.
Bu çağrı, hemen teslim edilmek üzere son bir güncellemenin planlanmasına neden olacak. Bu, aracın çevrimdışı olduğunu gösterir. Bu güncelleme, kullanıcıya ait konum.
Araç durumunu ayarlama
Konum güncellemeleri etkinleştirildiğinde araç durumunu ONLINE
olarak ayarlamak
aracı SearchVehicles
sorgu için kullanılabilir hale getirin; benzer şekilde
OFFLINE
olarak işaretlenir. Araç, kullanılamaz olarak işaretlenir.
Araç durumunu sunucu tarafında ayarlama seçeneğiniz vardır (bkz. Güncelleme Araç), veya doğrudan Driver SDK'sında:
Java
RidesharingVehicleReporter reporter = ...;
reporter.enableLocationTracking();
reporter.setVehicleState(VehicleState.ONLINE);
Kotlin
val reporter = ...
reporter.enableLocationTracking()
reporter.setVehicleState(VehicleState.ONLINE)
Konum güncellemeleri etkinleştirildiğinde setVehicleState
çağrısına şu saatte gönderilecek:
emin olun.
Konum izleme etkin değilken bir aracı ONLINE
olarak işaretlerseniz
IllegalStateException
içinde Bir araç aşağıdaki durumlarda OFFLINE
olarak işaretlenebilir:
Konum izleme henüz etkinleştirilmedi veya açıkça devre dışı bırakıldı. Bu,
anında güncellenir. Bir
RidesharingVehicleReporter.disableLocationTracking()
şunu yapacak:
araç durumunu OFFLINE
olarak ayarla.
setVehicleState
web sitesinin hemen geri döneceğini ve güncellemelerin şurada yapıldığını unutmayın:
konum güncelleme ileti dizisi. Konum güncellemelerindeki hataların işlenmesine benzer şekilde, hatalar
Araç durumunun güncellenmesi, isteğe bağlı olarak sağlanan
StatusListener
, DriverContext
içinde ayarlandı.