অ্যান্ড্রয়েডের যেকোনো হোম এপিআই ব্যবহার করার আগে, আপনাকে অবশ্যই আপনার অ্যাপে হোম ইনিশিয়ালাইজ করতে হবে। এই ধাপে, আপনি লোকাল কনটেক্সটের জন্য Home একটি সিঙ্গেলটন ইনস্ট্যান্স তৈরি করবেন।
একই সময়ে Home এর কেবল একটি ইনস্ট্যান্সই সক্রিয় থাকা উচিত।
এটি হোম এপিআই-এর প্রবেশপথ এবং এর সাথে আপনাকে ডিভাইস ও স্ট্রাকচার এবং অটোমেশন এপিআই-এর জন্য কোন বৈশিষ্ট্য এবং ডিভাইসের ধরন ব্যবহার করতে চান, তাও ঘোষণা করতে হয়। আপনি যদি গুগল হোম ইকোসিস্টেমের সাথে সবেমাত্র কাজ শুরু করে থাকেন এবং কোন বৈশিষ্ট্য বা ডিভাইসের ধরন নিবন্ধন করবেন সে সম্পর্কে নিশ্চিত না হন, তবে আমরা এই নির্দেশিকায় সবচেয়ে প্রচলিত কয়েকটির পরামর্শ দিয়েছি।
একটি হোম ইনস্ট্যান্স তৈরি করুন
শুরু করার জন্য, এই প্যাকেজগুলি আপনার অ্যাপে ইম্পোর্ট করুন:
import android.content.Context
import com.google.home.FactoryRegistry
import com.google.home.HomeConfig
import com.google.home.Home
হোম এপিআইগুলো চালু করতে:
Applicationকনটেক্সট-এর একটি রেফারেন্স নিন। এই কনটেক্সট কোনো অ্যাক্টিভিটি লাইফসাইকেলের উপর নির্ভর করে না এবং আপনার অ্যাপ চালু থাকা পর্যন্ত এটিও বিদ্যমান থাকবে। একটিActivityবাServiceমধ্যেgetApplicationContext()কল করে আপনি এটি পেতে পারেন।val context = getApplicationContext()আপনার অ্যাপে ব্যবহার করতে ইচ্ছুক সমস্ত ট্রেইট এবং ডিভাইস টাইপ সহ একটি
FactoryRegistryইনস্ট্যান্স তৈরি করুন।এই নির্দেশিকার জন্য, আমরা কিছু সাধারণ ডিভাইসের প্রকারভেদ (যেমন লাইট, প্লাগ, সেন্সর, সুইচ এবং থার্মোস্ট্যাট; এবং অটোমেশনের জন্য প্রেজেন্স ও অ্যাসিস্ট্যান্ট ট্রেইট) প্রস্তাব করেছি, যদি আপনি নিশ্চিত না থাকেন যে আপনার ঠিক কী প্রয়োজন। আরও জানতে, ‘ট্রেইট এবং ডিভাইসের প্রকারভেদের নিবন্ধন’ দেখুন।
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এর সিঙ্গেলটন ইনস্ট্যান্সটি তৈরি করুন, যা API-গুলোর এন্ট্রি পয়েন্ট।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,
),
)
}
}
অ্যাপ-প্রবর্তিত গুগল সাইন-ইন
আপনি আপনার অ্যাপের মধ্যেই ব্যবহারকারীর গুগল প্রমাণীকরণ পরিচালনা করতে চাইতে পারেন। এর ফলে আপনি গুগল হোম, ড্রাইভ, ম্যাপস ইত্যাদির মতো বিভিন্ন গুগল পরিষেবা জুড়ে একই ব্যবহারকারী অ্যাকাউন্ট ব্যবহার করতে পারবেন।
অ্যাপ-ভিত্তিক গুগল সাইন-ইন-এর মাধ্যমে, আপনি কোনো নির্দিষ্ট ব্যবহারকারীর সাথে সুস্পষ্টভাবে সংযুক্ত একটি HomeClient ইনস্ট্যান্স পেতে পারেন, যার ফলে অ্যাকাউন্টটি আগে থেকেই অনুমোদিত থাকলে গুগল অ্যাকাউন্ট পিকার এবং সম্মতি স্ক্রিনটি এড়িয়ে যাওয়া যায়।
এছাড়াও, এই পদ্ধতি ব্যবহারকারীদের দুটি ভিন্ন অ্যাকাউন্ট নির্বাচন স্ক্রিন দেখতে বাধা দেয় — একটি অ্যাপের সাইন-ইন থেকে এবং অন্যটি গুগল হোম থেকে।
এটি করার জন্য, আপনাকে অবশ্যই 'Sign in with Google' দিয়ে ব্যবহারকারীদের প্রমাণীকরণ দেখুন এবং নিম্নলিখিত ধাপগুলো সম্পন্ন করতে হবে:
একটি OAuth ওয়েব অ্যাপ্লিকেশন ক্লায়েন্ট আইডি তৈরি করুন
- গুগল ক্লাউড কনসোল খুলুন
- গুগল ক্লাউড কনসোল ক্রেডেনশিয়ালস পৃষ্ঠায় যান।
- বিদ্যমান কোনো প্রকল্প নির্বাচন করুন অথবা নতুন একটি তৈরি করুন।
- OAuth সম্মতি স্ক্রিনটি কনফিগার করুন (যদি না করে থাকেন)।
- ক্রেডেনশিয়াল তৈরি করার আগে, নিশ্চিত করুন যে OAuth সম্মতি স্ক্রিনটি আপনার অ্যাপের বিবরণ, যার মধ্যে গোপনীয়তা নীতি এবং পরিষেবার শর্তাবলীর URL অন্তর্ভুক্ত, দিয়ে কনফিগার করা আছে।
- একটি OAuth ক্লায়েন্ট আইডি তৈরি করুন (ওয়েব অ্যাপ্লিকেশন প্রকার)
- ক্রেডেনশিয়ালস পেজে,
+ CREATE CREDENTIALSক্লিক করুন এবং ড্রপ-ডাউন মেনু থেকে OAuth ক্লায়েন্ট আইডি নির্বাচন করুন। - অ্যাপ্লিকেশনের ধরন হিসেবে ওয়েব অ্যাপ্লিকেশন নির্বাচন করুন।
- আপনার ওয়েব ক্লায়েন্টের জন্য একটি নাম লিখুন (যেমন, "আমার অ্যাপ ওয়েব ব্যাকএন্ড")।
- তৈরি করুন-এ ক্লিক করুন।
- ক্রেডেনশিয়ালস পেজে,
- ক্লায়েন্ট আইডি পুনরুদ্ধার করুন
- তৈরি করার পরে, কনসোলে আপনার নতুন ক্লায়েন্ট আইডি প্রদর্শিত হবে। এই মানটিই আপনি আপনার অ্যান্ড্রয়েড অ্যাপ্লিকেশনে ব্যবহার করবেন (যেমন " {প্রজেক্ট নম্বর}-.....apps.googleusercontent.com ")।
- ক্লায়েন্ট আইডি সরাসরি হার্ডকোড না করে, এটি বাহ্যিকভাবে (যেমন,
build.gradleএ) সংরক্ষণ করার পরামর্শ দেওয়া হচ্ছে।
একটি গুগল সাইন-ইন অনুরোধ ইনস্ট্যানশিয়েট করুন
গুগল সাইন-ইন অনুরোধ তৈরি করতে ওয়েব অ্যাপ আইডি ব্যবহার করুন:
// 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()
গুগল দিয়ে সাইন ইন করার ফ্লো তৈরি করুন
সাইন-ইন প্রক্রিয়াটি বাস্তবায়ন করতে, CredentialManager ব্যবহার করে একটি Sign in with Google অনুরোধ পাঠান। ব্যবহারকারী একটি অ্যাকাউন্ট নির্বাচন করলে, প্রাপ্ত Google ID Token থেকে তার ইমেলটি নিয়ে একটি android.accounts.Account তৈরি করুন। এরপর এই অ্যাকাউন্টটি ব্যবহার করে বিশেষভাবে সেই সাইন-ইন করা ব্যবহারকারীর জন্য একটি 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 ইনস্ট্যান্সে নিম্নলিখিত মেথডগুলো কল করে ব্যবহারকারীর অনুমতি চান:
- আপনি যে ActivityResultCaller-টি ব্যবহার করতে চান, তার একটি রেফারেন্স সহ
registerActivityResultCallerForPermissions()। -
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)
হোম এপিআই-এর অনুমতি ব্যবস্থাপনার বিষয়ে আরও তথ্যের জন্য পারমিশন এপিআই দেখুন।
নতুন HomeClient দিয়ে সম্পূর্ণ অ্যাক্টিভিটিটি রিফ্রেশ করুন।
একবার আপনার একটি নতুন HomeClient ইনস্ট্যান্স তৈরি হয়ে গেলে, পুনরায় সাবস্ক্রাইব করতে এবং এই ব্যবহারকারী অ্যাকাউন্টের সাথে যুক্ত সম্পূর্ণ কাঠামো, ডিভাইস এবং অন্যান্য প্রাসঙ্গিক ডেটা সংগ্রহ করতে আপনাকে অবশ্যই পুরো অ্যাক্টিভিটিটি রিফ্রেশ করতে হবে।
বৈশিষ্ট্য এবং ডিভাইসের প্রকারের নিবন্ধন
FactoryRegistry ক্লাসটি ডেভেলপারদের তাদের অ্যাপে কোন ট্রেইট এবং ডিভাইসের ধরন ব্যবহৃত হচ্ছে তা স্পষ্টভাবে নির্দেশ করার সুযোগ দিয়ে অ্যাপের বাইনারি সাইজ অপ্টিমাইজ করতে সাহায্য করে।
মনে রাখবেন যে পারমিশন এবং ফ্যাক্টরি রেজিস্ট্রি পরস্পর বিচ্ছিন্ন। তাই, যে সমস্ত অনিবন্ধিত ট্রেইট এবং টাইপ পারমিশনের মাধ্যমে আপনার অ্যাপে উপলব্ধ কিন্তু ফ্যাক্টরি রেজিস্ট্রিতে অন্তর্ভুক্ত নয়, সেগুলি অটোমেশন এপিআই ব্যবহার করে অ্যাক্সেস করা যায় না এবং বাল্ক traits() বা types() মেথড কলেও ফেরত আসে না।