Android के लिए Home API का इस्तेमाल करने से पहले, आपको अपने ऐप्लिकेशन में होम को शुरू करना होगा. इस चरण में, आपको लोकल कॉन्टेक्स्ट के लिए सिंगलटन इंस्टेंस Home बनाना होगा.
एक बार में, Home का सिर्फ़ एक इंस्टेंस चालू होना चाहिए.
यह Home API का एंट्री पॉइंट है. इसमें यह भी तय किया जाता है कि Device & Structure और Automation API के साथ, आपको कौनसी ट्रेट और डिवाइस टाइप इस्तेमाल करने हैं. अगर आपने अभी-अभी Google Home के साथ काम करने वाले डिवाइसों का इस्तेमाल शुरू किया है और आपको यह नहीं पता कि कौनसी सुविधाएं या डिवाइस टाइप रजिस्टर करने हैं, तो हमने इस गाइड में कुछ सामान्य सुझाव दिए हैं.
होम इंस्टेंस बनाना
शुरू करने के लिए, इन पैकेज को अपने ऐप्लिकेशन में इंपोर्ट करें:
import android.content.Context
import com.google.home.FactoryRegistry
import com.google.home.HomeConfig
import com.google.home.Home
Home API को शुरू करने के लिए:
Applicationकॉन्टेक्स्ट का रेफ़रंस पाएं. यह कॉन्टेक्स्ट, किसी भी गतिविधि के लाइफ़साइकल पर निर्भर नहीं करता. यह तब तक उपलब्ध रहेगा, जब तक आपका ऐप्लिकेशन चालू है. इसे पाने के लिए,ActivityयाServiceके बीचgetApplicationContext()पर कॉल करें:val context = getApplicationContext()अपने ऐप्लिकेशन में इस्तेमाल की जाने वाली सभी सुविधाओं और डिवाइस टाइप के साथ
FactoryRegistryइंस्टेंस बनाएं.इस गाइड में, हमने कुछ सामान्य डिवाइसों के टाइप (जैसे, लाइट, प्लग, सेंसर, स्विच, और थर्मोस्टैट) और ऑटोमेशन के लिए, मौजूदगी और Assistant की सुविधाओं के बारे में बताया है. अगर आपको नहीं पता कि आपको क्या चाहिए, तो यह जानकारी आपके काम आ सकती है. ज़्यादा जानने के लिए, ट्रेडमार्क और डिवाइस टाइप का रजिस्ट्रेशन लेख पढ़ें.
val registry = FactoryRegistry( traits = listOf( AirQuality, AreaAttendanceState, AreaPresenceState, AssistantBroadcast, AssistantFulfillment, BooleanState, ColorControl, ExtendedColorControl, FlowMeasurement, IlluminanceMeasurement, LevelControl, Notification, OccupancySensing, OnOff, RelativeHumidityMeasurement, Switch, TemperatureMeasurement, Thermostat), types = listOf( AirQualitySensorDevice, ColorDimmerSwitchDevice, ColorTemperatureLightDevice, ContactSensorDevice, DimmableLightDevice, DimmablePlugInUnitDevice, DimmerSwitchDevice, ExtendedColorLightDevice, FlowSensorDevice, GenericSwitchDevice, HumiditySensorDevice, LightSensorDevice, OccupancySensorDevice, OnOffLightDevice, OnOffLightSwitchDevice, OnOffPluginUnitDevice, OnOffSensorDevice, SpeakerDevice, TemperatureSensorDevice, ThermostatDevice))यहां रजिस्टर की गई हर एक खासियत और डिवाइस टाइप के लिए, इंपोर्ट स्टेटमेंट ज़रूरी हैं (Android Studio आपको इन्हें जोड़ने के लिए कहेगा).
Dispatchers.IOकोरुटीन कॉन्टेक्स्ट और अपने रजिस्ट्री इंस्टेंस का इस्तेमाल करके,HomeConfigको इंस्टैंटिएट करें.val homeConfig = HomeConfig( coroutineContext = Dispatchers.IO, factoryRegistry = registry)आखिर में, कॉन्टेक्स्ट और
HomeConfigका इस्तेमाल करके, एपीआई के एंट्री पॉइंटHomeका सिंगलटन इंस्टेंस बनाएं.val homeManager: HomeClient = Home.getClient(context, homeConfig)
अमान्य सेशन से जुड़ी गड़बड़ियों से बचने के लिए, यह ज़रूरी है कि Home का सिर्फ़ एक सिंगलटन इंस्टेंस बनाया जाए. इसके लिए, इसे ऑब्जेक्ट डिक्लेरेशन में रैप करें.
उदाहरण के लिए, सैंपल ऐप्लिकेशन में ऐसा इस तरह किया जाता है:
internal object HomeClientModule {
@Provides
@Singleton
fun provideHomeClient(@ApplicationContext context: Context): HomeClient {
return Home.getClient(
context,
HomeConfig(
coroutineContext = IODispatcherModule.provideIoDispatcher(),
factoryRegistry = registry,
),
)
}
}
ऐप्लिकेशन से शुरू होने वाला Google साइन-इन
ऐसा हो सकता है कि आपको अपने ऐप्लिकेशन में, उपयोगकर्ता के Google ऑथेंटिकेशन को मैनेज करना हो. ऐसा करने से, Google की अलग-अलग सेवाओं में एक ही उपयोगकर्ता खाते का इस्तेमाल किया जा सकता है. जैसे, Google Home, Drive, Maps वगैरह.
ऐप्लिकेशन से शुरू होने वाली Google साइन-इन सुविधा की मदद से, किसी उपयोगकर्ता से जुड़ा HomeClient इंस्टेंस पाया जा सकता है. इससे, Google खाता चुनने वाले टूल और सहमति स्क्रीन को बायपास किया जा सकता है. ऐसा तब होता है, जब खाते को पहले ही अनुमति मिल चुकी हो.
इसके अलावा, इस तरीके से उपयोगकर्ताओं को खाता चुनने के लिए दो अलग-अलग स्क्रीन नहीं दिखतीं. एक स्क्रीन, ऐप्लिकेशन में साइन इन करने के लिए होती है और दूसरी Google Home के लिए.
इसके लिए, आपको 'Google से साइन इन करें' सुविधा का इस्तेमाल करके उपयोगकर्ताओं की पुष्टि करना लेख पढ़ना होगा. साथ ही, यह तरीका अपनाना होगा:
OAuth वेब ऐप्लिकेशन क्लाइंट आईडी बनाना
- Google Cloud Console खोलें
- Google Cloud Console के क्रेडेंशियल पेज पर जाएं.
- कोई मौजूदा प्रोजेक्ट चुनें या नया प्रोजेक्ट बनाएं.
- अगर आपने अब तक OAuth की सहमति वाली स्क्रीन को कॉन्फ़िगर नहीं किया है, तो उसे कॉन्फ़िगर करें
- क्रेडेंशियल बनाने से पहले, पक्का करें कि OAuth सहमति स्क्रीन को आपके ऐप्लिकेशन की जानकारी के साथ कॉन्फ़िगर किया गया हो. इसमें निजता नीति और सेवा की शर्तों के यूआरएल शामिल हैं.
- OAuth क्लाइंट आईडी (वेब ऐप्लिकेशन टाइप) बनाना
- क्रेडेंशियल पेज पर,
+ CREATE CREDENTIALSपर क्लिक करें. इसके बाद, ड्रॉप-डाउन मेन्यू से OAuth क्लाइंट आईडी चुनें. - ऐप्लिकेशन टाइप के लिए, वेब ऐप्लिकेशन चुनें.
- अपने वेब क्लाइंट के लिए कोई नाम डालें. जैसे, "My App Web Backend").
- 'बनाएं' पर क्लिक करें.
- क्रेडेंशियल पेज पर,
- क्लाइंट आईडी वापस पाना
- नया क्लाइंट आईडी बनाने के बाद, कंसोल में दिखेगा. इस वैल्यू का इस्तेमाल, Android ऐप्लिकेशन में किया जाएगा. उदाहरण के लिए, "{project number}-.....apps.googleusercontent.com")
- हमारा सुझाव है कि आप क्लाइंट आईडी को सीधे तौर पर हार्डकोड करने के बजाय, उसे बाहरी तौर पर सेव करें. उदाहरण के लिए,
build.gradleमें
Google साइन-इन अनुरोध को इंस्टैंशिएट करना
Google से साइन इन करने का अनुरोध बनाने के लिए, वेब ऐप्लिकेशन आईडी का इस्तेमाल करें:
// Your Google Cloud console Web Client ID for Google Sign-In
val serverClientId = BuildConfig.DEFAULT_WEB_CLIENT_ID
// Build the request for Google ID token
val googleIdOption = GetGoogleIdOption.Builder()
.setFilterByAuthorizedAccounts(false) // Show all Google Accounts on the device
.setServerClientId(serverClientId) // embed WebClientID in token
.build()
// Build the GetCredentialRequest
val request = GetCredentialRequest.Builder().addCredentialOption(googleIdOption).build()
'Google से साइन इन करें' सुविधा का फ़्लो बनाना
साइन-इन करने की प्रोसेस लागू करने के लिए, Sign in with Google अनुरोध को पूरा करने के लिए CredentialManager का इस्तेमाल करें. जब उपयोगकर्ता कोई खाता चुन लेता है, तो android.accounts.Account बनाने के लिए, नतीजे के तौर पर मिले Google आईडी टोकन से उसका ईमेल पता निकालें. इसके बाद, इस खाते का इस्तेमाल करके HomeClient का एक ऐसा इंस्टेंस शुरू किया जाता है जो खास तौर पर उस उपयोगकर्ता से जुड़ा होता है जिसने साइन इन किया है.
try {
// CredentialManager is responsible for interacting with various credential providers on the device
val credentialManager = CredentialManager.create(context)
// Credential returns when user has selected an account and the getCredential call completes
val result = credentialManager.getCredential(context = context, request = request)
val credential = result.credential
if (
credential is CustomCredential &&
credential.type == GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL
) {
try {
val googleCredential = GoogleIdTokenCredential.createFrom(credential.data)
googleCredential.id.let { userEmail ->
Log.i(TAG, "Email found in Google ID Token: $email")
/*
Why "com.google"?
The string "com.google" is a standard identifier used in Android's android.accounts.
Account system to represent accounts managed by Google. This is often used when
interacting with Android's Account Manager or when using Google-specific APIs. So,
even if the email ends in "@gmail.com", the underlying account type or provider is
still considered "com.google" within the Android system.
*/
val account = Account(userEmail, "com.google")
Log.d(TAG,"Switched account to : $userEmail")
// Get the new Home Client Instance with the userEmail
}
Log.i(TAG, "Account switch complete. Emitting navigation event.")
} catch (e: Exception) {
Log.e(TAG,"Could not convert CustomCredential to Google ID Token", e)
}
}
} catch (e: Exception) {
Log.e(TAG, "Google Sign-In failed with unexpected error", e)
}
नया HomeClient इंस्टेंस पाना
होम इंस्टेंस बनाना में दिए गए चरणों का पालन करें. हालांकि, चौथे चरण में Home.getClient(context, homeConfig) को कॉल करने के बजाय, Home.getClient(context, userAccount,
homeConfig) को कॉल करें. इसमें दूसरा पैरामीटर Lazy<UserAccount> होता है. इससे HomeClientWithProvidedAccount का एक इंस्टेंस मिलता है. यह HomeClient की एक सबक्लास है. यह खास तौर पर, बताए गए Google खाते से जुड़ी होती है:
val client =
Home.getClient(
context = context.applicationContext,
account =
lazy {
// 1. Create the Account object.
val androidAccount = Account(userEmail,
GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE)
// 2. Wrap it in UserAccount.GoogleAccount.
UserAccount.GoogleAccount(androidAccount)
},
homeConfig = HomeConfig()
)
अगर तय किया गया उपयोगकर्ता, अनुमति देने के लिए अधिकृत नहीं है, तो HomeClientWithProvidedAccount इंस्टेंस पर यहां दिए गए तरीकों को कॉल करके, उपयोगकर्ता से अनुमति मांगें:
registerActivityResultCallerForPermissions()को उस ActivityResultCaller के रेफ़रंस के साथ कॉल करें जिसका आपको इस्तेमाल करना है.requestPermissions(). इससे GHP की सहमति वाली स्क्रीन खुल जाती है. यहां उपयोगकर्ता अपनी अनुमति दे सकता है.
UserAccount की मदद से HomeClient बनाया जा सकता है. इसके बाद, forceLaunch==true के साथ requestPermissions() को कॉल करके, सहमति वाली स्क्रीन को फिर से लॉन्च किया जा सकता है. इससे उपयोगकर्ता को अनुमतियां अपडेट करने का विकल्प मिलता है:
val client =
Home.getClient(
context = context.applicationContext,
account =
lazy {
UserAccount.GoogleAccount(androidAccount)
},
homeConfig = HomeConfig()
)
client.registerActivityResultCallerForPermissions(this)
client.requestPermissions(forceLaunch= true)
होम एपीआई की अनुमतियां मैनेज करने के बारे में ज़्यादा जानने के लिए, Permissions API देखें.
नई HomeClient की मदद से, पूरी गतिविधि को रीफ़्रेश करें
नया HomeClient इंस्टेंस मिलने के बाद, आपको पूरी गतिविधि को रीफ़्रेश करना होगा. इससे आपको फिर से सदस्यता लेने और इस उपयोगकर्ता खाते से जुड़े सभी स्ट्रक्चर, डिवाइसों, और अन्य ज़रूरी डेटा को फ़ेच करने में मदद मिलेगी.
ट्रेड और डिवाइस टाइप का रजिस्ट्रेशन
FactoryRegistry क्लास की मदद से डेवलपर, अपने ऐप्लिकेशन के बाइनरी साइज़ को ऑप्टिमाइज़ कर सकते हैं. इसके लिए, उन्हें साफ़ तौर पर यह बताना होता है कि उनके ऐप्लिकेशन में कौनसी खासियतें और डिवाइस टाइप इस्तेमाल किए जाते हैं.
ध्यान दें कि अनुमतियां और फ़ैक्ट्री रजिस्ट्री अलग-अलग होती हैं. इसलिए, बिना रजिस्टर की गई ऐसी खासियतें और टाइप जो अनुमतियों का इस्तेमाल करके आपके ऐप्लिकेशन के लिए उपलब्ध हैं, लेकिन फ़ैक्ट्री रजिस्ट्री में शामिल नहीं हैं उन्हें Automation API का इस्तेमाल करके ऐक्सेस नहीं किया जा सकता. साथ ही, वे traits() या types() तरीके के कॉल में भी नहीं दिखते.