Android के लिए ड्राइवर SDK टूल का इस्तेमाल शुरू करना

सिस्टम के लिए ज़रूरी शर्तें

मोबाइल डिवाइस पर Android 6.0 (एपीआई लेवल 23) या उसके बाद का वर्शन होना ज़रूरी है.

बिल्ड और डिपेंडेंसी कॉन्फ़िगरेशन

ड्राइवर SDK टूल के 4.99 और उसके बाद के वर्शन, Google Maven रिपॉज़िटरी में उपलब्ध हैं.

ग्रेडल

अपनी 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 या उसके बाद के वर्शन को टारगेट करना होगा. ज़्यादा जानकारी के लिए, रिलीज़ नोट देखें.

ड्राइवर SDK टूल की मदद से बनाए गए किसी ऐप्लिकेशन को चलाने के लिए, Android डिवाइस पर Google Play सेवाएं इंस्टॉल होनी चाहिए.

अपना डेवलपमेंट प्रोजेक्ट सेट अप करें

अपना डेवलपमेंट प्रोजेक्ट सेट अप करने और Google Cloud Console पर प्रोजेक्ट के लिए एपीआई पासकोड पाने के लिए:

  1. एक नया Google Cloud Console प्रोजेक्ट बनाएं या ड्राइवर SDK टूल के साथ इस्तेमाल करने के लिए, कोई मौजूदा प्रोजेक्ट चुनें. Google Cloud Console पर नया प्रोजेक्ट दिखने तक, थोड़ा इंतज़ार करें.

  2. डेमो ऐप्लिकेशन चलाने के लिए, आपके प्रोजेक्ट के पास Android के लिए Maps SDK का ऐक्सेस होना चाहिए. Google Cloud Console में, एपीआई और सेवाएं > लाइब्रेरी चुनें. इसके बाद, Android के लिए Maps SDK टूल खोजें और उसे चालू करें.

  3. एपीआई और सेवाएं > क्रेडेंशियल > क्रेडेंशियल बनाएं > एपीआई पासकोड चुनकर, प्रोजेक्ट के लिए एपीआई पासकोड पाएं. एपीआई पासकोड पाने के बारे में ज़्यादा जानने के लिए, एपीआई पासकोड पाना देखें.

अपने ऐप्लिकेशन में ड्राइवर SDK टूल जोड़ें

ड्राइवर SDK टूल, Google Maven रिपॉज़िटरी से उपलब्ध है. डेटा स्टोर करने की जगह में, SDK टूल का प्रोजेक्ट ऑब्जेक्ट मॉडल (.pom) फ़ाइलें और Javadocs शामिल होते हैं. अपने ऐप्लिकेशन में ड्राइवर SDK जोड़ने के लिए:

  1. अपने Gradle या Maven कॉन्फ़िगरेशन में यह डिपेंडेंसी जोड़ें. साथ ही, ड्राइवर SDK टूल के चुने गए वर्शन से VERSION_NUMBER प्लेसहोल्डर की जगह, इन डिपेंडेंसी जोड़ें.

    ग्रेडल

    अपने 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.driver</groupId>
        <artifactId>transportation-driver</artifactId>
        <version>[VERSION_NUMBER]</version>
      </dependency>
    </dependencies>
    
  2. ड्राइवर SDK टूल, नेविगेशन SDK पर निर्भर करता है. यह डिपेंडेंसी इस तरह कॉन्फ़िगर किया जाता है कि अगर नेविगेशन SDK के किसी खास वर्शन की ज़रूरत हो, तो उसे बिल्ड कॉन्फ़िगरेशन फ़ाइल में नीचे बताए गए तरीके से साफ़ तौर पर दिखाया जाना चाहिए. बताए गए कोड ब्लॉक को हटाने से प्रोजेक्ट, नेविगेशन SDK का सबसे नया वर्शन हमेशा डाउनलोड कर पाएगा. ध्यान दें कि ड्राइवर SDK टूल के नए वर्शन और नेविगेशन SDK टूल के रिलीज़ होने से पहले, उनकी कड़ी जांच की गई है.

    अपने डेवलपमेंट का डिपेंडेंसी कॉन्फ़िगरेशन व्यवस्थित करें और उसके मुताबिक एनवायरमेंट रिलीज़ करें.

    ग्रेडल

    अपने 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>
    

अपने ऐप्लिकेशन में एपीआई पासकोड जोड़ना

अपने ऐप्लिकेशन में ड्राइवर SDK टूल जोड़ने के बाद, अपने ऐप्लिकेशन में एपीआई पासकोड जोड़ें. आपको अपना डेवलपमेंट प्रोजेक्ट सेट अप करते समय मिली प्रोजेक्ट एपीआई कुंजी का इस्तेमाल करना होगा.

इस सेक्शन में, एपीआई पासकोड को सेव करने का तरीका बताया गया है, ताकि आपका ऐप्लिकेशन इसे ज़्यादा सुरक्षित तरीके से इस्तेमाल कर सके. आपको वर्शन कंट्रोल सिस्टम में जाकर, एपीआई पासकोड की जांच नहीं करनी चाहिए. इसे local.properties फ़ाइल में सेव करना चाहिए, जो आपके प्रोजेक्ट की रूट डायरेक्ट्री में मौजूद है. local.properties फ़ाइल के बारे में ज़्यादा जानकारी के लिए, gradle प्रॉपर्टी फ़ाइलें देखें.

इस टास्क को आसान बनाने के लिए, Android के लिए सीक्रेट ग्रेडल प्लगिन का इस्तेमाल करें. Secrets Gradle प्लगिन इंस्टॉल करने और एपीआई पासकोड को सुरक्षित तरीके से स्टोर करने के लिए, यह तरीका अपनाएं.

  1. अपनी रूट-लेवल की build.gradle फ़ाइल खोलें और buildscript में मौजूद dependencies एलिमेंट में ये कोड जोड़ें.

    ग्रूवी

    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. ऐप्लिकेशन-लेवल की build.gradle फ़ाइल खोलें और plugins एलिमेंट में यह कोड जोड़ें.

    ग्रूवी

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

    Kotlin

    id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin")
    
  3. अपना प्रोजेक्ट Gradle के साथ सिंक करें.

  4. अपने प्रोजेक्ट लेवल की डायरेक्ट्री में local.properties खोलें और इसके बाद, नीचे दिया गया कोड जोड़ें. YOUR_API_KEY को अपनी एपीआई कुंजी से बदलना न भूलें.

    MAPS_API_KEY=YOUR_API_KEY
    
  5. अपनी 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>

अपने ऐप्लिकेशन में ज़रूरी एट्रिब्यूशन शामिल करें

अगर आपके ऐप्लिकेशन में ड्राइवर SDK टूल का इस्तेमाल किया जाता है, तो आपको अपने ऐप्लिकेशन के कानूनी नोटिस वाले सेक्शन में, एट्रिब्यूशन टेक्स्ट और ओपन सोर्स लाइसेंस शामिल करने होंगे. एट्रिब्यूशन को एक स्वतंत्र मेन्यू आइटम या इसके बारे में जानकारी मेन्यू आइटम के हिस्से के रूप में शामिल करना सबसे अच्छा होता है.

लाइसेंस की जानकारी, संग्रह से निकाली गई AAR फ़ाइल में मौजूद " third_party_लाइसेंस.txt" फ़ाइल में देखी जा सकती है.

ओपन सोर्स सूचनाओं को शामिल करने का तरीका जानने के लिए, https://developers.google.com/android/guides/opensource पर जाएं.

डिपेंडेंसी

ड्राइवर SDK टूल, Fleet Engine सर्वर से संपर्क करने के लिए, gRPC का इस्तेमाल करता है. अगर आपने पहले से gRPC को नहीं लाया है, तो आपको इन डिपेंडेंसी के बारे में बताना पड़ सकता है:

dependencies {
    implementation 'io.grpc:grpc-android:1.12.0'
    implementation 'io.grpc:grpc-okhttp:1.12.0'
}

इन डिपेंडेंसी के बिना, ड्राइवर SDK टूल को Fleet Engine सर्वर से संपर्क करते समय, रनटाइम के दौरान गड़बड़ियां मिल सकती हैं.

अगर अपने बिल्ड को ऑप्टिमाइज़ करने के लिए ProGuard का इस्तेमाल किया जाता है, तो आपको अपनी ProGuard कॉन्फ़िगरेशन फ़ाइल में ये लाइनें जोड़नी पड़ सकती हैं:

-dontwarn com.google.**
-dontwarn io.grpc.**
-dontwarn okio.**

कम से कम 23 एपीआई लेवल काम करते हों.

SDK टूल शुरू करें

DriverContext ऑब्जेक्ट को शुरू करने के लिए, सेवा देने वाली कंपनी का आईडी (आम तौर पर, Google Cloud प्रोजेक्ट आईडी) ज़रूरी होता है. Google Cloud प्रोजेक्ट को सेट अप करने के बारे में ज़्यादा जानकारी के लिए, पुष्टि करना और अनुमति देना देखें.

ड्राइवर SDK टूल इस्तेमाल करने से पहले, आपको नेविगेशन SDK शुरू करना होगा. SDK टूल शुरू करने के लिए:

  1. 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;
          }
        }
    );
    
  2. ज़रूरी फ़ील्ड भरकर, DriverContext ऑब्जेक्ट बनाएं.

    DriverContext driverContext = DriverContext.builder(application)
        .setProviderId(providerId)
        .setVehicleId(vehicleId)
        .setAuthTokenFactory(authTokenFactory)
        .setNavigator(navigator)
        .setRoadSnappedLocationProvider(
            NavigationApi.getRoadSnappedLocationProvider(application))
        .build();
    
  3. *DriverApi को शुरू करने के लिए, DriverContext ऑब्जेक्ट का इस्तेमाल करें.

    DeliveryDriverApi driverApi = DeliveryDriverApi.createInstance(driverContext);
    
  4. एपीआई ऑब्जेक्ट से DeliveryVehicleReporter पाएं. (DeliveryVehicleReporter में NavigationVehicleReporter भी शामिल होता है.)

    DeliveryVehicleReporter vehicleReporter = driverApi.getDeliveryVehicleReporter();
    

AuthTokenFactory से पुष्टि की जा रही है

जब ड्राइवर SDK जगह की जानकारी के अपडेट जनरेट करता है, तब उसे इन अपडेट को Fleet Engine सर्वर पर भेजना होता है. इन अनुरोधों की पुष्टि करने के लिए, Driver SDK टूल, कॉलर से मिले AuthTokenFactory के इंस्टेंस पर कॉल करता है. जगह की जानकारी अपडेट करने के समय पर, पुष्टि करने वाले टोकन जनरेट करने की ज़िम्मेदारी फ़ैक्ट्री होती है.

टोकन जनरेट होने का तरीका, हर डेवलपर के हिसाब से अलग-अलग होता है. हालांकि, लागू करने के लिए इन बातों की ज़रूरत हो सकती है:

  • पुष्टि करने वाला टोकन फ़ेच करें. यह कोड एचटीटीपीएस सर्वर से, JSON फ़ॉर्मैट में हो सकता है
  • टोकन को पार्स और कैश मेमोरी में सेव करना
  • टोकन की समयसीमा खत्म होने पर उसे रीफ़्रेश करें

Fleet Engine सर्वर से जिन टोकन की उम्मीद की जाती है उनके बारे में जानने के लिए, अनुमति देने के लिए JSON Web Token (JWT) बनाना लेख पढ़ें.

यहां AuthTokenFactory को लागू करने का बुनियादी तरीका बताया गया है:

class JsonAuthTokenFactory implements AuthTokenFactory {
  private String vehicleServiceToken;  // 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(vehicleId);
    }
    if (ServiceType.VEHICLE.equals(authTokenContext.getServiceType)) {
      return vehicleServiceToken;
    } else {
      throw new RuntimeException("Unsupported ServiceType: " + authTokenContext.getServiceType());
    }
  }

  private void fetchNewToken(String vehicleId) {
    String url = "https://yourauthserver.example/token/" + vehicleId;

    try (Reader r = new InputStreamReader(new URL(url).openStream())) {
      com.google.gson.JsonObject obj
          = com.google.gson.JsonParser.parseReader(r).getAsJsonObject();
      vehicleServiceToken = obj.get("VehicleServiceToken").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);
    }
  }
}

लागू करने की इस खास प्रक्रिया में पहले से मौजूद Java एचटीटीपी क्लाइंट का इस्तेमाल किया जाता है, ताकि डेवलपर के ऑथेंटिकेशन सर्वर से JSON फ़ॉर्मैट में टोकन फ़ेच किया जा सके. फिर से इस्तेमाल करने के लिए, टोकन को सेव कर लिया जाता है. अगर पुराना टोकन, समयसीमा खत्म होने की तारीख से 10 मिनट के अंदर है, तो टोकन को फिर से फ़ेच किया जाता है.

आपकी लागू की गई प्रोसेस के काम करने का तरीका अलग हो सकता है, जैसे कि टोकन को रीफ़्रेश करने के लिए बैकग्राउंड थ्रेड का इस्तेमाल करना.

AuthTokenFactory में अपवादों को तब तक अस्थायी माना जाता है, जब तक कि वे बार-बार न हों. कई बार कोशिश करने के बाद, ड्राइवर SDK टूल यह मान लेता है कि गड़बड़ी हमेशा के लिए है और वह अपडेट भेजने की कोशिश करना बंद कर देता है.

StatusListener की मदद से, स्टेटस और गड़बड़ी की रिपोर्ट की जा रही है

ड्राइवर 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.
  }
}

SSL/TLS के बारे में नोट

अंदरूनी तौर पर, ड्राइवर SDK टूल लागू करने के लिए, Fleet Engine सर्वर के साथ सुरक्षित तरीके से संपर्क करने के लिए, SSL/TLS का इस्तेमाल किया जाता है. Android के पुराने वर्शन (एपीआई वर्शन 23 या इससे पहले के वर्शन) को सर्वर से कनेक्ट करने के लिए, SecurityProvider पैच की ज़रूरत हो सकती है. Android में एसएसएल के साथ काम करने के बारे में ज़्यादा जानकारी के लिए, सुरक्षा GMS प्रोवाइडर पर जाएं. इस लेख में, सुरक्षा देने वाली कंपनी को पैच करने के लिए कोड के सैंपल भी दिए गए हैं.

जगह की जानकारी के अपडेट पाने की सुविधा चालू करें

*VehicleReporter इंस्टेंस मिलने के बाद, जगह की जानकारी के अपडेट चालू करना आसान है:

DeliveryVehicleReporter reporter = ...;

reporter.enableLocationTracking();

अगर हो सके, तो जगह की जानकारी के अपडेट, समय-समय पर भेजे जाते हैं. जगह के हर अपडेट से यह भी पता चलता है कि वाहन ऑनलाइन है.

डिफ़ॉल्ट रूप से, रिपोर्टिंग इंटरवल 10 सेकंड का होता है. reporter.setLocationReportingInterval(long, TimeUnit) से रिपोर्टिंग के इंटरवल को बदला जा सकता है. अपडेट का कम से कम 5 सेकंड का इंटरवल काम करता है. बार-बार अपडेट करने की वजह से अनुरोध करने में ज़्यादा समय लग सकता है और गड़बड़ियां हो सकती हैं.

जगह की जानकारी के अपडेट पाने की सुविधा बंद करें

ड्राइवर की शिफ़्ट होने के बाद, DeliveryVehicleReporter.disableLocationTracking पर कॉल करके जगह की जानकारी के अपडेट बंद किए जा सकते हैं.

भरोसेमंद मॉडल के इस्तेमाल के उदाहरण

इस सेक्शन में बताया गया है कि भरोसेमंद मॉडल का इस्तेमाल करते समय, इस्तेमाल के आम उदाहरणों को लागू करने के लिए, ड्राइवर SDK टूल का इस्तेमाल कैसे किया जाता है.

वाहन बनाएं

ड्राइवर SDK टूल का इस्तेमाल करके वाहन बनाया जा सकता है.

वाहन बनाने से पहले, डिलीवरी ड्राइवर एपीआई शुरू करना न भूलें. वाहन का आईडी, वाहन और कंपनी के आईडी से बनाया जाना चाहिए. इसका इस्तेमाल ड्राइवर SDK टूल शुरू करने के दौरान किया जाता है. इसके बाद, जैसा कि नीचे दिए गए उदाहरण में दिखाया गया है, वह गाड़ी बनाएं:

DeliveryDriverApi api = DeliveryDriverApi.getInstance();
DeliveryVehicleManager vehicleManager = api.getDeliveryVehicleManager();
try {
  DeliveryVehicle vehicle = vehicleManager.createVehicle().get();
  // Handle CreateVehicleRequest DeliveryVehicle response.
} catch (Exception e) {
  // Handle CreateVehicleRequest error.
}

शिपमेंट पिक अप करने का टास्क बनाएं

ड्राइवर SDK टूल से, शिपमेंट पिक अप करने का टास्क बनाया जा सकता है.

टास्क बनाने से पहले, डिलीवरी ड्राइवर एपीआई शुरू करना न भूलें. ड्राइवर SDK टूल को शुरू करने के दौरान, बताए गए प्रोवाइडर आईडी का इस्तेमाल करके टास्क बनाया जाना चाहिए. इसके बाद, जैसा कि नीचे दिए गए उदाहरण में दिखाया गया है, शिपमेंट पिकअप टास्क बनाएं. टास्क आईडी के बारे में ज़्यादा जानने के लिए, टास्क आईडी के उदाहरण देखें.

static final String TASK_ID = "task-8241890"; // Avoid auto-incrementing IDs.

DeliveryDriverApi api = DeliveryDriverApi.getInstance();
DeliveryTaskManager taskManager = api.getDeliveryTaskManager();
CreateDeliveryTaskRequest request = CreateDeliveryTaskRequest.builder(TASK_ID)
   .setPlannedWaypoint(Waypoint.builder().setLatLng(-6.195139, 106.820826).build())
   .setTaskDurationSeconds(2 * 60)
   .setParentId("my-tracking-id")
   .setTaskType(TaskType.DELIVERY_PICKUP)
   .build();

try {
   DeliveryTask task = taskManager.createTask(request).get();
   // Handle CreateTaskRequest DeliveryTask response.
} catch (Exception e)  {
   // Handle CreateTaskRequest error.
}

शिपमेंट डिलीवर करने का टास्क बनाएं

ड्राइवर SDK टूल से, शिपमेंट डिलीवरी टास्क बनाया जा सकता है.

टास्क बनाने से पहले, डिलीवरी ड्राइवर एपीआई शुरू करना न भूलें. इसके बाद, नीचे दिए गए उदाहरण की तरह, शिपमेंट डिलीवरी टास्क बनाएं. टास्क आईडी के बारे में ज़्यादा जानने के लिए, टास्क आईडी के उदाहरण देखें.

static final String TASK_ID = "task-8241890"; // Avoid auto-incrementing IDs.

DeliveryDriverApi api = DeliveryDriverApi.getInstance();
DeliveryTaskManager taskManager = api.getDeliveryTaskManager();
CreateDeliveryTaskRequest request = CreateDeliveryTaskRequest.builder(TASK_ID)
   .setPlannedWaypoint(Waypoint.builder().setLatLng(-6.195139, 106.820826).build())
   .setTaskDurationSeconds(2 * 60)
   .setParentId("my-tracking-id")
   .setTaskType(TaskType.DELIVERY_DELIVERY)
   .build();
try {
   DeliveryTask task = taskManager.createTask(request).get();
   // Handle CreateTaskRequest DeliveryTask response.
} catch (Exception e)  {
   // Handle CreateTaskRequest error.
}

शेड्यूल की गई अनुपलब्धता

आप ड्राइवर SDK टूल से, उपलब्ध न होने के बारे में बताने वाला टास्क बना सकते हैं. उदाहरण के लिए, ड्राइवर के लिए ब्रेक या वाहन में पेट्रोल भर जाने की समस्या के बारे में बताने वाला टास्क. शेड्यूल किए गए ऐसे टास्क में ट्रैकिंग आईडी शामिल नहीं होना चाहिए जो उपलब्ध नहीं है. आपके पास जगह की जानकारी देने का विकल्प भी होता है.

टास्क बनाने से पहले, डिलीवरी ड्राइवर एपीआई शुरू करना न भूलें. इसके बाद, उपलब्ध न होने का टास्क बनाएं, जैसा कि इस उदाहरण में दिखाया गया है. टास्क आईडी के बारे में ज़्यादा जानने के लिए, टास्क आईडी के उदाहरण देखें.

static final String TASK_ID = "task-8241890"; // Avoid auto-incrementing IDs.

DeliveryDriverApi api = DeliveryDriverApi.getInstance();
DeliveryTaskManager taskManager = api.getDeliveryTaskManager();
CreateDeliveryTaskRequest request = CreateDeliveryTaskRequest.builder(TASK_ID)
   .setTaskDurationSeconds(2 * 60) // Duration or location (or both) must be provided for a BREAK task.
   .setTaskType(TaskType.UNAVAILABLE)
   .build();
try {
   DeliveryTask task = taskManager.createTask(request).get();
   // Handle CreateTaskRequest DeliveryTask response.
} catch (Exception e)  {
   // Handle CreateTaskRequest error.
}

शेड्यूल किए गए स्टॉप

आप ड्राइवर SDK टूल से, शेड्यूल किया गया स्टॉप टास्क बना सकते हैं. हो सकता है कि शेड्यूल किए गए स्टॉप टास्क में ट्रैकिंग आईडी शामिल न हो.

टास्क बनाने से पहले, डिलीवरी ड्राइवर एपीआई शुरू करना न भूलें. इसके बाद, शेड्यूल किया गया स्टॉप टास्क बनाएं, जैसा कि नीचे दिए गए उदाहरण में दिखाया गया है. टास्क आईडी के बारे में ज़्यादा जानने के लिए, टास्क आईडी के उदाहरण देखें.

    static final String TASK_ID = "task-8241890"; //  Avoid auto-incrementing IDs.

    DeliveryDriverApi api = DeliveryDriverApi.getInstance();
    DeliveryTaskManager taskManager = api.getDeliveryTaskManager();
    CreateDeliveryTaskRequest request = CreateDeliveryTaskRequest.builder(TASK_ID)
       .setPlannedWaypoint(Waypoint.builder().setLatLng(-6.195139, 106.820826).build())
       .setTaskDurationSeconds(2 * 60)
       .setTaskType(TaskType.DELIVERY_SCHEDULED_STOP)
       .build();
    try {
       DeliveryTask task = taskManager.createTask(request).get();
       // Handle CreateTaskRequest DeliveryTask response.
    } catch (Exception e)  {
       // Handle CreateTaskRequest error.
    }

टास्क के क्रम को अपडेट करें

Driver SDK टूल की मदद से, किसी वाहन को असाइन किए गए टास्क के लागू होने का क्रम अपडेट किया जा सकता है.

टास्क का क्रम अपडेट करने से, टास्क को वाहन के लिए असाइन हो जाता है. ऐसा तब होता है, जब यह पहले से किसी वाहन के लिए असाइन नहीं किया गया हो. इससे वे टास्क भी बंद हो जाते हैं जो पहले किसी गाड़ी के लिए असाइन किए गए थे, लेकिन अपडेट किए गए क्रम में नहीं किए गए थे. अगर किसी दूसरे वाहन को पहले से कोई टास्क असाइन किया गया है, तो गड़बड़ी पैदा होती है. नई गाड़ी को कोई टास्क असाइन करने से पहले, मौजूदा टास्क बंद कर दें और फिर नया टास्क बनाएं.

टास्क के क्रम को किसी भी समय अपडेट किया जा सकता है.

किसी वाहन के लिए टास्क का क्रम अपडेट करने से पहले, पक्का करें कि वाहन और टास्क को Fleet Engine में पहले से ही बनाया जा चुका है. इसके बाद, नीचे दिए गए उदाहरण में बताए गए तरीके से वाहन के टास्क का क्रम अपडेट करें.

    DeliveryDriverApi api = DeliveryDriverApi.getInstance();
    DeliveryVehicleReporter reporter = api.getDeliveryVehicleReporter();
    try {
       List<VehicleStop> stops = reporter.setVehicleStops(
         ImmutableList.of(
             VehicleStop.builder()
                 .setVehicleStopState(VehicleStopState.ARRIVED)
                 .setWaypoint(Waypoint.builder().setLatLng(37.1749, 122.412).build())
                 .setTasks(ImmutableList.of(task1)) // Previously created DeliveryTask in Fleet Engine.
                 .build(),
             VehicleStop.builder()
                 .setVehicleStopState(VehicleStopState.NEW) // The current vehicle stop.
                 .setWaypoint(Waypoint.builder().setLatLng(37.7749, 122.4194).build())
                 .setTasks(ImmutableList.of(task2)) // Previously created DeliveryTask in Fleet Engine.
                 .build(),
             VehicleStop.builder()
                 .setVehicleStopState(VehicleStopState.NEW)
                 .setWaypoint(Waypoint.builder().setLatLng(37.3382, 121.8863).build())
                 .setTasks(ImmutableList.of(task3, task4)) // Previously created DeliveryTasks in Fleet Engine.
                 .build())).get();
       // Successfully updated vehicle stops in Fleet Engine. Returns the successfully set VehicleStops.
    } catch (Exception e)  {
       // Failed to update vehicle stops in Fleet Engine. Setting VehicleStops must be attempted again after resolving
       // errors.
    }

एक अपवाद हो सकता है, जो ड्राइवर SDK की आंतरिक स्थिति में अपडेट को रोक सकता है. अगर ऐसा होता है, तो समस्या का समाधान करें और कॉल पूरा होने तक setVehicleStops को फिर से कॉल करें.

इस तरह की समस्याएं हो सकती हैं:

  • दिए गए VehicleStops मान्य पैटर्न का पालन नहीं करते हैं. सिर्फ़ पहला VehicleStop मौजूदा स्टॉप के बाद VehicleStops, नए VehicleStopState में होने चाहिए.

  • टास्क मौजूद नहीं हैं या वे किसी दूसरे वाहन के हैं.

  • वाहन मौजूद नहीं है.

वाहन अगले स्टॉप के रास्ते में है

वाहन के किसी स्टॉप से जाने और नेविगेशन शुरू करने पर, फ़्लीट इंजन को इसकी सूचना दी जानी चाहिए. ड्राइवर SDK टूल से, Fleet Engine को सूचना दी जा सकती है.

वाहन के स्टॉप से वाहन के जाने की सूचना फ़्लीट इंजन को देने से पहले, पक्का करें कि वाहन के स्टॉप बनाए गए हों और सेट कर दिए गए हों. फिर, फ़्लीट इंजन को वाहन के निकलने की सूचना दें, जैसा कि यहां दिए गए उदाहरण में दिखाया गया है.

    DeliveryDriverApi api = DeliveryDriverApi.getInstance();
    DeliveryVehicleReporter reporter = api.getDeliveryVehicleReporter();
    reporter.enableLocationTracking(); // Location tracking must be enabled.

    // Create Vehicle, VehicleStops, and DeliveryTasks.
    // Set VehicleStops on Vehicle.

    navigator.setDestination(vehicleStop.getWaypoint());
    try {
       List<VehicleStop> updatedStops = reporter.enrouteToNextStop().get();
       // Successfully updated vehicle stops in Fleet Engine. Returns the set VehicleStops, with the first
       // VehicleStop updated to ENROUTE state.
    } catch (Exception e)  {
       // Failed to update vehicle stops in Fleet Engine. Updating VehicleStops must be attempted again
       // after resolving errors.
    }

ऐसा अपवाद भी हो सकता है जिसकी वजह से, ड्राइवर SDK टूल की अंदरूनी स्थिति को अपडेट होने से रोका जा सकता है. अगर ऐसा होता है, तो समस्या को हल करें. इसके बाद, enrouteToNextStop को फिर से कॉल करें, जब तक अनुरोध पूरा नहीं हो जाता.

इस तरह की समस्याएं हो सकती हैं:

  • ड्राइवर SDK में कोई बचा हुआ VehicleStops सेट नहीं है.

वाहन स्टॉप पर आई है

जब कोई वाहन किसी स्टॉप पर आता है, तो फ़्लीट इंजन को इसकी सूचना दी जानी चाहिए. आप ड्राइवर SDK टूल से, Fleet Engine को सूचना दे सकते हैं.

वाहन के स्टॉप पर पहुंचने की सूचना फ़्लीट इंजन को देने से पहले, यह पक्का कर लें कि वाहन के स्टॉप सेट किए गए हों. फिर, फ़्लीट इंजन को स्टॉप पर वाहन के आने की सूचना दें, जैसा कि नीचे दिए गए उदाहरण में दिखाया गया है.

DeliveryDriverApi api = DeliveryDriverApi.getInstance();
DeliveryVehicleReporter reporter = api.getDeliveryVehicleReporter();
reporter.enableLocationTracking(); // Location tracking must be enabled.

// Create Vehicle, VehicleStops, and DeliveryTasks.
// Set VehicleStops on Vehicle.
// Mark ENROUTE to VehicleStop and start guidance using Navigator.

try {
   List<VehicleStop> updatedStopsArrived = reporter.arrivedAtStop().get();
   // Successfully updated vehicle stops in Fleet Engine. Returns the set VehicleStops, with the first
   // VehicleStop updated to ARRIVED state.
   navigator.clearDestinations();
} catch (Exception e)  {
   // Failed to update vehicle stops in Fleet Engine. Updating VehicleStops must be attempted again
   // after resolving errors.
}

अपवाद के तौर पर, यह ड्राइवर SDK टूल की इंटरनल स्टेट में बदलाव होने से रोक सकता है. अगर ऐसा होता है, तो समस्या को हल करें. इसके बाद, arrivedAtStop को फिर से कॉल करें, जब तक समस्या का समाधान न हो जाए.

इस तरह की समस्याएं हो सकती हैं:

  • ड्राइवर SDK में कोई बचा हुआ VehicleStops सेट नहीं है.

वाहन के एक स्टॉप को पूरा किया जा रहा है

जब कोई वाहन स्टॉप को पूरा कर लेता है, तो आपको फ़्लीट इंजन को इसकी सूचना देनी होगी. इस सूचना की वजह से, स्टॉप से जुड़े सभी टास्क 'बंद है' पर सेट होते हैं. आप ड्राइवर SDK टूल से, Fleet Engine को सूचना दे सकते हैं.

नीचे दिए गए उदाहरण में दिखाए गए तरीके से, फ़्लीट इंजन को सूचना दें कि वाहन ने VehicleStop पूरा कर लिया है.

    DeliveryDriverApi api = DeliveryDriverApi.getInstance();
    DeliveryVehicleReporter reporter = api.getDeliveryVehicleReporter();
    reporter.enableLocationTracking(); // Location tracking must be enabled.

    // After completing the tasks at the VehicleStop, remove it from the
    // the current list of VehicleStops.

    try {
       List<VehicleStop> updatedStopsCompleted = reporter.completedStop().get();
       // Successfully updated vehicle stops in Fleet Engine. All tasks on the completed stop are set to CLOSED.
       // Returns the set VehicleStops, with the completed VehicleStop removed from the remaining list.
    } catch (Exception e)  {
       // Failed to update vehicle stops in Fleet Engine. Updating VehicleStops must be attempted again
       // after resolving errors.
    }

अपवाद के तौर पर, यह ड्राइवर SDK टूल की इंटरनल स्टेट में बदलाव होने से रोक सकता है. अगर ऐसा होता है, तो समस्या को हल करें. इसके बाद, completedStop को फिर से कॉल करें, जब तक समस्या का समाधान न हो जाए.

इस तरह की समस्याएं हो सकती हैं:

  • ड्राइवर SDK में कोई बचा हुआ VehicleStops सेट नहीं है.

टास्क बंद करना

किसी गाड़ी के लिए असाइन किए गए टास्क को बंद करने के लिए, फ़्लीट इंजन को सूचना दें कि वाहन ने उस स्टॉप को पूरा कर लिया है जहां टास्क पूरा हुआ था. या वाहन के स्टॉप की सूची से इसे हटा दें. इसके लिए, बाकी वाहन के स्टॉप की सूची को उसी तरह सेट किया जा सकता है जिस तरह किसी वाहन के टास्क के क्रम को अपडेट किया जाता है.

अगर किसी टास्क को अब तक गाड़ी असाइन नहीं की गई है और उसे बंद करने की ज़रूरत है, तो टास्क को 'बंद है' पर सेट करें. हालांकि, बंद किए गए टास्क को फिर से खोला नहीं जा सकता.

किसी टास्क को बंद करने का मतलब यह नहीं है कि वह काम पूरा हुआ या नहीं. इसका मतलब है कि टास्क में अब प्रोग्रेस नहीं है. शिपमेंट ट्रैकिंग के लिए, किसी टास्क के असली नतीजे के बारे में बताना ज़रूरी है, ताकि डिलीवरी का नतीजा दिखाया जा सके.

किसी गाड़ी को कोई टास्क असाइन किया जाना चाहिए, ताकि किसी टास्क को पूरा करने के लिए, ड्राइवर SDK टूल का इस्तेमाल किया जा सके. किसी वाहन को असाइन किए गए टास्क को बंद करने के लिए, फ़्लीट इंजन को सूचना दें कि कार ने उस स्टॉप को पूरा कर लिया है जहां टास्क पूरा होगा.

इसके अलावा, जिस वाहन के लिए टास्क असाइन किया गया है उसका टास्क का क्रम अपडेट करें. इसके बाद, टास्क को स्टॉप की सूची से हटाएं.

टास्क का नतीजा और नतीजे की जगह सेट करें

किसी टास्क को बंद कर देने का मतलब यह नहीं है कि उसे बंद कर दिया गया है या नहीं. इसका मतलब है कि टास्क में अब प्रोग्रेस नहीं है. शिपमेंट ट्रैकिंग के लिए, किसी टास्क के असली नतीजे के बारे में बताना ज़रूरी है, ताकि डिलीवरी का नतीजा दिखाया जा सके. साथ ही, सेवाओं के लिए सही बिलिंग की जा सके. टास्क सेट हो जाने के बाद, उसके नतीजे में बदलाव नहीं किया जा सकता. हालांकि, टास्क को सेट करने के बाद उसके समय और जगह की जानकारी में बदलाव किया जा सकता है.

जो टास्क बंद हैं Fleet Engine, सिर्फ़ डिलीवरी के टास्क के लिए शुल्क लेता है. हालांकि, यह शुल्क सिर्फ़ Shopping की स्थिति में होता है.

किसी टास्क के नतीजे के तौर पर मार्क करते समय, Fleet Engine टास्क के नतीजों की जगह में, वाहन की आखिरी जगह की जानकारी अपने-आप भर देता है. इस व्यवहार को बदला जा सकता है.

नीचे दिए गए उदाहरण में, किसी टास्क का नतीजा और टाइमस्टैंप सेट करने के लिए, ड्राइवर SDK टूल इस्तेमाल करने का तरीका बताया गया है. ड्राइवर SDK टूल का इस्तेमाल करके, टास्क के नतीजे की जगह सेट नहीं की जा सकती.

    static final String TASK_ID = "task-8241890";

    DeliveryDriverApi api = DeliveryDriverApi.getInstance();
    DeliveryTaskManager taskManager = api.getDeliveryTaskManager();

    // Updating an existing DeliveryTask which is already CLOSED. Manually
    // setting TaskOutcomeLocation with Driver SDK is not supported at this time.
    UpdateDeliveryTaskRequest req = UpdateDeliveryTaskRequest.builder(TASK_ID)
        .setTaskOutcome(TaskOutcome.SUCCEEDED)
        .setTaskOutcomeTimestamp(now()) // Timestamp in milliseconds.
        .build();

    try {
       DeliveryTask updatedTask = taskManager.updateTask(req);
       // Handle UpdateTaskRequest DeliveryTask response.
    } catch (Exception e)  {
       // Handle UpdateTaskRequest error.
    }

कोई वाहन खोजें

ड्राइवर SDK टूल से किसी वाहन को खोजा जा सकता है. कोई वाहन देखने से पहले, डिलीवरी ड्राइवर एपीआई शुरू करना न भूलें. इसके बाद, नीचे दिए गए उदाहरण में दिखाए गए तरीके से वाहन को देखा जा सकता है.

    DeliveryDriverApi api = DeliveryDriverApi.getInstance();
    DeliveryVehicleManager vehicleManager = api.getDeliveryVehicleManager();
    try {
       DeliveryVehicle vehicle = vehicleManager.getVehicle().get();
       // Handle GetVehicleRequest DeliveryVehicle response.
    } catch (Exception e)  {
       // Handle GetVehicleRequest error.
    }

DeliveryVehicleManager, सिर्फ़ उस वाहन आईडी के लिए DeliveryVehicle को खोज सकता है जो डिलीवरी ड्राइवर एपीआई शुरू करने के दौरान दिया गया था.