Android এর জন্য উপভোক্তা SDK দিয়ে শুরু করা

অন-ডিমান্ড রাইডস এবং ডেলিভারি সলিউশন ব্যাকএন্ড পরিষেবাগুলির সাথে সমন্বিত একটি মৌলিক ভোক্তা অ্যাপ তৈরি এবং চালানোর জন্য আপনি কনজিউমার SDK ব্যবহার করতে পারেন। আপনি একটি ট্রিপ এবং অর্ডার অগ্রগতি অ্যাপ্লিকেশন তৈরি করতে পারেন যা একটি সক্রিয় ট্রিপ প্রদর্শন করতে পারে, ট্রিপ আপডেটগুলিতে প্রতিক্রিয়া জানাতে পারে এবং ট্রিপের ত্রুটিগুলি পরিচালনা করতে পারে৷

যেহেতু কনজিউমার SDK-এর একটি মডুলার আর্কিটেকচার রয়েছে, আপনি API-এর অংশগুলি ব্যবহার করতে পারেন যা আপনি আপনার নির্দিষ্ট অ্যাপের জন্য ব্যবহার করতে চান এবং সেগুলিকে আপনার নিজস্ব API, ফ্লিট ইঞ্জিন দ্বারা প্রদত্ত ব্যাকএন্ড পরিষেবা এবং Google মানচিত্র প্ল্যাটফর্মের অতিরিক্ত API-এর সাথে একীভূত করতে পারেন। .

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

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

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

ভোক্তা SDK সংস্করণ 1.99.0 এবং পরবর্তী সংস্করণগুলি 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 একটি ব্যক্তিগত Maven সংগ্রহস্থলের মাধ্যমে উপলব্ধ। সংগ্রহস্থলে SDK এর প্রজেক্ট অবজেক্ট মডেল (.pom) ফাইল এবং Javadocs অন্তর্ভুক্ত রয়েছে। আপনার অ্যাপে উপভোক্তা SDK যোগ করতে:

  1. পূর্ববর্তী বিভাগে বর্ণিত হোস্ট Maven সংগ্রহস্থল অ্যাক্সেস করতে আপনার পরিবেশ সেট আপ করুন।

    আপনার যদি settings.gradle এ ঘোষিত কেন্দ্রীভূত নির্ভরতা ব্যবস্থাপনা কনফিগারেশন থাকে, তাহলে নিম্নরূপ এটি নিষ্ক্রিয় করুন।

    • settings.gradle এ নিম্নলিখিত কোড ব্লকটি সরান:

      import org.gradle.api.initialization.resolve.RepositoriesMode
      dependencyResolutionManagement {
          repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
          repositories {
              google()
              mavenCentral()
          }
      }
      
  2. গ্রাহক SDK-এর পছন্দসই সংস্করণের জন্য VERSION_NUMBER স্থানধারক প্রতিস্থাপন করে আপনার Gradle বা Maven কনফিগারেশনে নিম্নলিখিত নির্ভরতা যোগ করুন।

    গ্রেডল

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

    dependencies {
      ...
      implementation 'com.google.android.libraries.mapsplatform.transportation:transportation-consumer:VERSION_NUMBER'
    }
    

    মাভেন

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

    <dependencies>
      ...
      <dependency>
        <groupId>com.google.android.libraries.mapsplatform.transportation</groupId>
        <artifactId>transportation-consumer</artifactId>
        <version>VERSION_NUMBER</version>
      </dependency>
    </dependencies>
    
  3. ভোক্তা SDK মানচিত্র SDK-এর উপর নির্ভর করে৷ এই নির্ভরতাটি এমনভাবে কনফিগার করা হয়েছে যাতে মানচিত্র SDK-এর সংস্করণটি নিম্নোক্ত মত বিল্ড কনফিগারেশন ফাইলে স্পষ্টভাবে সংজ্ঞায়িত না থাকলে, যখন মানচিত্র SDK-এর একটি নতুন সংস্করণ প্রকাশিত হয়, তখন উপভোক্তা SDK ন্যূনতম সমর্থিত মানচিত্র SDK সংস্করণ ব্যবহার করা চালিয়ে যাবে এটি দ্বারা প্রয়োজনীয়।

    গ্রেডল

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

    dependencies {
      ...
      implementation 'com.google.android.gms:play-services-maps:18.1.0'
    }
    

    মাভেন

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

    <dependencies>
      ...
      <dependency>
        <groupId>com.google.android.gms</groupId>
        <artifactId>play-services-maps</artifactId>
        <version>18.1.0</version>
      </dependency>
    </dependencies>
    

আপনার অ্যাপে API কী যোগ করুন

একবার আপনি আপনার অ্যাপে কনজিউমার SDK যোগ করলে, আপনার অ্যাপে API কী যোগ করুন। আপনি যখন আপনার ডেভেলপমেন্ট প্রজেক্ট সেট আপ করবেন তখন আপনাকে অবশ্যই প্রজেক্ট API কী ব্যবহার করতে হবে।

এই বিভাগটি বর্ণনা করে যে কীভাবে আপনার API কী সংরক্ষণ করবেন যাতে এটি আপনার অ্যাপ দ্বারা আরও নিরাপদে উল্লেখ করা যায়। আপনার সংস্করণ নিয়ন্ত্রণ সিস্টেমে আপনার API কী চেক করা উচিত নয়। এটি local.properties ফাইলে সংরক্ষণ করা উচিত, যা আপনার প্রকল্পের রুট ডিরেক্টরিতে অবস্থিত। local.properties ফাইল সম্পর্কে আরও তথ্যের জন্য, Gradle বৈশিষ্ট্য ফাইলগুলি দেখুন।

এই কাজটি সুগম করতে, আপনি Android এর জন্য সিক্রেটস গ্রেডল প্লাগইন ব্যবহার করতে পারেন।

প্লাগইন ইনস্টল করতে এবং আপনার API কী সংরক্ষণ করতে:

  1. আপনার রুট-লেভেল build.gradle ফাইলটি খুলুন এবং buildscript অধীনে dependencies উপাদানে নিম্নলিখিত কোডটি যোগ করুন।

    গ্রোভি

    buildscript {
        dependencies {
            // ...
            classpath "com.google.android.libraries.mapsplatform.secrets-gradle-plugin:secrets-gradle-plugin:2.0.0"
        }
    }
    

    কোটলিন

    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'
    

    কোটলিন

    id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin")
    
  3. আপনি যদি অ্যান্ড্রয়েড স্টুডিও ব্যবহার করেন, তাহলে গ্রেডলের সাথে আপনার প্রকল্প সিঙ্ক করুন

  4. আপনার প্রজেক্ট লেভেল ডিরেক্টরিতে local.properties খুলুন এবং তারপরে নিম্নলিখিত কোডটি যোগ করুন। আপনার API কী দিয়ে 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.consumerapidemo">
    <uses-permission android:name="android.permission.ACCESS_FINE_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_licenses.txt" ফাইলে লাইসেন্সের তথ্য পাওয়া যাবে।

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

ভোক্তা SDK প্রমাণীকরণ

কনজিউমার SDK JSON ওয়েব টোকেন ব্যবহার করে প্রমাণীকরণ প্রদান করে। একটি JSON ওয়েব টোকেন (JWT) হল একটি JSON-বেস অ্যাক্সেস টোকেন যা একটি পরিষেবাতে এক বা একাধিক দাবি প্রদান করে। উদাহরণস্বরূপ, একটি সার্ভার একটি টোকেন তৈরি করতে পারে যাতে "প্রশাসক হিসাবে লগ ইন করা হয়েছে" দাবি রয়েছে এবং এটি একটি ক্লায়েন্টকে প্রদান করে। ক্লায়েন্ট তখন সেই টোকেনটি ব্যবহার করে প্রমাণ করতে পারে যে এটি অ্যাডমিন হিসাবে লগ ইন করা হয়েছে।

উপভোক্তা SDK ফ্লিট ইঞ্জিনের সাথে যোগাযোগ করতে অ্যাপ্লিকেশন দ্বারা প্রদত্ত JSON ওয়েব টোকেন ব্যবহার করে। আরও তথ্যের জন্য ফ্লিট ইঞ্জিন প্রমাণীকরণ এবং অনুমোদন দেখুন।

অনুমোদনের টোকেনে অবশ্যই টোকেনের authorization শিরোনামে একটি tripid:TRIP_ID দাবি থাকতে হবে, যেখানে TRIP_ID হল ট্রিপ আইডি। এটি কনজিউমার SDK কে গাড়ির অবস্থান, রুট এবং ETA সহ ভ্রমণের বিবরণে অ্যাক্সেস দেয়।

JSON ওয়েব টোকেন কলব্যাক

ভোক্তা SDK প্রাথমিককরণের সময় অ্যাপ্লিকেশনের সাথে একটি অনুমোদন টোকেন কলব্যাক নিবন্ধন করে। অনুমোদনের প্রয়োজন এমন সমস্ত নেটওয়ার্ক অনুরোধের জন্য একটি টোকেন পেতে SDK অ্যাপ্লিকেশনটিকে কল করে৷

আমরা দৃঢ়ভাবে সুপারিশ করি যে আপনার কলব্যাক বাস্তবায়ন ক্যাশে অনুমোদনের টোকেনগুলি এবং মেয়াদ expiry হয়ে গেলেই সেগুলি রিফ্রেশ করুন৷ টোকেনগুলি এক ঘন্টার মেয়াদ শেষ হওয়ার সাথে জারি করা উচিত।

অনুমোদন টোকেন কলব্যাক নির্দিষ্ট করে যে কোন পরিষেবার টোকেনটি TripService পরিষেবার জন্য প্রয়োজন৷ এটি প্রেক্ষাপটের জন্য প্রয়োজনীয় tripId প্রদান করে।

নিম্নলিখিত কোড উদাহরণটি দেখায় কিভাবে একটি অনুমোদন টোকেন কলব্যাক বাস্তবায়ন করতে হয়।

জাভা

class JsonAuthTokenFactory implements AuthTokenFactory {

  private static final String TOKEN_URL =
      "https://yourauthserver.example/token";

  private static class CachedToken {
    String tokenValue;
    long expiryTimeMs;
    String tripId;
  }

  private CachedToken token;

  /*
  * This method is called on a background thread. Blocking is OK. However, be
  * aware that no information can be obtained from Fleet Engine until this
  * method returns.
  */
  @Override
  public String getToken(AuthTokenContext context) {
    // If there is no existing token or token has expired, go get a new one.
    String tripId = context.getTripId();
    if (tripId == null) {
      throw new RuntimeException("Trip ID is missing from AuthTokenContext");
    }
    if (token == null || System.currentTimeMillis() > token.expiryTimeMs ||
        !tripId.equals(token.tripId)) {
      token = fetchNewToken(tripId);
    }
    return token.tokenValue;
  }

  private static CachedToken fetchNewToken(String tripId) {
    String url = TOKEN_URL + "/" + tripId;
    CachedToken token = new CachedToken();

    try (Reader r = new InputStreamReader(new URL(url).openStream())) {
      com.google.gson.JsonObject obj
          = com.google.gson.JsonParser.parseReader(r).getAsJsonObject();

      token.tokenValue = obj.get("ServiceToken").getAsString();
      token.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 5 minutes from that time.
      */
      token.expiryTimeMs -= 5 * 60 * 1000;
    } catch (IOException e) {
      /*
      * It's OK to throw exceptions here. The error listeners will receive the
      * error thrown here.
      */
      throw new RuntimeException("Could not get auth token", e);
    }
    token.tripId = tripId;

    return token;
  }
}

কোটলিন

class JsonAuthTokenFactory : AuthTokenFactory() {

  private var token: CachedToken? = null

  /*
  * This method is called on a background thread. Blocking is OK. However, be
  * aware that no information can be obtained from Fleet Engine until this
  * method returns.
  */
  override fun getToken(context: AuthTokenContext): String {
    // If there is no existing token or token has expired, go get a new one.
    val tripId = 
      context.getTripId() ?: 
        throw RuntimeException("Trip ID is missing from AuthTokenContext")

    if (token == null || System.currentTimeMillis() > token.expiryTimeMs ||
        tripId != token.tripId) {
      token = fetchNewToken(tripId)
    }

    return token.tokenValue
  }

  class CachedToken(
    var tokenValue: String? = "", 
    var expiryTimeMs: Long = 0,
    var tripId: String? = "",
  )

  private companion object {
    const val TOKEN_URL = "https://yourauthserver.example/token"

    fun fetchNewToken(tripId: String) {
      val url = "$TOKEN_URL/$tripId"
      val token = CachedToken()

      try {
        val reader = InputStreamReader(URL(url).openStream())

        reader.use {
          val obj = com.google.gson.JsonParser.parseReader(r).getAsJsonObject()

          token.tokenValue = obj.get("ServiceToken").getAsString()
          token.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 5 minutes from that time.
          */
          token.expiryTimeMs -= 5 * 60 * 1000
        }
      } catch (e: IOException) {
        /*
        * It's OK to throw exceptions here. The error listeners will receive the
        * error thrown here.
        */
        throw RuntimeException("Could not get auth token", e)
      }

      token.tripId = tripId

      return token
    }
  }
}

এপিআই আরম্ভ করুন

এই পদ্ধতিগুলি অনুসরণ করার আগে, এটি ধরে নেওয়া হয় যে আপনি উপযুক্ত পরিষেবা এবং গ্রাহক SDK সক্ষম করেছেন৷

ConsumerApi উদাহরণ পান

কনজিউমার SDK ব্যবহার করার জন্য, আপনার অ্যাপকে ConsumerApi অ্যাসিঙ্ক্রোনাসভাবে আরম্ভ করতে হবে। এপিআই একটি সিঙ্গেলটন। আরম্ভ করার পদ্ধতি একটি AuthTokenFactory লাগে। ফ্যাক্টরি ব্যবহারকারীর জন্য প্রয়োজনে নতুন JWT টোকেন তৈরি করে।

providerId হল আপনার Google ক্লাউড প্রকল্পের প্রকল্প আইডি । প্রকল্প তৈরির বিষয়ে আরও তথ্যের জন্য ফ্লিট ইঞ্জিন ব্যবহারকারী নির্দেশিকা দেখুন।

কনজিউমার SDK প্রমাণীকরণে বর্ণিত হিসাবে আপনার অ্যাপের AuthTokenFactory প্রয়োগ করা উচিত।

জাভা

Task<ConsumerApi> consumerApiTask = ConsumerApi.initialize(
    this, "myProviderId", authTokenFactory);

consumerApiTask.addOnSuccessListener(
  consumerApi -> this.consumerApi = consumerApi);

কোটলিন

val consumerApiTask =
  ConsumerApi.initialize(this, "myProviderId", authTokenFactory)

consumerApiTask?.addOnSuccessListener { consumerApi: ConsumerApi ->
  this@YourActivity.consumerApi = consumerApi
}

পছন্দের রেন্ডারারের জন্য অনুরোধ করতে মানচিত্র SDK শুরু করুন৷

ভোক্তা SDK v2.0.0 Android v18.1.0 এবং তার উপরে মানচিত্র SDK সমর্থন করে৷ এটি পছন্দের Google মানচিত্র রেন্ডারার নির্দিষ্ট করে অনুরোধ সমর্থন করে। বিশদ বিবরণের জন্য, নতুন মানচিত্র রেন্ডারার (অপ্ট-ইন) দেখুন।

নির্ভরতা হিসাবে মানচিত্র SDK যোগ করুন

গ্রেডল

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

dependencies {
  //...
  implementation "com.google.android.gms:play-services-maps:18.1.0"
}

মাভেন

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

 <dependencies>
   ...
   <dependency>
     <groupId>com.google.android.gms</groupId>
     <artifactId>play-services-maps</artifactId>
     <version>18.1.0</version>
   </dependency>
 </dependencies>

Consumer SDK আরম্ভ করার আগে Maps SDK শুরু করুন

আপনার Application বা স্টার্ট-আপ Activity ক্লাসে, MapsInitializer.initialize() কল করুন এবং কনজিউমার SDK শুরু করার আগে রেন্ডারারের অনুরোধের ফলাফলের জন্য অপেক্ষা করুন।

জাভা

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  initViews();

  MapsInitializer.initialize(getApplicationContext(), Renderer.LATEST,
      new OnMapsSdkInitializedCallback() {
        @Override
        public void onMapsSdkInitialized(Renderer renderer) {
          switch (renderer) {
            case LATEST:
              Log.i("maps_renderer", "LATEST renderer");
              break;
            case LEGACY:
              Log.i("maps_renderer", "LEGACY renderer");
              break;
          }

          initializeConsumerSdk();
        }
      });
}

কোটলিন

fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  setContentView(R.layout.main)
  initViews()

  MapsInitializer.initialize(
    getApplicationContext(), Renderer.LATEST,
    object : OnMapsSdkInitializedCallback() {
      fun onMapsSdkInitialized(renderer: Renderer?) {
        when (renderer) {
          LATEST -> Log.i("maps_renderer", "LATEST renderer")
          LEGACY -> Log.i("maps_renderer", "LEGACY renderer")
        }
        initializeConsumerSdk()
      }
    })
  }

ইউজার ইন্টারফেস তৈরি করুন

আপনি আপনার অ্যাপ্লিকেশনের জন্য ব্যবহারকারী ইন্টারফেস তৈরি করতে ConsumerMapFragment বা ConsumerMapView ব্যবহার করতে পারেন। ConsumerMapFragment আপনাকে একটি Fragment ব্যবহার করে আপনার মানচিত্র সংজ্ঞায়িত করতে দেয় যখন ConsumerMapView আপনাকে একটি View ব্যবহার করতে দেয়। ConsumerMapView এবং ConsumerMapFragment উভয় ক্ষেত্রেই রাইড শেয়ারিং কার্যকারিতা একই, তাই আপনি View বা Fragment আপনার অ্যাপ্লিকেশনের জন্য ভাল কিনা তার উপর ভিত্তি করে একটি বেছে নিতে পারেন।

API 19 (KitKat) এবং ভেক্টর ড্রয়েবলের জন্য সমর্থন যোগ করুন

যদি আপনার অ্যাপ ডিজাইনের API 19 (KitKat) ডিভাইস এবং ভেক্টর ড্রয়েবলের জন্য সমর্থনের প্রয়োজন হয়, তাহলে আপনার কার্যকলাপে নিম্নলিখিত কোড যোগ করুন। এই কোডগুলি উপভোক্তা SDK-এ ভেক্টর অঙ্কনযোগ্য ব্যবহার করার জন্য AppCompatActivity প্রসারিত করে৷

জাভা

// ...
import android.support.v7.app.AppCompatActivity;

// ...

public class ConsumerTestActivity extends AppCompatActivity {
  // ...
}

কোটলিন

// ...
import android.support.v7.app.AppCompatActivity

// ...

class ConsumerTestActivity : AppCompatActivity() {
  // ...
}

মানচিত্র খণ্ড বা দৃশ্য যোগ করুন

আপনি একটি Android খণ্ড বা একটি দৃশ্যে যাত্রা ভাগাভাগি প্রদর্শনের জন্য মানচিত্র তৈরি করেন, যা আপনি আপনার অ্যাপ্লিকেশন লেআউট XML ফাইলে ( /res/layout এ অবস্থিত) সংজ্ঞায়িত করেন। টুকরোটি (বা ভিউ) তারপরে যাত্রা ভাগ করে নেওয়ার মানচিত্রে অ্যাক্সেস সরবরাহ করে, যা আপনার অ্যাপ অ্যাক্সেস এবং সংশোধন করতে পারে। মানচিত্রটি ConsumerController কে একটি হ্যান্ডেলও প্রদান করে, যা আপনার অ্যাপটিকে যাত্রা ভাগ করে নেওয়ার অভিজ্ঞতা নিয়ন্ত্রণ ও কাস্টমাইজ করতে দেয়।

জার্নি শেয়ারিং ম্যাপ এবং কন্ট্রোলার

আপনি যাত্রা ভাগ করে নেওয়ার মানচিত্রটিকে একটি খণ্ড হিসাবে সংজ্ঞায়িত করেন ( ConsumerMapFragment ব্যবহার করে), অথবা একটি ভিউ হিসাবে ( ConsumerMapView ব্যবহার করে), যেমনটি নিম্নলিখিত কোড উদাহরণে দেখানো হয়েছে৷ আপনার onCreate() পদ্ধতিতে তারপর getConsumerGoogleMapAsync(callback) কল করা উচিত, যা কলব্যাকে অসিঙ্ক্রোনাসভাবে ConsumerGoogleMap ফেরত দেয়। তারপরে আপনি যাত্রা ভাগাভাগি প্রদর্শন করতে ConsumerGoogleMap ব্যবহার করেন এবং এটি আপনার অ্যাপের প্রয়োজন অনুসারে আপডেট করা যেতে পারে।

ConsumerMapFragment

আপনি আপনার অ্যাপ্লিকেশন লেআউট XML ফাইলে খণ্ডটি সংজ্ঞায়িত করেন, যেমনটি নিম্নলিখিত কোড উদাহরণে প্রদর্শিত হয়েছে।

<fragment
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:name="com.google.android.libraries.mapsplatform.transportation.consumer.view.ConsumerMapFragment"
    android:id="@+id/consumer_map_fragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

getConsumerGoogleMapAsync() কলটি onCreate() পদ্ধতি থেকে আসা উচিত।

জাভা

public class SampleAppActivity extends AppCompatActivity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {

    // Find the ConsumerMapFragment.
    ConsumerMapFragment consumerMapFragment =
        (ConsumerMapFragment) fragmentManager.findFragmentById(R.id.consumer_map_fragment);

    // Initiate the callback that returns the map.
    if (consumerMapFragment != null) {
      consumerMapFragment.getConsumerGoogleMapAsync(
          new ConsumerMapReadyCallback() {
            // The map returned in the callback is used to access the ConsumerController.
            @Override
            public void onConsumerMapReady(@NonNull ConsumerGoogleMap consumerGoogleMap) {
              ConsumerController consumerController = consumerGoogleMap.getConsumerController();
            }
          });
    }
  }

}

কোটলিন

class SampleAppActivity : AppCompatActivity() {
  override fun onCreate(savedInstanceState: Bundle?) {
    // Find the ConsumerMapFragment.
    val consumerMapFragment =
      fragmentManager.findFragmentById(R.id.consumer_map_fragment) as ConsumerMapFragment

    consumerMapFragment.getConsumerGoogleMapAsync(
      object : ConsumerMapReadyCallback() {
        override fun onConsumerMapReady(consumerGoogleMap: ConsumerGoogleMap) {
          val consumerController = consumerGoogleMap.getConsumerController()!!
        }
      }
    )
  }
}
ConsumerMapView

আপনার XML ফাইলে সংজ্ঞায়িত হিসাবে ভিউটি একটি খণ্ডে বা একটি কার্যকলাপে ব্যবহার করা যেতে পারে।

<com.google.android.libraries.mapsplatform.transportation.consumer.view.ConsumerMapView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/consumer_map_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

getConsumerGoogleMapAsync() কলটি onCreate() থেকে হওয়া উচিত। কলব্যাক প্যারামিটার ছাড়াও, এর জন্য MapView এর জন্য কনফিগারেশন বৈশিষ্ট্য সমন্বিত কার্যকলাপ বা খণ্ড এবং GoogleMapOptions (যা শূন্য হতে পারে) প্রয়োজন। অ্যাক্টিভিটি বা ফ্র্যাগমেন্ট বেস ক্লাস অবশ্যই একটি FragmentActivity বা একটি সাপোর্ট Fragment (যথাক্রমে) হতে হবে, যেহেতু তারা এর জীবনচক্রে অ্যাক্সেস প্রদান করে।

জাভা

public class SampleAppActivity extends AppCompatActivity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    ConsumerMapView mapView = findViewById(R.id.consumer_map_view);

    if (mapView != null) {
      mapView.getConsumerGoogleMapAsync(
          new ConsumerMapReadyCallback() {
            // The map returned in the callback is used to access the ConsumerController.
            @Override
            public void onConsumerMapReady(@NonNull ConsumerGoogleMap consumerGoogleMap) {
              ConsumerController consumerController = consumerGoogleMap.getConsumerController();
            }
          }, this, null);
    }
  }

}

কোটলিন

class SampleAppActivity : AppCompatActivity() {
  override fun onCreate(savedInstanceState: Bundle?) {
    val mapView = findViewById(R.id.consumer_map_view) as ConsumerMapView

    mapView.getConsumerGoogleMapAsync(
      object : ConsumerMapReadyCallback() {
        // The map returned in the callback is used to access the ConsumerController.
        override fun onConsumerMapReady(consumerGoogleMap: ConsumerGoogleMap) {
          val consumerController = consumerGoogleMap.getConsumerController()!!
        }
      },
      /* fragmentActivity= */ this,
      /* googleMapOptions= */ null,
    )
  }
}

একটি খণ্ডের একটি MapView একটি কার্যকলাপে MapView এর জন্য উপরের উদাহরণের মতোই, ব্যতীত যে খণ্ডটি লেআউটটিকে ফুলিয়ে দেয় যা ফ্র্যাগমেন্ট onCreateView() পদ্ধতিতে MapView অন্তর্ভুক্ত করে।

জাভা

public class MapViewInFragment extends Fragment {

  @Override
  public View onCreateView(
      @NonNull LayoutInflater layoutInflater,
      @Nullable ViewGroup viewGroup,
      @Nullable Bundle bundle) {
    return layoutInflater.inflate(R.layout.consumer_map_view, viewGroup, false);
  }

}

কোটলিন

class MapViewInFragment : Fragment() {
  override fun onCreateView(
    layoutInflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?,
  ): View {
    return layoutInflater.inflate(R.layout.consumer_map_view, viewGroup, false)
  }
}

যাত্রায় ফোকাস করতে ক্যামেরা জুম সামঞ্জস্য করা

মানচিত্র SDK-তে অন্তর্নির্মিত ডিফল্ট আমার অবস্থান বোতামটি ডিভাইসের অবস্থানের ক্যামেরাকে কেন্দ্র করে।

যদি একটি সক্রিয় জার্নি শেয়ারিং সেশন থাকে, আপনি ডিভাইসের অবস্থানের পরিবর্তে যাত্রায় ফোকাস করার জন্য ক্যামেরাকে কেন্দ্রে রাখতে চাইতে পারেন।

অ্যান্ড্রয়েড বিল্ট-ইন সমাধানের জন্য গ্রাহক SDK: অটোক্যামেরা

আপনাকে ডিভাইসের অবস্থানের পরিবর্তে যাত্রায় ফোকাস করতে দিতে, উপভোক্তা SDK একটি অটোক্যামেরা বৈশিষ্ট্য সরবরাহ করে যা ডিফল্টরূপে সক্রিয় থাকে। যাত্রা ভাগাভাগি রুট এবং পরবর্তী ট্রিপ ওয়েপয়েন্টে ফোকাস করতে ক্যামেরা জুম করে।

অটোক্যামেরা

ক্যামেরা আচরণ কাস্টমাইজ করা

আপনার যদি ক্যামেরা আচরণের উপর আরো নিয়ন্ত্রণের প্রয়োজন হয়, আপনি ConsumerController.setAutoCameraEnabled() ব্যবহার করে অটোক্যামেরা নিষ্ক্রিয় বা সক্ষম করতে পারেন।

ConsumerController.getCameraUpdate() সেই মুহুর্তে প্রস্তাবিত ক্যামেরা সীমা ফেরত দেয়। তারপর আপনি GoogleMap.moveCamera() বা GoogleMap.animateCamera() কে একটি যুক্তি হিসাবে এই CameraUpdate প্রদান করতে পারেন।

রাইড শেয়ারিং এবং ম্যাপ অ্যাক্সেস করুন

আপনার অ্যাপ্লিকেশানে রাইড শেয়ারিং এবং ম্যাপ ইন্টারঅ্যাকশন সমর্থন করার জন্য, আপনার ConsumerGoogleMap এবং ConsumerController এ অ্যাক্সেস প্রয়োজন। ConsumerMapFragment এবং ConsumerMapView উভয়ই ConsumerMapReadyCallbackConsumerGoogleMap অ্যাসিঙ্ক্রোনাস ফেরত দেয়। ConsumerGoogleMap getConsumerController() থেকে ConsumerController প্রদান করে। আপনি নিম্নলিখিত হিসাবে ConsumerGoogleMap এবং ConsumerController অ্যাক্সেস করতে পারেন।

জাভা

private ConsumerGoogleMap consumerGoogleMap;
private ConsumerController consumerController;
private ConsumerMapView consumerMapView;

consumerMapView.getConsumerGoogleMapAsync(
    new ConsumerMapReadyCallback() {
      @Override
      public void onConsumerMapReady(@NonNull ConsumerGoogleMap consumerMap) {
        consumerGoogleMap = consumerMap;
        consumerController = consumerMap.getConsumerController();
      }
    },
    this, null);

কোটলিন

var consumerGoogleMap: ConsumerGoogleMap
var consumerController: ConsumerController
val consumerMapView = findViewById(R.id.consumer_map_view) as ConsumerMapView

consumerMapView.getConsumerGoogleMapAsync(
  object : ConsumerMapReadyCallback() {
    override fun onConsumerMapReady(consumerMap: ConsumerGoogleMap) {
      consumerGoogleMap = consumerMap
      consumerController = consumerMap.getConsumerController()
    },
    /* fragmentActivity= */ this,
    /* googleMapOptions= */ null,
  }
)

ভোক্তা GoogleMap

ConsumerGoogleMap হল GoogleMap ক্লাসের জন্য একটি মোড়ক শ্রেণী। এটি GoogleMap এর সমতুল্য একটি API ব্যবহার করে মানচিত্রের সাথে ইন্টারঅ্যাক্ট করার ক্ষমতা আপনার অ্যাপকে প্রদান করে। ভোক্তা মানচিত্র ব্যবহার করে আপনার অ্যাপ এবং রাইড শেয়ারিং একই অন্তর্নিহিত GoogleMap-এর সাথে নির্বিঘ্নে ইন্টারঅ্যাক্ট করতে দেয়। উদাহরণস্বরূপ, GoogleMap শুধুমাত্র একটি একক কলব্যাক নিবন্ধনের অনুমতি দেয়, কিন্তু ConsumerGoogleMap দ্বৈত নিবন্ধিত কলব্যাক সমর্থন করে। এই কলব্যাকগুলি আপনার অ্যাপ এবং রাইড শেয়ারিংকে কলব্যাক নিবন্ধন করার অনুমতি দেয় যা ক্রমানুসারে বলা হয়।

ভোক্তা নিয়ন্ত্রক

ConsumerController রাইড শেয়ারিং কার্যকারিতা যেমন ট্রিপ নিরীক্ষণ, ট্রিপ স্ট্যাটাস নিয়ন্ত্রণ এবং অবস্থান নির্ধারণের অ্যাক্সেস প্রদান করে।

যাত্রা ভাগাভাগি সেট আপ করুন

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

  1. TripModel অবজেক্টে একজন শ্রোতাকে রেজিস্টার করুন ট্রিপ সম্পর্কে বিশদ বিবরণ পেতে যেমন ETA (আনুমানিক আগমনের সময়) এবং আগমনের আগে গাড়িটিকে ভ্রমণ করতে হবে এমন দূরত্ব।

    জাভা

    // Create a TripModel instance for listening to updates to the trip specified by this trip name.
    String tripName = ...;
    TripModelManager tripModelManager = consumerApi.getTripModelManager();
    TripModel tripModel = tripModelManager.getTripModel(tripName);
    
    // Create a JourneySharingSession instance based on the TripModel.
    JourneySharingSession session = JourneySharingSession.createInstance(tripModel);
    
    // Add the JourneySharingSession instance on the map for updating the UI.
    consumerController.showSession(session);
    
    // Register for trip update events.
    tripModel.registerTripCallback(new TripModelCallback() {
      @Override
      public void onTripETAToNextWaypointUpdated(
          TripInfo tripInfo, @Nullable Long timestampMillis) {
        // ...
      }
    
      @Override
      public void onTripActiveRouteRemainingDistanceUpdated(
          TripInfo tripInfo, @Nullable Integer distanceMeters) {
        // ...
      }
    
      // ...
    });
    

    কোটলিন

    // Create a TripModel instance for listening to updates to the trip specified by this trip name.
    val tripName = "tripName"
    val tripModelManager = consumerApi.getTripModelManager()
    val tripModel = tripModelManager.getTripModel(tripName)
    
    // Create a JourneySharingSession instance based on the TripModel.
    val session = JourneySharingSession.createInstance(tripModel)
    
    // Add the JourneySharingSession instance on the map for updating the UI.
    consumerController.showSession(session)
    
    // Register for trip update events.
    tripModel.registerTripCallback(
      object : TripModelCallback() {
        override fun onTripETAToNextWaypointUpdated(
          tripInfo: TripInfo,
          timestampMillis: Long?,
        ) {
          // ...
        }
    
        override fun onTripActiveRouteRemainingDistanceUpdated(
          tripInfo: TripInfo,
          distanceMeters: Int?,
        ) {
          // ...
        }
    
      // ...
    })
    
  2. TripModelOptions ব্যবহার করে আপনার ট্রিপ কনফিগার করুন।

    জাভা

    // Set refresh interval to 2 seconds.
    TripModelOptions tripOptions =
        TripModelOptions.builder().setRefreshIntervalMillis(2000).build();
    tripModel.setTripModelOptions(tripOptions);
    

    কোটলিন

    // Set refresh interval to 2 seconds.
    val tripOptions = TripModelOptions.builder().setRefreshIntervalMillis(2000).build()
    tripModel.setTripModelOptions(tripOptions)
    

যাত্রা ভাগাভাগি বন্ধ করুন

নিশ্চিত করুন যে আপনি যাত্রা ভাগাভাগি বন্ধ করেছেন যখন এটির আর প্রয়োজন নেই, যেমন হোস্ট কার্যকলাপ ধ্বংস হয়ে গেলে। যাত্রা ভাগাভাগি বন্ধ করা ফ্লিট ইঞ্জিনের নেটওয়ার্ক অনুরোধগুলিও বন্ধ করে দেয় এবং মেমরি লিক প্রতিরোধ করে।

নিম্নলিখিত নমুনা কোড প্রদর্শন করে কিভাবে যাত্রা ভাগাভাগি বন্ধ করতে হয়।

জাভা

public class MainActivity extends AppCompatActivity
    implements ConsumerViewModel.JourneySharingListener  {

  // Class implementation

  @Override
  protected void onDestroy() {
    super.onDestroy();

    if (journeySharingSession != null) {
      journeySharingSession.stop();
    }
  }
}

কোটলিন

class SampleAppActivity : AppCompatActivity(), ConsumerViewModel.JourneySharingListener {

  // Class implementation

  override fun onDestroy() {
    super.onDestroy()

    journeySharingSession?.stop()
  }
}

ট্রিপ ত্রুটি হ্যান্ডেল

onTripRefreshError পদ্ধতিটি ট্রিপ মনিটরিংয়ের সময় ঘটে যাওয়া ত্রুটিগুলিকে প্রকাশ করে। ভোক্তা SDK ত্রুটিগুলির জন্য ম্যাপিং Google ক্লাউড প্ল্যাটফর্মের জন্য প্রতিষ্ঠিত একই HTTP/RPC নির্দেশিকা অনুসরণ করে৷ ট্রিপ নিরীক্ষণের সময় সাধারণ ত্রুটিগুলির মধ্যে নিম্নলিখিতগুলি অন্তর্ভুক্ত রয়েছে:

HTTP আরপিসি বর্ণনা
400 INVALID_ARGUMENT ক্লায়েন্ট একটি অবৈধ ট্রিপ নাম উল্লেখ করেছে৷ ট্রিপের নাম অবশ্যই ফরম্যাট providers/{provider_id}/trips/{trip_id} অনুসরণ করবে। প্রদানকারী_আইডি অবশ্যই পরিষেবা প্রদানকারীর মালিকানাধীন ক্লাউড প্রকল্পের আইডি হতে হবে।
401 অননুমোদিত একটি অবৈধ JWT টোকেনের কারণে অনুরোধটি প্রমাণীকরণ করা হয়নি। এই ত্রুটি ঘটবে যদি JWT টোকেনটি ট্রিপ আইডি ছাড়া স্বাক্ষর করা হয় বা JWT টোকেনের মেয়াদ শেষ হয়ে যায়।
403 PERMISSION_DENIED ক্লায়েন্টের পর্যাপ্ত অনুমতি নেই। JWT টোকেন অবৈধ হলে, ক্লায়েন্টের অনুমতি না থাকলে বা ক্লায়েন্ট প্রকল্পের জন্য API সক্ষম না হলে এই ত্রুটি ঘটে। JWT টোকেন অনুপস্থিত হতে পারে বা টোকেনটি একটি ট্রিপ আইডি দিয়ে স্বাক্ষরিত যা অনুরোধ করা ট্রিপ আইডির সাথে মেলে না।
429 RESOURCE_EXHAUSTED রিসোর্স কোটা শূন্য বা ট্রাফিকের হার সীমা ছাড়িয়ে গেছে।
503 অনুপলব্ধ সেবা প্রদান করা যাচ্ছে না. সাধারণত সার্ভার ডাউন থাকে।
504 DEADLINE_EXCEEDED অনুরোধের সময়সীমা অতিক্রম করেছে৷ এটি তখনই ঘটবে যখন কলকারী একটি নির্দিষ্ট সময়সীমা সেট করে যা পদ্ধতির ডিফল্ট সময়সীমার চেয়ে ছোট (অর্থাৎ অনুরোধ করা সময়সীমা সার্ভারের জন্য অনুরোধটি প্রক্রিয়া করার জন্য যথেষ্ট নয়) এবং অনুরোধটি সময়সীমার মধ্যে শেষ না হয়৷

আরও তথ্যের জন্য, উপভোক্তা SDK ত্রুটি হ্যান্ডলিং দেখুন।