Driver SDK를 사용하여 향상된 탐색 및 추적 기능을 제공할 수 있습니다. 이동 및 주문 진행 상황 애플리케이션에 전달됩니다. Driver SDK는 주문형 차량 공유 및 배송 솔루션 Fleet Engine에 대한 차량 위치 및 작업 업데이트입니다.
Driver SDK가 Fleet Engine 서비스 및 커스텀 서비스에서 계속 인식하도록 합니다.
자동차의 위치와 상태를 나타냅니다. 예를 들어 차량은 ONLINE
일 수 있습니다.
또는 OFFLINE
이고 이동이 진행됨에 따라 차량 위치가 변경됩니다.
최소 시스템 요구사항
휴대기기에서 Android 6.0을 실행 중이어야 합니다. (API 수준 23) 이상
빌드 및 종속 항목 구성
Google Maven 저장소에서 드라이버 SDK 버전 4.99 이상을 사용할 수 있습니다.
Gradle
build.gradle
파일에 다음을 추가합니다.
repositories {
...
google()
}
Maven
pom.xml
파일에 다음을 추가합니다.
<project>
...
<repositories>
<repository>
<id>google-maven-repository</id>
<url>https://maven.google.com</url>
</repository>
</repositories>
...
</project>
프로젝트 구성
드라이버 SDK를 사용하려면 앱에서
minSdkVersion
23 이상
Driver SDK로 빌드된 앱을 실행하려면 Android에서 기기에 필수 Google Play 서비스 설치해야 합니다.
개발 프로젝트 설정
개발 프로젝트 설정 및 API 키 가져오기 사용자 인증 정보를 제공합니다.
사용할 새 Google Cloud 콘솔 프로젝트를 만들거나 기존 프로젝트를 선택합니다. 사용할 수 있습니다 다음 결과가 나올 때까지 몇 분 정도 기다립니다. 새 프로젝트가 Google Cloud 콘솔에 표시됩니다.
데모 앱을 실행하려면 프로젝트에 Maps SDK에 대한 액세스 권한이 있어야 합니다. 안드로이드용. Google Cloud 콘솔에서 다음을 선택합니다. API 및 서비스 > 라이브러리를 클릭한 다음, Maps SDK for Education을 Android
다음을 선택하여 프로젝트의 API 키를 가져옵니다. API 및 서비스 > 사용자 인증 정보 > 사용자 인증 정보 만들기 > API 키를 참조하세요. API 키를 가져오는 방법에 대한 자세한 내용은 다음을 참조하세요. API 키를 가져옵니다.
앱에 드라이버 SDK 추가
Driver SDK는 Google Maven 저장소에서 제공됩니다. 이 저장소에는 SDK의 프로젝트 객체 모델 (.pom) 파일과 Javadocs가 포함되어 있습니다. 앱에 드라이버 SDK를 추가하려면 다음 단계를 따르세요.
Gradle 또는 Maven 구성에 다음 종속 항목을 추가하고 원하는 드라이버 SDK 버전의
VERSION_NUMBER
자리표시자Gradle
build.gradle
에 다음을 추가합니다.dependencies { ... implementation 'com.google.android.libraries.mapsplatform.transportation:transportation-driver:VERSION_NUMBER' }
Maven
pom.xml
에 다음을 추가합니다.<dependencies> ... <dependency> <groupId>com.google.android.libraries.mapsplatform.transportation</groupId> <artifactId>transportation-driver</artifactId> <version>VERSION_NUMBER</version> </dependency> </dependencies>
드라이버 SDK는 Navigation SDK에 종속되므로 이 종속 항목은 다음과 같이 구성됩니다. 특정 버전의 Navigation SDK가 필요한 경우 다음과 같이 빌드 구성 파일에 명시적으로 정의되어 있습니다. 언급된 코드 블록을 생략하면 프로젝트가 항상 Navigation SDK의 최신 버전을 설치해야 합니다. 최신 버전의 드라이버 SDK와 Navigation SDK는 출시 전에 엄격한 테스트를 거쳤습니다.
개발 및 출시의 종속 항목 구성 정렬 조정할 수 있습니다
Gradle
build.gradle
에 다음을 추가합니다.dependencies { ... implementation 'com.google.android.libraries.navigation:navigation:5.0.0' }
Maven
pom.xml
에 다음을 추가합니다.<dependencies> ... <dependency> <groupId>com.google.android.libraries.navigation</groupId> <artifactId>navigation</artifactId> <version>5.0.0</version> </dependency> </dependencies>
앱에 API 키 추가
앱에 Driver SDK를 추가했으면 앱에 API 키를 추가합니다. 나 API 키를 사용하기 위해 API 키를 사용할 때 개발 프로젝트를 설정합니다.
이 섹션에서는 보다 안전하게 API 키를 저장하는 방법을 설명합니다.
참조됩니다. 버전에 API 키를 체크인해서는 안 됩니다.
제어할 수 있습니다 local.properties
파일에 저장되어야 합니다.
이 파일은 프로젝트의 루트 디렉터리에 있습니다. 자세한 내용은
local.properties
파일, 다음을 참고하세요.
Gradle 속성 파일.
이 작업을 간단히 진행하고 싶다면 Android용 Secrets Gradle Plugin을 사용하세요.
플러그인을 설치하여 API 키를 저장하는 방법은 다음과 같습니다.
루트 수준
build.gradle
파일을 열고 다음 코드를buildscript
아래dependencies
요소.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") } }
앱 수준
build.gradle
파일을 열고 다음 코드를plugins
요소Groovy
id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin'
Kotlin
id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin")
Android 스튜디오를 사용한다면 프로젝트를 Gradle과 동기화합니다.
프로젝트 수준 디렉터리에서
local.properties
를 열고 코드를 실행합니다.YOUR_API_KEY
를 직접 생성한 API 키로 변경합니다.MAPS_API_KEY=YOUR_API_KEY
AndroidManifest.xml
파일에서com.google.android.geo.API_KEY
로 이동합니다. 그리고 다음과 같이android:value
속성을 업데이트합니다.<meta-data android:name="com.google.android.geo.API_KEY" android:value="${MAPS_API_KEY}" />
다음 예는 샘플 앱의 전체 매니페스트를 보여줍니다.
<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>
앱에 필수 저작자 표시 포함
앱에서 Driver SDK를 사용하는 경우 앱 법적 고지에 포함된 저작자 표시 텍스트 및 오픈소스 라이선스 섹션으로 이동합니다. 기여 분석은 독립적인 메뉴 항목으로 포함하거나 정보 메뉴 항목의 일부
라이선스 정보는 'third_party_licenses.txt'에서 확인할 수 있습니다. 파일 보관되지 않은 AAR 파일
https://developers.google.com/android/guides/opensource를 참고하세요. 을 참조하세요.
종속 항목
ProGuard를 사용하여 빌드를 최적화하려면 ProGuard에 다음 줄을 추가해야 할 수 있습니다. 구성 파일:
-dontwarn com.google.**
-dontwarn okio.**
지원되는 최소 API 수준은 23입니다.
SDK 초기화
다음을 수행하려면 제공업체 ID (일반적으로 Google Cloud 프로젝트 ID)가 필요합니다.
DriverContext
객체를 초기화합니다. 태그 설정에 대한 자세한 내용은
자세한 내용은
인증 및 승인.
드라이버 SDK를 사용하기 전에 먼저 초기화해야 합니다. Navigation SDK를 구현하는 방법을 보여줍니다. SDK를 초기화하려면 다음 안내를 따르세요.
NavigationApi
에서Navigator
객체를 가져옵니다.자바
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 } }, )
DriverContext
객체를 만들어 필수 필드를 채웁니다.자바
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()
DriverContext
객체를 사용하여*DriverApi
를 초기화합니다.자바
RidesharingDriverApi ridesharingDriverApi = RidesharingDriverApi.createInstance(driverContext);
Kotlin
val ridesharingDriverApi = RidesharingDriverApi.createInstance(driverContext)
API 객체에서
RidesharingVehicleReporter
를 가져옵니다.*VehicleReporter
는NavigationVehicleReporter
를 확장합니다.자바
RidesharingVehicleReporter vehicleReporter = ridesharingDriverApi.getRidesharingVehicleReporter();
Kotlin
val vehicleReporter = ridesharingDriverApi.getRidesharingVehicleReporter()
AuthTokenFactory
로 인증
드라이버 SDK가 위치 업데이트를 생성하면
이 업데이트를
Fleet Engine 서버입니다 이러한 요청을 인증하기 위해
드라이버 SDK가 호출자 제공
AuthTokenFactory
의 인스턴스입니다.
팩토리는 특정 위치에서 인증 토큰을 생성합니다.
있습니다.
토큰이 정확히 생성되는 방식은 각 개발자의 상황에 따라 다릅니다. 하지만 구현 시 다음 작업이 필요할 수 있습니다.
- HTTPS 서버에서 JSON 형식일 수 있는 인증 토큰 가져오기
- 토큰을 파싱하고 캐시합니다.
- 만료 시 토큰 새로고침
Fleet Engine 서버에서 예상하는 토큰에 대한 자세한 내용은 다음을 참고하세요. 승인을 위한 JSON 웹 토큰 (JWT) 만들기
다음은 AuthTokenFactory
의 스켈레톤 구현입니다.
자바
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)
}
}
}
이 구현에서는 기본 제공 Java HTTP 클라이언트를 사용하여 JSON 형식 토큰을 반환합니다. 토큰: 재사용하기 위해 저장됩니다. 이전 토큰이 10분 이내에 있으면 토큰을 다시 가져옵니다. 만료 시간을 초과할 수 없습니다.
구현에서 작업을 다르게 실행할 수 있습니다(예: 백그라운드 스레드 사용). 토큰을 새로고침할 수 있습니다
AuthTokenFactory
에서 예외는 발생하지 않는 한 일시적인 예외로 처리됩니다.
합니다. 여러 번의 시도 후 Driver SDK는
는
오류는 영구적이며 업데이트 전송 시도를 중지합니다.
상태 및 Error Reporting(StatusListener
)
Driver SDK는
백그라운드에서 특정 시점에 StatusListener
를 사용하여 알림을
오류, 경고, 디버그 메시지 등의
이벤트가 발생할 수 있습니다 오류가 발생할 수 있음
BACKEND_CONNECTIVITY_ERROR
와 같이 일시적인 특성이 있거나
위치 업데이트가 영구적으로 중지됨 (예: VEHICLE_NOT_FOUND
,
)이 표시됩니다.
다음과 같이 선택적으로 StatusListener
구현을 제공합니다.
자바
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 관련 참고사항
내부적으로 드라이버 SDK 구현은
안전한 통신을 위한 SSL/TLS
연결할 수 있습니다 이전 버전의 Android (API 버전 19 또는
낮은)의 경우 SecurityProvider
패치가 필요할 수 있으며, 이렇게 하려면
있습니다. 다음과 같이 표시됩니다.
도움말
Android에서 SSL을 사용하는 방법을 자세히 알아보세요. 이 기사에서도
에는 보안 프로바이더에 패치를 적용하기 위한 코드 샘플이 포함되어 있습니다.
위치 업데이트 사용 설정
*VehicleReporter
인스턴스가 있으면 위치 업데이트를 사용 설정하는 방법은 다음과 같습니다.
명확성:
자바
RidesharingVehicleReporter reporter = ...;
reporter.enableLocationTracking();
Kotlin
val reporter = ...
reporter.enableLocationTracking()
위치 업데이트는 차량 상태가 다음 상태일 때 정기적으로 전송됩니다.
ONLINE
reporter.enableLocationTracking()
를 호출해도
차량 상태를 ONLINE
로 자동 설정합니다. 다음을 수행해야 합니다.
차량 상태를 명시적으로 설정해야 합니다.
기본적으로 보고 간격은 10초입니다. 보고 간격은
reporter.setLocationReportingInterval(long, TimeUnit)
로 변경할 수 없습니다. 이
지원되는 최소 업데이트 간격은 5초입니다. 더 자주 업데이트하는 경우
더 느린 요청과 오류가 발생합니다.
위치 업데이트 사용 중지
운전자 시프트가 끝나면 위치 업데이트를 중지할 수 있고
전화를 걸어 오프라인으로 표시된 차량
DeliveryVehicleReporter.disableLocationTracking
또는
RidesharingVehicleReporter.disableLocationTracking
입니다.
이 호출을 통해 최종 업데이트가 즉시 전송되도록 예약됩니다. 차량이 오프라인 상태임을 나타냅니다. 이 업데이트에는 사용자의 볼 수 있습니다
차량 상태 설정
위치 업데이트가 사용 설정된 경우 차량 상태를 ONLINE
로 설정하면
차량을 SearchVehicles
쿼리에 사용할 수 있도록 합니다. 마찬가지로
차량이 OFFLINE
인 경우 차량을 이용할 수 없는 것으로 표시합니다.
서버 측에서 차량 상태를 설정할 수 있습니다 (업데이트 차량) 또는 드라이버 SDK에서 직접 업데이트할 수 있습니다.
자바
RidesharingVehicleReporter reporter = ...;
reporter.enableLocationTracking();
reporter.setVehicleState(VehicleState.ONLINE);
Kotlin
val reporter = ...
reporter.enableLocationTracking()
reporter.setVehicleState(VehicleState.ONLINE)
위치 업데이트가 사용 설정되면 setVehicleState
호출이
있습니다.
위치 추적이 사용 설정되지 않은 상태에서 차량을 ONLINE
로 표시하면 다음과 같이 표시됩니다.
(IllegalStateException
) 차량이 다음과 같은 경우 OFFLINE
로 표시할 수 있습니다.
위치 추적을 아직 사용 설정하거나 명시적으로 사용 중지하지 않았습니다. 이렇게 하면
즉시 업데이트됩니다 호출
RidesharingVehicleReporter.disableLocationTracking()
에서 실행할 작업
차량 상태를 OFFLINE
로 설정합니다.
setVehicleState
는 즉시 반환되고 업데이트는
위치 업데이트 스레드 위치 업데이트의 오류 처리와 마찬가지로
차량 상태 업데이트는 선택적으로 제공된
DriverContext
에서 설정된 StatusListener