Android এর জন্য ড্রাইভার SDK দিয়ে শুরু করা

নূন্যতম সিস্টেমের জন্য আবশ্যক

মোবাইল ডিভাইসে অবশ্যই Android 6.0 (API লেভেল 23) বা তার পরে চলমান থাকতে হবে।

নির্মাণ এবং নির্ভরতা কনফিগারেশন

ড্রাইভার SDK সংস্করণ 4.99 এবং পরবর্তী Google Maven সংগ্রহস্থল থেকে উপলব্ধ।

গ্রেডল

আপনার build.gradle ফাইলে নিম্নলিখিত যোগ করুন:

repositories {
    ...
    google()
}

মাভেন

আপনার 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 ক্লাউড কনসোলে প্রকল্পের জন্য একটি API কী পেতে:

  1. একটি নতুন Google ক্লাউড কনসোল প্রকল্প তৈরি করুন, বা ড্রাইভার SDK-এর সাথে ব্যবহারের জন্য একটি বিদ্যমান প্রকল্প নির্বাচন করুন৷ Google ক্লাউড কনসোলে নতুন প্রকল্প দৃশ্যমান না হওয়া পর্যন্ত কয়েক মিনিট অপেক্ষা করুন৷

  2. ডেমো অ্যাপ চালানোর জন্য, আপনার প্রোজেক্টের অবশ্যই Android এর জন্য Maps SDK-এ অ্যাক্সেস থাকতে হবে। Google ক্লাউড কনসোলে, APIs এবং পরিষেবাগুলি > লাইব্রেরি নির্বাচন করুন, তারপর Android এর জন্য Maps SDK অনুসন্ধান করুন এবং সক্ষম করুন৷

  3. API এবং পরিষেবাগুলি > শংসাপত্র > শংসাপত্র তৈরি করুন > API কী নির্বাচন করে প্রকল্পের জন্য একটি API কী পান। একটি API কী পাওয়ার বিষয়ে আরও তথ্যের জন্য, একটি API কী পান দেখুন।

আপনার অ্যাপে ড্রাইভার 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'
    }
    

    মাভেন

    আপনার pom.xml এ নিম্নলিখিত যোগ করুন:

    <dependencies>
      ...
      <dependency>
        <groupId>com.google.android.libraries.mapsplatform.transportation</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'
    }
    

    মাভেন

    আপনার pom.xml এ নিম্নলিখিত যোগ করুন:

    <dependencies>
      ...
      <dependency>
        <groupId>com.google.android.libraries.navigation</groupId>
        <artifactId>navigation</artifactId>
        <version>5.0.0</version>
      </dependency>
    </dependencies>
    

আপনার অ্যাপের ম্যানিফেস্ট আপডেট করুন

একবার আপনি আপনার অ্যাপে ড্রাইভার SDK যোগ করলে, আপনি আপনার অ্যাপের ম্যানিফেস্টের AndroidManifest.xml ফাইলটি সম্পাদনা করে আপডেট করতে পারেন।

<application> উপাদানের মধ্যে আপনার API কী যোগ করুন। আপনি যখন আপনার ডেভেলপমেন্ট প্রজেক্ট সেট আপ করবেন তখন আপনাকে অবশ্যই প্রজেক্ট API কী ব্যবহার করতে হবে।

উদাহরণস্বরূপ, নিম্নলিখিত অ্যাপ্লিকেশন মেটাডেটাতে আপনার API কী দিয়ে PASTE_YOUR_API_KEY_HERE প্রতিস্থাপন করুন:

<meta-data
    android:name="com.google.android.geo.API_KEY"
    android:value="PASTE_YOUR_API_KEY_HERE"/>

নিম্নলিখিত উদাহরণটি একটি নমুনা অ্যাপ্লিকেশনের জন্য একটি সম্পূর্ণ ম্যানিফেস্ট দেখায়:

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

        <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_licenses.txt" ফাইলে লাইসেন্সের তথ্য পাওয়া যাবে।

ওপেন সোর্স বিজ্ঞপ্তিগুলি কীভাবে অন্তর্ভুক্ত করবেন তার জন্য https://developers.google.com/android/guides/opensource দেখুন।

নির্ভরতা

ড্রাইভার SDK ফ্লিট ইঞ্জিন সার্ভারের সাথে যোগাযোগ করতে 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.**

সমর্থিত ন্যূনতম API স্তর হল 23৷

SDK আরম্ভ করুন

FleetEngine অবজেক্ট শুরু করার জন্য একটি প্রদানকারী আইডি (সাধারণত Google ক্লাউড প্রকল্প আইডি) প্রয়োজন। Google ক্লাউড প্রজেক্ট সেট আপ করার বিষয়ে আরো বিস্তারিত জানার জন্য, প্রমাণীকরণ এবং অনুমোদন দেখুন।

ড্রাইভার 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. API অবজেক্ট থেকে DeliveryVehicleReporter পান। ( DeliveryVehicleReporter NavigationVehicleReporter প্রসারিত করেছে।)

    DeliveryVehicleReporter vehicleReporter = driverApi.getDeliveryVehicleReporter();
    

AuthTokenFactory দিয়ে প্রমাণীকরণ করুন

যখন ড্রাইভার SDK লোকেশন আপডেট তৈরি করে, তখন এটিকে অবশ্যই এই আপডেটগুলি Google Fleet Engine সার্ভারে পাঠাতে হবে। এই অনুরোধগুলিকে প্রমাণীকরণ করার জন্য, ড্রাইভার SDK AuthTokenFactory এর একটি কলার-প্রদত্ত উদাহরণে কল করে। অবস্থান আপডেটের সময়ে প্রমাণীকরণ টোকেন তৈরি করার জন্য কারখানাটি দায়ী।

ঠিক কীভাবে টোকেন তৈরি হয় তা প্রতিটি বিকাশকারীর পরিস্থিতির জন্য নির্দিষ্ট। যাইহোক, বাস্তবায়নের জন্য সম্ভবত:

  • একটি প্রমাণীকরণ টোকেন আনুন, সম্ভবত JSON ফর্ম্যাটে, একটি HTTPS সার্ভার থেকে।
  • টোকেনটি পার্স করুন এবং ক্যাশে করুন।
  • মেয়াদ শেষ হয়ে গেলে টোকেনটি রিফ্রেশ করুন।

ফ্লিট ইঞ্জিন সার্ভার দ্বারা প্রত্যাশিত টোকেনগুলির বিশদ বিবরণের জন্য, অনুমোদনের জন্য একটি JSON ওয়েব টোকেন (JWT) তৈরি করা দেখুন।

এখানে একটি AuthTokenFactory এর একটি কঙ্কাল বাস্তবায়ন রয়েছে:

class JsonAuthTokenFactory implements AuthTokenFactory {
  String vehicleServiceToken;  // initially null
  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 URL(url).openStream()) {
      com.google.gson.JsonObject obj
          = new com.google.gson.JsonParser().parse(r);
      vehicleServiceToken = obj.get("VehicleServiceToken").getAsString();
      expiryTimeMs = obj.getAsLong("TokenExpiryMs");

      // 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 FleetEngine class will be notified and pass along the failed
      // update warning.
      throw new RuntimeException("Could not get auth token", e);
    }
  }
}

এই বিশেষ বাস্তবায়নটি বিকাশকারীর প্রমাণীকরণ সার্ভার থেকে JSON ফর্ম্যাটে একটি টোকেন আনতে অন্তর্নির্মিত Java HTTP ক্লায়েন্ট ব্যবহার করে। টোকেন পুনঃব্যবহারের জন্য সংরক্ষণ করা হয়। পুরানো টোকেনটি মেয়াদ শেষ হওয়ার 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 বাস্তবায়ন SSL/TLS ব্যবহার করে। অ্যান্ড্রয়েডের পূর্ববর্তী সংস্করণগুলি (এপিআই সংস্করণ 23 বা তার আগের) সার্ভারের সাথে যোগাযোগের জন্য একটি SecurityProvider প্যাচের প্রয়োজন হতে পারে। অ্যান্ড্রয়েডে SSL এর সাথে কাজ করার বিষয়ে আরও তথ্যের জন্য, SSL শোষণ থেকে রক্ষা করতে আপনার নিরাপত্তা প্রদানকারীকে আপডেট করুন দেখুন। নিবন্ধটিতে নিরাপত্তা প্রদানকারীকে প্যাচ করার জন্য কোড নমুনাও রয়েছে।

অবস্থান আপডেট সক্ষম করুন

একবার আপনার একটি *VehicleReporter দৃষ্টান্ত থাকলে, অবস্থান আপডেট সক্ষম করা সোজা:

DeliveryVehicleReporter reporter = ...;

reporter.enableLocationTracking();

সম্ভব হলে নিয়মিত বিরতিতে অবস্থানের আপডেট পাঠানো হয়। প্রতিটি অবস্থানের আপডেটও নির্দেশ করে যে গাড়িটি অনলাইনে রয়েছে।

ডিফল্টরূপে, রিপোর্টিং ব্যবধান 10 সেকেন্ড, কিন্তু আপনি FleetEngine.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.
}

টাস্ক অর্ডার আপডেট করুন

আপনি ড্রাইভার 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 আবার কল করুন৷

সম্ভাব্য সমস্যাগুলি অন্তর্ভুক্ত করতে পারে:

  • নির্দিষ্ট গাড়ির স্টপগুলি একটি বৈধ প্যাটার্ন অনুসরণ করে না। শুধুমাত্র প্রথম VehicleStop যেকোন VehicleStopState-এ হতে পারে: NEW, ENROUTE, অথবা ARRIVED৷ বর্তমান স্টপের পরে যানবাহন স্টপগুলি অবশ্যই নতুন যানবাহনস্টপ স্টেটে থাকতে হবে।

  • কার্যগুলি হয় বিদ্যমান নেই, অথবা সেগুলি একটি ভিন্ন যানের অন্তর্গত৷

  • গাড়ির অস্তিত্ব নেই।

গাড়িটি পরবর্তী স্টপেজের দিকে যাচ্ছে

ফ্লিট ইঞ্জিনকে অবশ্যই অবহিত করতে হবে যখন একটি গাড়ি স্টপ থেকে ছেড়ে যায় এবং যখন এটি নেভিগেশন শুরু করে। আপনি ড্রাইভার 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 থেকে ফ্লিট ইঞ্জিনকে অবহিত করতে পারেন৷

ফ্লিট ইঞ্জিনকে অবহিত করুন যে গাড়িটি তার 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 ব্যবহার করতে সক্ষম হওয়ার জন্য একটি গাড়িতে একটি টাস্ক বরাদ্দ করা আবশ্যক৷ একটি গাড়ির জন্য নির্ধারিত একটি টাস্ক বন্ধ করতে, ফ্লিট ইঞ্জিনকে অবহিত করুন যে গাড়িটি যেখানে কাজটি সংঘটিত হয়েছে সেখানে স্টপ শেষ করেছে।

বিকল্পভাবে, গাড়ির টাস্ক অর্ডারিং আপডেট করুন যেটি টাস্কটি অ্যাসাইন করা হয়েছে, এবং তারপর স্টপের তালিকা থেকে পছন্দসই কাজটি সরিয়ে দিন।

কাজের ফলাফল এবং ফলাফলের অবস্থান সেট করুন

একটি কাজ বন্ধ করা সাফল্য বা ব্যর্থতা নির্দেশ করে না। এটি নির্দেশ করে যে কাজটি আর অগ্রগতিতে বিবেচনা করা হচ্ছে না। চালান ট্র্যাকিংয়ের জন্য, একটি কাজের প্রকৃত ফলাফল নির্দেশ করা গুরুত্বপূর্ণ যাতে একটি ডেলিভারি ফলাফল দেখানো যায় এবং পরিষেবাগুলির জন্য যথাযথ বিলিং থাকে৷ একবার সেট হয়ে গেলে, আপনি কাজের ফলাফল পরিবর্তন করতে পারবেন না। কিন্তু আপনি সেগুলি সেট করার পরে টাস্ক ফলাফলের সময় এবং টাস্ক ফলাফলের অবস্থান পরিবর্তন করতে পারেন।

যে কাজগুলি বন্ধ অবস্থায় আছে সেগুলির ফলাফল সফল বা ব্যর্থ হতে পারে৷ ফ্লিট ইঞ্জিন সফলতার সাথে শুধুমাত্র ডেলিভারি টাস্ক চার্জ করে।

একটি টাস্কের ফলাফল চিহ্নিত করার সময়, ফ্লিট ইঞ্জিন স্বয়ংক্রিয়ভাবে শেষ পরিচিত গাড়ির অবস্থান সহ টাস্ক ফলাফলের অবস্থান পূরণ করে। আপনি ফ্লিট ইঞ্জিন কল করে এই আচরণটি ওভাররাইড করতে পারেন। মনে রাখবেন যে আপনি ড্রাইভার 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 থেকে একটি গাড়ি দেখতে পারেন। একটি যানবাহন খোঁজার আগে, নিশ্চিত করুন যে আপনি ডেলিভারি ড্রাইভার API শুরু করেছেন । তারপরে আপনি নিম্নলিখিত উদাহরণে দেখানো হিসাবে গাড়িটি সন্ধান করতে পারেন।

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 সন্ধান করতে পারে যা Delivery Driver API আরম্ভ করার সময় প্রদান করা হয়েছিল।