'मांग पर राइड और डिलीवरी सलूशन' बैकएंड सेवाओं के साथ इंटिग्रेट किया गया एक बेसिक उपभोक्ता ऐप्लिकेशन बनाने और चलाने के लिए, उपभोक्ता SDK टूल का इस्तेमाल किया जा सकता है. आपके पास यात्रा और ऑर्डर की स्थिति दिखाने वाला ऐसा ऐप्लिकेशन बनाने का विकल्प है जो यात्रा की मौजूदा जानकारी दिखा सके, यात्रा से जुड़े अपडेट के जवाब दे सके, और यात्रा की गड़बड़ियों को ठीक कर सके.
Consumer SDK में मॉड्यूलर आर्किटेक्चर है. इसलिए, एपीआई के उन हिस्सों का इस्तेमाल किया जा सकता है जिनका इस्तेमाल आपको अपने ऐप्लिकेशन के लिए करना है. साथ ही, उन्हें अपने एपीआई, Fleet Engine से मिलने वाली बैकएंड सेवाओं, और Google Maps Platform के एपीआई जोड़ने की सुविधा के साथ इंटिग्रेट किया जा सकता है.
सिस्टम के लिए ज़रूरी शर्तें
मोबाइल डिवाइस पर Android 6.0 (एपीआई लेवल 23) या उसके बाद का वर्शन होना ज़रूरी है.
बिल्ड और डिपेंडेंसी कॉन्फ़िगरेशन
उपभोक्ता SDK टूल के 1.99.0 और उसके बाद के वर्शन, 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>
प्रोजेक्ट कॉन्फ़िगरेशन
Android के लिए उपभोक्ता SDK टूल का इस्तेमाल करने के लिए, आपके ऐप्लिकेशन को
minSdkVersion
23 या उसके बाद के वर्शन को टारगेट करना होगा.
Consumer SDK की मदद से बनाए गए किसी ऐप्लिकेशन को चलाने के लिए, Android डिवाइस पर Google Play services इंस्टॉल होनी चाहिए.
अपना डेवलपमेंट प्रोजेक्ट सेट अप करें
अपना डेवलपमेंट प्रोजेक्ट सेट अप करने और Google Cloud Console पर प्रोजेक्ट के लिए एपीआई पासकोड पाने के लिए:
उपभोक्ता SDK टूल के साथ इस्तेमाल करने के लिए, एक नया Google Cloud Console प्रोजेक्ट बनाएं या कोई मौजूदा प्रोजेक्ट चुनें. Google Cloud Console पर नया प्रोजेक्ट दिखने तक, थोड़ा इंतज़ार करें.
डेमो ऐप्लिकेशन चलाने के लिए, आपके प्रोजेक्ट के पास Android के लिए Maps SDK का ऐक्सेस होना चाहिए. Google Cloud Console में, एपीआई और सेवाएं > लाइब्रेरी चुनें. इसके बाद, Android के लिए Maps SDK टूल खोजें और उसे चालू करें.
एपीआई और सेवाएं > क्रेडेंशियल > क्रेडेंशियल बनाएं > एपीआई पासकोड चुनकर, प्रोजेक्ट के लिए एपीआई पासकोड पाएं. एपीआई पासकोड पाने के बारे में ज़्यादा जानने के लिए, एपीआई पासकोड पाना देखें.
अपने ऐप्लिकेशन में उपभोक्ता SDK टूल जोड़ना
उपभोक्ता SDK टूल, एक निजी Maven रिपॉज़िटरी के ज़रिए उपलब्ध है. डेटा स्टोर करने की जगह में, SDK टूल का प्रोजेक्ट ऑब्जेक्ट मॉडल (.pom) फ़ाइलें और Javadocs शामिल होते हैं. अपने ऐप्लिकेशन में Consumer SDK टूल जोड़ने के लिए:
पिछले सेक्शन में बताए गए तरीके से, होस्ट Maven का डेटा स्टोर करने की जगह को ऐक्सेस करने के लिए, अपना एनवायरमेंट सेट अप करें.
अगर आपने
settings.gradle
में एक ही जगह पर डिपेंडेंसी मैनेजमेंट कॉन्फ़िगरेशन का एलान किया है, तो उसे इस तरह बंद करें.settings.gradle
में से यह कोड ब्लॉक हटाएं:import org.gradle.api.initialization.resolve.RepositoriesMode dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() mavenCentral() } }
अपने Gradle या Maven कॉन्फ़िगरेशन में यह डिपेंडेंसी जोड़ें. साथ ही, कंज़्यूमर SDK टूल के अपनी पसंद के वर्शन की जगह
VERSION_NUMBER
प्लेसहोल्डर का इस्तेमाल करें.ग्रेडल
अपने
build.gradle
में यह जोड़ें:dependencies { ... implementation 'com.google.android.libraries.mapsplatform.transportation:transportation-consumer:VERSION_NUMBER' }
Maven
अपने
pom.xml
में यह जोड़ें:<dependencies> ... <dependency> <groupId>com.google.android.libraries.mapsplatform.transportation</groupId> <artifactId>transportation-consumer</artifactId> <version>VERSION_NUMBER</version> </dependency> </dependencies>
उपभोक्ता SDK टूल, Maps के SDK टूल पर निर्भर करता है. यह डिपेंडेंसी इस तरह कॉन्फ़िगर की जाती है कि अगर Maps SDK टूल के वर्शन को नीचे दी गई कॉन्फ़िगरेशन फ़ाइल में साफ़ तौर पर नहीं बताया गया है, तो Maps SDK का नया वर्शन रिलीज़ होने के बाद भी, उपभोक्ता SDK टूल के लिए ज़रूरी वर्शन का इस्तेमाल जारी रहेगा.
ग्रेडल
अपने
build.gradle
में यह जोड़ें:dependencies { ... implementation 'com.google.android.gms:play-services-maps:18.1.0' }
Maven
अपने
pom.xml
में यह जोड़ें:<dependencies> ... <dependency> <groupId>com.google.android.gms</groupId> <artifactId>play-services-maps</artifactId> <version>18.1.0</version> </dependency> </dependencies>
अपने ऐप्लिकेशन में एपीआई पासकोड जोड़ना
अपने ऐप्लिकेशन में Consumer SDK टूल जोड़ने के बाद, अपने ऐप्लिकेशन में एपीआई पासकोड जोड़ें. आपको वही प्रोजेक्ट एपीआई पासकोड इस्तेमाल करना होगा जो आपको डेवलपमेंट प्रोजेक्ट सेट अप करते समय मिला था.
इस सेक्शन में, एपीआई पासकोड को सेव करने का तरीका बताया गया है, ताकि आपका ऐप्लिकेशन इसे ज़्यादा सुरक्षित तरीके से इस्तेमाल कर सके. आपको वर्शन कंट्रोल सिस्टम में एपीआई पासकोड की जांच नहीं करनी चाहिए. इसे local.properties
फ़ाइल में सेव करना चाहिए, जो आपके प्रोजेक्ट की रूट डायरेक्ट्री में मौजूद है. local.properties
फ़ाइल के बारे में ज़्यादा जानकारी के लिए, gradle प्रॉपर्टी फ़ाइलें देखें.
इस टास्क को आसान बनाने के लिए, Android के लिए सीक्रेट ग्रेडल प्लगिन का इस्तेमाल किया जा सकता है.
प्लगिन इंस्टॉल करने और अपनी एपीआई कुंजी सेव करने के लिए:
अपनी रूट-लेवल की
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") } }
ऐप्लिकेशन-लेवल की अपनी
build.gradle
फ़ाइल खोलें औरplugins
एलिमेंट में यह कोड जोड़ें.ग्रूवी
id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin'
Kotlin
id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin")
अगर आप Android Studio का इस्तेमाल करते हैं, तो अपने प्रोजेक्ट को Gradle के साथ सिंक करें.
अपने प्रोजेक्ट लेवल की डायरेक्ट्री में
local.properties
खोलें और इसके बाद, नीचे दिया गया कोड जोड़ें.YOUR_API_KEY
को अपनी एपीआई पासकोड से बदलें.MAPS_API_KEY=YOUR_API_KEY
अपनी
AndroidManifest.xml
फ़ाइल में,com.google.android.geo.API_KEY
पर जाएं औरandroid:value
एट्रिब्यूट को इस तरह अपडेट करें:<meta-data android:name="com.google.android.geo.API_KEY" android:value="${MAPS_API_KEY}" />
नीचे दिए गए उदाहरण में, ऐप्लिकेशन के सैंपल के लिए पूरा मेनिफ़ेस्ट दिखाया गया है:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.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_लाइसेंस.txt" फ़ाइल में देखी जा सकती है.
ओपन सोर्स सूचनाओं को शामिल करने का तरीका जानने के लिए, https://developers.google.com/android/guides/opensource पर जाएं.
उपभोक्ता SDK टूल की पुष्टि करें
उपभोक्ता SDK टूल, JSON वेब टोकन का इस्तेमाल करके पुष्टि करने की सुविधा देता है. JSON Web Token (JWT), एक JSON-बेस ऐक्सेस टोकन है. यह किसी सेवा पर एक या एक से ज़्यादा दावे करता है. उदाहरण के लिए, कोई सर्वर ऐसा टोकन जनरेट कर सकता है जिसमें "एडमिन के तौर पर लॉग इन किया गया" दावा किया गया हो और उसे क्लाइंट को उपलब्ध कराया जा सकता हो. इसके बाद, क्लाइंट उस टोकन का इस्तेमाल करके यह साबित कर सकता है कि उसे एडमिन के तौर पर लॉग इन किया गया है.
कंज़्यूमर SDK टूल, Fleet Engine से संपर्क करने के लिए, ऐप्लिकेशन से मिले JSON वेब टोकन का इस्तेमाल करता है. ज़्यादा जानकारी के लिए, फ़्लीट इंजन की पुष्टि करना और अनुमति देना देखें.
ऑथराइज़ेशन टोकन के टोकन के authorization
हेडर में tripid:TRIP_ID
दावा शामिल होना चाहिए, जहां TRIP_ID
यात्रा आईडी है. इससे उपभोक्ता SDK टूल को यात्रा की जानकारी मिलती है. इसमें वाहन की स्थिति, रास्ता, और ETA जैसी जानकारी शामिल होती है.
JSON वेब टोकन कॉलबैक
शुरू करने के दौरान, कंज़्यूमर SDK टूल, ऐप्लिकेशन के साथ ऑथराइज़ेशन टोकन कॉलबैक को रजिस्टर करता है. SDK टूल, ऐप्लिकेशन को कॉल करके उन सभी नेटवर्क अनुरोधों के लिए टोकन लेता है जिनके लिए अनुमति की ज़रूरत होती है.
हमारा सुझाव है कि आप कॉलबैक के लिए, लागू की गई कैश मेमोरी में मौजूद ऑथराइज़ेशन टोकन को रीफ़्रेश करें. साथ ही, expiry
का समय बीत जाने के बाद ही उसे रीफ़्रेश करें. टोकन जारी करने के एक घंटे के अंदर ही, टोकन जारी करना चाहिए.
ऑथराइज़ेशन टोकन कॉलबैक से यह पता चलता है कि TripService
सेवा के लिए, कौनसा सेवा टोकन ज़रूरी है. इससे कॉन्टेक्स्ट के लिए ज़रूरी tripId
भी दी गई है.
नीचे दिए गए उदाहरण में, ऑथराइज़ेशन टोकन कॉलबैक को लागू करने का तरीका बताया गया है.
Java
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;
}
}
Kotlin
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 Cloud प्रोजेक्ट का प्रोजेक्ट आईडी है. प्रोजेक्ट बनाने के बारे में ज़्यादा जानकारी के लिए, Fleet Engine की उपयोगकर्ता गाइड देखें.
आपके ऐप्लिकेशन को AuthTokenFactory
को लागू करना होगा, जैसा कि उपभोक्ता के लिए SDK टूल की पुष्टि करने की प्रक्रिया में बताया गया है.
Java
Task<ConsumerApi> consumerApiTask = ConsumerApi.initialize(
this, "myProviderId", authTokenFactory);
consumerApiTask.addOnSuccessListener(
consumerApi -> this.consumerApi = consumerApi);
Kotlin
val consumerApiTask =
ConsumerApi.initialize(this, "myProviderId", authTokenFactory)
consumerApiTask?.addOnSuccessListener { consumerApi: ConsumerApi ->
this@YourActivity.consumerApi = consumerApi
}
Maps SDK टूल और मैप रेंडरर
उपभोक्ता SDK v2.x.x, Android के v18.1.0 और इसके बाद के वर्शन में Maps SDK टूल के साथ काम करता है. यहां दी गई टेबल में, Maps के SDK टूल के वर्शन के हिसाब से डिफ़ॉल्ट रेंडरर की खास जानकारी दी गई है. साथ ही, दोनों रेंडरर के काम करने की क्षमता के बारे में भी जानकारी दी गई है. हमारा सुझाव है कि आप सबसे नए रेंडरर का इस्तेमाल करें. हालांकि, अगर आपको लेगसी रेंडरर का इस्तेमाल करना है, तो MapsInitializer.initialize()
का इस्तेमाल करके, रेंडरर की जानकारी साफ़ तौर पर दी जा सकती है.
Maps SDK टूल का वर्शन | सबसे नए रेंडरर के साथ काम करता है | पुराने रेंडरर के साथ काम करता है | डिफ़ॉल्ट रेंडरर |
---|---|---|---|
V18.1.0 और इससे पहले के वर्शन | हां | हां | लेगसी* |
V18.2.0 | हां | हां | नए |
* नए मैप रेंडरर के लॉन्च के साथ, नया रेंडरर डिफ़ॉल्ट हो जाएगा.
Maps SDK टूल को डिपेंडेंसी के तौर पर जोड़ें
ग्रेडल
अपने build.gradle
में यह जोड़ें:
dependencies {
//...
implementation "com.google.android.gms:play-services-maps:VERSION_NUMBER"
}
Maven
अपने 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 टूल शुरू करने से पहले, रेंडर करने वाले अनुरोध के नतीजे का इंतज़ार करें.
java
@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();
}
});
}
Kotlin
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) और वेक्टर ड्रॉबल के लिए सहायता जोड़ें
अगर आपके ऐप्लिकेशन डिज़ाइन को एपीआई 19 (KitKat) डिवाइसों और वेक्टर ड्रॉबल के साथ काम करने की ज़रूरत है, तो अपनी ऐक्टिविटी में यह कोड जोड़ें. ये कोड, उपभोक्ता SDK में
वेक्टर ड्रॉएबल का इस्तेमाल करने के लिए AppCompatActivity
को एक्सटेंड करते हैं.
Java
// ...
import android.support.v7.app.AppCompatActivity;
// ...
public class ConsumerTestActivity extends AppCompatActivity {
// ...
}
Kotlin
// ...
import android.support.v7.app.AppCompatActivity
// ...
class ConsumerTestActivity : AppCompatActivity() {
// ...
}
मैप फ़्रैगमेंट या व्यू जोड़ें
आपके पास, सफ़र की शेयरिंग को Android फ़्रैगमेंट या किसी व्यू में दिखाने के लिए मैप बनाने का विकल्प होता है, जिसे आपने ऐप्लिकेशन के लेआउट एक्सएमएल फ़ाइल (/res/layout
में मौजूद) में तय किया होता है. इसके बाद, फ़्रैगमेंट (या व्यू) आपको यात्रा की जानकारी शेयर करने वाला मैप ऐक्सेस करने की सुविधा देता है, जिसे आपका ऐप्लिकेशन ऐक्सेस और बदलाव कर सकता है. इस मैप में ConsumerController
का हैंडल भी होता है. इससे आपका ऐप्लिकेशन, सफ़र की जानकारी शेयर करने की सुविधा को कंट्रोल और पसंद के मुताबिक बना पाता है.
यात्रा के दौरान मैप और कंट्रोलर शेयर किया जा रहा है
सफ़र की जानकारी शेयर करने वाले मैप को या तो फ़्रैगमेंट (ConsumerMapFragment
का इस्तेमाल करके) या व्यू के तौर पर (ConsumerMapView
का इस्तेमाल करके) बताया जाता है, जैसा कि नीचे दिए गए कोड के उदाहरण में दिखाया गया है. इसके बाद, आपके onCreate()
वाले तरीके को getConsumerGoogleMapAsync(callback)
को कॉल करना चाहिए, जो कॉलबैक में ConsumerGoogleMap
को एसिंक्रोनस तरीके से दिखाता है. इसके बाद, यात्रा की जानकारी शेयर करने के लिए ConsumerGoogleMap
का इस्तेमाल किया जाता है और आपके ऐप्लिकेशन में ज़रूरत के मुताबिक इसे अपडेट किया जा सकता है.
ConsumerMapFragment
आपने अपने ऐप्लिकेशन लेआउट की एक्सएमएल फ़ाइल में फ़्रैगमेंट तय किया है, जैसा कि कोड के नीचे दिए गए उदाहरण में दिखाया गया है.
<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()
तरीके से किया जाना चाहिए.
Java
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();
}
});
}
}
}
Kotlin
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
व्यू का इस्तेमाल या तो किसी फ़्रैगमेंट में या किसी गतिविधि में किया जा सकता है, जैसा कि आपकी एक्सएमएल फ़ाइल में बताया गया है.
<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()
का होना चाहिए. कॉलबैक पैरामीटर के अलावा, इसके लिए ज़रूरी ऐक्टिविटी या फ़्रैगमेंट और GoogleMapOptions
(जो शून्य हो सकते हैं) की ज़रूरत होती है, जिनमें MapView
के लिए कॉन्फ़िगरेशन एट्रिब्यूट होते हैं. ऐक्टिविटी या फ़्रैगमेंट बेस क्लास, या तो FragmentActivity
या सहायता Fragment
होनी चाहिए (क्रमश:), क्योंकि उनसे अपने लाइफ़साइकल का ऐक्सेस मिलता है.
Java
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);
}
}
}
Kotlin
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
शामिल होता है.
Java
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);
}
}
Kotlin
class MapViewInFragment : Fragment() {
override fun onCreateView(
layoutInflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?,
): View {
return layoutInflater.inflate(R.layout.consumer_map_view, viewGroup, false)
}
}
सफ़र पर फ़ोकस करने के लिए कैमरे के ज़ूम को अडजस्ट किया जा रहा है
Maps SDK में मौजूद डिफ़ॉल्ट मेरी जगह का बटन, कैमरे को डिवाइस की जगह पर फ़ोकस करता है.
अगर गतिविधि को शेयर करने वाला कोई सेशन चालू है, तो कैमरे को बीच में रखें, ताकि सफ़र पर फ़ोकस किया जा सके न कि डिवाइस की जगह की.
Android में पहले से मौजूद समाधान के लिए उपभोक्ता SDK टूल: AutoCamera
आपको डिवाइस की जगह के बजाय सफ़र पर फ़ोकस करने के लिए, उपभोक्ता SDK टूल में AutoCamera की सुविधा उपलब्ध होती है. यह सुविधा डिफ़ॉल्ट रूप से चालू रहती है. इससे कैमरा ज़ूम करके, सफ़र शेयर करने के रूट और अगली ट्रिप वेपॉइंट पर फ़ोकस करता है.
कैमरा व्यवहार को पसंद के मुताबिक बनाना
अगर आपको कैमरे के काम करने के तरीके पर ज़्यादा कंट्रोल चाहिए, तो ConsumerController.setAutoCameraEnabled() का इस्तेमाल करके ऑटोकैमरा को बंद या चालू किया जा सकता है.
ConsumerController.getCameraUpdate() उस समय कैमरे की सुझाई गई सीमाएं दिखाता है जो उस समय दिखते हैं. इसके बाद, इस CameraUpdate
को GoogleMap.moveCamera() या GoogleMap.animateCamera()
को तर्क के तौर पर दिया जा सकता है.
राइडशेयर करने की सुविधा और मैप ऐक्सेस करें
अपने ऐप्लिकेशन में राइडशेयर करने और मैप इंटरैक्शन की सुविधा देने के लिए, आपके पास ConsumerGoogleMap
और ConsumerController
का ऐक्सेस होना चाहिए.
ConsumerMapFragment
और
ConsumerMapView
, दोनों ConsumerMapReadyCallback
में
ConsumerGoogleMap
को एसिंक्रोनस तरीके से दिखाते हैं.
ConsumerGoogleMap
की वजह से,
getConsumerController()
से ConsumerController
की कीमत दिखाई गई है. ConsumerGoogleMap
और ConsumerController
को इस तरह से ऐक्सेस किया जा सकता है.
Java
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);
Kotlin
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,
}
)
ConsumerGoogleMap
ConsumerGoogleMap
, GoogleMap
क्लास के लिए एक रैपर क्लास है. यह आपके ऐप्लिकेशन को GoogleMap
के बराबर एपीआई का इस्तेमाल करके मैप के साथ इंटरैक्ट करने की सुविधा देता है. उपभोक्ता मैप का इस्तेमाल करने से आपके ऐप्लिकेशन और राइड शेयरिंग
को उसी बुनियादी Googleमैप के साथ आसानी से इंटरैक्ट कर सकते हैं. उदाहरण के लिए,
GoogleMap
सिर्फ़ एक कॉलबैक रजिस्ट्रेशन की अनुमति देता है, लेकिन
ConsumerGoogleMap
, ड्यूअल रजिस्टर कॉलबैक के साथ काम करता है.
ये कॉलबैक आपके ऐप्लिकेशन और राइड शेयरिंग को उन कॉलबैक रजिस्टर करने की अनुमति देते हैं
जिन्हें क्रम से लागू किया जाता है.
ConsumerController
ConsumerController
आपको राइड शेयर करने की सुविधाएं देता है, जैसे कि यात्राओं की निगरानी करना, यात्रा की स्थिति को कंट्रोल करना, और जगहों की जानकारी सेट करना.
'गतिविधि शेयर करना' सुविधा को सेट अप करें
बैकएंड, वाहन के साथ उपभोक्ता का मिलान कर ले, तो सफ़र की जानकारी शेयर करने वाला यूज़र इंटरफ़ेस शुरू करने के लिए, JourneySharingSession
का इस्तेमाल करें. 'गतिविधि शेयर करें' विकल्प में, वाहन की जगह
और रास्ते की जानकारी दिखती है. अपने ऐप्लिकेशन में SDK टूल लागू करने के बाद, यात्राओं को मॉनिटर करने, अपडेट सुनने, और गड़बड़ियों को ठीक करने के लिए, यह सुविधा जोड़ी जा सकती है.
नीचे दी गई प्रक्रियाओं में यह माना जाता है कि बैकएंड सेवाएं मौजूद हैं और उपभोक्ताओं को वाहनों से मिलान करने के लिए आपकी सेवाएं चालू हैं.
यात्रा के बारे में जानकारी पाने के लिए,
TripModel
ऑब्जेक्ट पर एक लिसनर रजिस्टर करें. जैसे, ETA (आने का अनुमानित समय) और पहुंचने से पहले वाहन को कितनी दूरी तय करनी है.Java
// 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) { // ... } // ... });
Kotlin
// 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?, ) { // ... } // ... })
TripModelOptions
का इस्तेमाल करके अपनी यात्रा को कॉन्फ़िगर करें.Java
// Set refresh interval to 2 seconds. TripModelOptions tripOptions = TripModelOptions.builder().setRefreshIntervalMillis(2000).build(); tripModel.setTripModelOptions(tripOptions);
Kotlin
// Set refresh interval to 2 seconds. val tripOptions = TripModelOptions.builder().setRefreshIntervalMillis(2000).build() tripModel.setTripModelOptions(tripOptions)
यात्रा शेयर करना बंद करें
पक्का करें कि ज़रूरत न होने पर आपने 'गतिविधि शेयर करना' बंद कर दिया. जैसे, होस्ट की गतिविधि खत्म होने पर. 'यात्रा शेयर करना' बंद करने से, Fleet Engine को नेटवर्क के अनुरोध भी बंद हो जाते हैं और मेमोरी लीक होने से बचा जा सकता है.
नीचे दिए गए सैंपल कोड में बताया गया है कि 'गतिविधि के साथ शेयर करना' सुविधा को कैसे बंद किया जाए.
Java
public class MainActivity extends AppCompatActivity
implements ConsumerViewModel.JourneySharingListener {
// Class implementation
@Override
protected void onDestroy() {
super.onDestroy();
if (journeySharingSession != null) {
journeySharingSession.stop();
}
}
}
Kotlin
class SampleAppActivity : AppCompatActivity(), ConsumerViewModel.JourneySharingListener {
// Class implementation
override fun onDestroy() {
super.onDestroy()
journeySharingSession?.stop()
}
}
यात्रा से जुड़ी गड़बड़ियां ठीक करना
onTripRefreshError
तरीके से, यात्रा को मॉनिटर करने के दौरान होने वाली गड़बड़ियों का पता चलता है.
उपभोक्ता SDK टूल की गड़बड़ियों की मैपिंग, उन एचटीटीपी/आरपीसी दिशा-निर्देशों का पालन करती है जो Google Cloud Platform के लिए तय किए गए हैं.
यात्रा पर निगरानी रखने के दौरान दिखने वाली सामान्य गड़बड़ियों में ये शामिल हैं:
HTTP | RPC | ब्यौरा |
---|---|---|
400 | INVALID_ARGUMENT | क्लाइंट ने यात्रा का अमान्य नाम डाला है. यात्रा का नाम providers/{provider_id}/trips/{trip_id} फ़ॉर्मैट के हिसाब से होना चाहिए.
provider_id, सेवा देने वाली कंपनी के मालिकाना हक वाले
Cloud प्रोजेक्ट का आईडी होना चाहिए. |
401 | पुष्टि नहीं की गई | अमान्य JWT टोकन की वजह से अनुरोध की पुष्टि नहीं की जा सकी. यह गड़बड़ी तब होगी, जब JWT टोकन को ट्रिप आईडी के बिना साइन किया गया हो या JWT टोकन की समयसीमा खत्म हो गई हो. |
403 | PERMISSION_DENIED | क्लाइंट के पास ज़रूरी अनुमति नहीं है. यह गड़बड़ी तब होती है, जब JWT टोकन अमान्य हो, क्लाइंट के पास अनुमति न हो या क्लाइंट प्रोजेक्ट के लिए एपीआई चालू न हो. शायद JWT टोकन मौजूद नहीं है या टोकन को किसी ऐसे यात्रा आईडी से साइन किया गया है जो अनुरोध किए गए यात्रा आईडी से मेल नहीं खाती. |
429 | RESOURCE_EXHAUSTED | रिसॉर्स कोटा शून्य है या ट्रैफ़िक की दर तय सीमा से ज़्यादा है. |
503 | हवा की क्वालिटी की जानकारी उपलब्ध नहीं है | सेवा उपलब्ध नहीं है. आम तौर पर, सर्वर काम नहीं करता है. |
504 | DEADLINE_EXCEEDED | अनुरोध की समयसीमा खत्म हो गई है. ऐसा सिर्फ़ तब होगा, जब कॉल करने वाला कोई समयसीमा तय करे जो उसके लिए तय की गई डिफ़ॉल्ट समयसीमा से कम हो.जैसे, अनुरोध को पूरा करने के लिए, अनुरोध की गई समयसीमा काफ़ी नहीं होती. साथ ही, अनुरोध को तय समयसीमा के अंदर पूरा नहीं किया जा सकता. |
ज़्यादा जानकारी के लिए, उपभोक्ता SDK टूल की गड़बड़ी को मैनेज करना लेख पढ़ें.