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 services इंस्टॉल होना चाहिए.

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

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

  1. ड्राइवर SDK टूल के साथ इस्तेमाल करने के लिए, नया Google Cloud Console प्रोजेक्ट बनाएं या कोई मौजूदा प्रोजेक्ट चुनें. कुछ मिनट इंतज़ार करें, जब तक कि 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 टूल जोड़ने के बाद, अपने ऐप्लिकेशन में एपीआई पासकोड जोड़ें. आपको अपना डेवलपमेंट प्रोजेक्ट सेट अप करते समय, मिले प्रोजेक्ट API पासकोड का इस्तेमाल करना होगा.

इस सेक्शन में, एपीआई पासकोड को सेव करने का तरीका बताया गया है, ताकि आपका ऐप्लिकेशन उसे ज़्यादा सुरक्षित तरीके से इस्तेमाल कर सके. आपको अपने वर्शन कंट्रोल सिस्टम में एपीआई पासकोड नहीं देखना चाहिए. इसे 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 का इस्तेमाल करता है. अगर आपने पहले से जीआरपीसी नहीं लाया है, तो आपको इन डिपेंडेंसी का एलान करना पड़ सकता है:

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

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

अगर अपने बिल्ड ऑप्टिमाइज़ करने के लिए 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 फ़ॉर्मैट में हो सकता है
  • टोकन को पार्स और कैश मेमोरी में सेव करें
  • समयसीमा खत्म होने पर, टोकन को रीफ़्रेश करें

अगर आपको फ़्लीट इंजन सर्वर से मिले टोकन के बारे में जानकारी चाहिए, तो अनुमति पाने के लिए JSON वेब टोकन (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.
  }
}

एसएसएल/टीएलएस के बारे में जानकारी

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

जगह की जानकारी के अपडेट चालू करें

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

DeliveryVehicleReporter reporter = ...;

reporter.enableLocationTracking();

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

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

जगह की जानकारी के अपडेट बंद करें

ड्राइवर की शिफ़्ट खत्म होने पर, 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 टूल का इस्तेमाल करके, किसी वाहन को असाइन किए गए टास्क के क्रम को अपडेट किया जा सकता है.

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

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

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

    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 पर फिर से कॉल करें.

संभावित समस्याओं में ये शामिल हो सकते हैं:

  • बताए गए व्हीकलस्टॉप मान्य पैटर्न का पालन नहीं करते. इनमें से किसी भी व्हीकलस्टॉपस्टेटस: नया, ENरूट या ARRIVED में से सिर्फ़ पहला VehicleStop ज़रूरी है. मौजूदा स्टॉप के बाद ऐक्टिविटी वाले व्हीकल स्टॉप, नए व्हीकलस्टॉप स्टेट में होने चाहिए.

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

  • गाड़ी मौजूद नहीं है.

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

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

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

    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 टूल से, फ़्लीट इंजन को इसकी सूचना दी जा सकती है.

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

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 टूल से, फ़्लीट इंजन को इसकी सूचना दी जा सकती है.

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

    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 टूल का इस्तेमाल करके टास्क बंद करने के लिए, किसी वाहन को टास्क असाइन करना ज़रूरी है. किसी वाहन को असाइन किए गए टास्क को बंद करने के लिए, फ़्लीट इंजन को सूचना दें कि जहां टास्क दिया गया है वाहन ने वह स्टॉप पूरा कर लिया है.

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

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

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

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

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

नीचे दिए गए उदाहरण में, टास्क का नतीजा और टाइमस्टैंप सेट करने के लिए, ड्राइवर 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 को खोज सकता है जो डिलीवरी ड्राइवर एपीआई शुरू करने के दौरान दिया गया था.