অ্যান্ড্রয়েডে হোম শুরু করুন

অ্যান্ড্রয়েডের জন্য যেকোনো হোম এপিআই ব্যবহার করার আগে, আপনার অ্যাপে হোমটি ইনিশিয়ালাইজ করতে হবে। এই ধাপে, আপনি স্থানীয় প্রসঙ্গের জন্য Home একটি সিঙ্গেলটন ইনস্ট্যান্স তৈরি করবেন।

একবারে Home শুধুমাত্র একটি ইনস্ট্যান্স সক্রিয় থাকা উচিত।

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

একটি হোম ইনস্ট্যান্স তৈরি করুন

শুরু করতে, আপনার অ্যাপে এই প্যাকেজগুলি আমদানি করুন:

import android.content.Context
import com.google.home.FactoryRegistry
import com.google.home.HomeConfig
import com.google.home.Home

হোম এপিআইগুলি আরম্ভ করতে:

  1. Application প্রসঙ্গের একটি রেফারেন্স পান। এই প্রসঙ্গের কোনও কার্যকলাপ জীবনচক্রের উপর নির্ভর করে না এবং আপনার অ্যাপ্লিকেশনটি যতক্ষণ জীবিত থাকবে ততক্ষণ এটি কার্যকর থাকবে। আপনি একটি Activity বা Service মধ্যে getApplicationContext() কল করে এটি পেতে পারেন:

    val context = getApplicationContext()
    
  2. আপনার অ্যাপে ব্যবহার করার জন্য আপনার পছন্দের সমস্ত বৈশিষ্ট্য এবং ডিভাইসের ধরণ সহ একটি 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 আপনাকে এগুলি যোগ করার জন্য অনুরোধ করবে)।

  3. Dispatchers.IO coroutine প্রসঙ্গ এবং আপনার রেজিস্ট্রি ইনস্ট্যান্স ব্যবহার করে একটি HomeConfig ইন্সট্যান্টিয়েট করুন।

    val homeConfig = HomeConfig(
            coroutineContext = Dispatchers.IO,
            factoryRegistry = registry)
    
  4. অবশেষে, context এবং HomeConfig ব্যবহার করে Home এর singleton ইনস্ট্যান্স তৈরি করুন, যা 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,
      ),
    )
  }
}

অ্যাপ-ইনিশিয়েটেড গুগল সাইন-ইন

আপনি আপনার অ্যাপের মধ্যেই আপনার ব্যবহারকারীর Google প্রমাণীকরণ পরিচালনা করতে চাইতে পারেন। এটি করার মাধ্যমে আপনি Google Home, Drive, Maps ইত্যাদির মতো বিভিন্ন Google পরিষেবা জুড়ে একই ব্যবহারকারী অ্যাকাউন্ট ব্যবহার করতে পারবেন।

অ্যাপ-ইনিশিয়েট করা গুগল সাইন-ইনের মাধ্যমে, আপনি একটি নির্দিষ্ট ব্যবহারকারীর সাথে স্পষ্টভাবে সংযুক্ত একটি HomeClient ইনস্ট্যান্স পেতে পারেন, যার ফলে অ্যাকাউন্টটি ইতিমধ্যেই অনুমোদিত থাকা অবস্থায় গুগল অ্যাকাউন্ট পিকার এবং সম্মতি স্ক্রিনকে বাইপাস করা যায়।

উপরন্তু, এই পদ্ধতি ব্যবহারকারীদের দুটি ভিন্ন অ্যাকাউন্ট নির্বাচন স্ক্রিন দেখতে বাধা দেয় - একটি অ্যাপের সাইন-ইন থেকে এবং অন্যটি গুগল হোম থেকে।

এটি করার জন্য, আপনাকে "Google-এর মাধ্যমে ব্যবহারকারীদের প্রমাণীকরণ করুন" বিকল্পটি উল্লেখ করতে হবে এবং নিম্নলিখিত পদক্ষেপগুলি সম্পূর্ণ করতে হবে:

একটি OAuth ওয়েব অ্যাপ্লিকেশন ক্লায়েন্ট আইডি তৈরি করুন

  1. গুগল ক্লাউড কনসোল খুলুন
    • গুগল ক্লাউড কনসোল শংসাপত্র পৃষ্ঠায় নেভিগেট করুন।
    • একটি বিদ্যমান প্রকল্প নির্বাচন করুন অথবা একটি নতুন প্রকল্প তৈরি করুন।
  2. OAuth সম্মতি স্ক্রিন কনফিগার করুন (যদি না করে থাকেন)
    • শংসাপত্র তৈরি করার আগে, নিশ্চিত করুন যে OAuth সম্মতি স্ক্রিনটি আপনার অ্যাপের গোপনীয়তা নীতি এবং পরিষেবার শর্তাবলী URL সহ বিশদ বিবরণের সাথে কনফিগার করা আছে।
  3. একটি OAuth ক্লায়েন্ট আইডি তৈরি করুন (ওয়েব অ্যাপ্লিকেশনের ধরণ)
    • শংসাপত্র পৃষ্ঠায়, + CREATE CREDENTIALS ক্লিক করুন এবং ড্রপ-ডাউন মেনু থেকে OAuth ক্লায়েন্ট আইডি নির্বাচন করুন।
    • অ্যাপ্লিকেশন ধরণের জন্য, ওয়েব অ্যাপ্লিকেশন নির্বাচন করুন।
    • আপনার ওয়েব ক্লায়েন্টের জন্য একটি নাম লিখুন (যেমন, "আমার অ্যাপ ওয়েব ব্যাকএন্ড")।
    • তৈরি করুন ক্লিক করুন।
  4. ক্লায়েন্ট আইডি পুনরুদ্ধার করুন
    • তৈরির পর, কনসোলটি আপনার নতুন ক্লায়েন্ট আইডি প্রদর্শন করবে। এটি হল সেই মান যা আপনি আপনার অ্যান্ড্রয়েড অ্যাপ্লিকেশনে ব্যবহার করবেন (যেমন " {project number}-.....apps.googleusercontent.com ")
    • ক্লায়েন্ট আইডিটি সরাসরি হার্ডকোড করার পরিবর্তে বাইরের দিকে (যেমন, build.gradle এ) সংরক্ষণ করার পরামর্শ দেওয়া হচ্ছে।

একটি 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 ফ্লো দিয়ে সাইন ইন করুন তৈরি করুন

সাইন-ইন প্রবাহ বাস্তবায়নের জন্য, CredentialManager ব্যবহার করে একটি Sign in with Google অনুরোধ কার্যকর করুন। ব্যবহারকারী একবার একটি অ্যাকাউন্ট নির্বাচন করলে, একটি android.accounts.Account তৈরি করতে ফলাফল প্রাপ্ত Google ID টোকেন থেকে তাদের ইমেলটি বের করুন। এই অ্যাকাউন্টটি তখন সেই সাইন-ইন করা ব্যবহারকারীর সাথে বিশেষভাবে সংযুক্ত একটি 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 ইনস্ট্যান্স পান

Create a Home instance -এ বর্ণিত একই ধাপগুলি অনুসরণ করুন, কিন্তু ধাপ ৪ -এ 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 ইনস্ট্যান্সে নিম্নলিখিত পদ্ধতিগুলিতে কল করে ব্যবহারকারীর অনুমতির জন্য অনুরোধ করুন:

  1. registerActivityResultCallerForPermissions() ব্যবহার করুন, যেখানে ActivityResultCaller এর রেফারেন্স থাকবে।
  2. 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)

হোম এপিআই অনুমতি পরিচালনা সম্পর্কে আরও তথ্যের জন্য অনুমতি API দেখুন।

নতুন HomeClient দিয়ে পুরো কার্যকলাপটি রিফ্রেশ করুন

একবার আপনার একটি নতুন HomeClient ইনস্ট্যান্স হয়ে গেলে, আপনাকে পুনরায় সাবস্ক্রাইব করতে এবং এই ব্যবহারকারী অ্যাকাউন্টের সাথে সম্পর্কিত সম্পূর্ণ কাঠামো, ডিভাইস এবং অন্যান্য প্রাসঙ্গিক ডেটা আনতে সম্পূর্ণ কার্যকলাপটি রিফ্রেশ করতে হবে।

বৈশিষ্ট্য এবং ডিভাইসের প্রকারের নিবন্ধন

FactoryRegistry ক্লাস ডেভেলপারদের তাদের অ্যাপের বাইনারি আকার অপ্টিমাইজ করতে সাহায্য করে, যাতে তারা স্পষ্টভাবে নির্দেশ করতে পারে যে তাদের অ্যাপ কোন বৈশিষ্ট্য এবং ডিভাইসের ধরণ ব্যবহার করছে।

মনে রাখবেন যে অনুমতি এবং ফ্যাক্টরি রেজিস্ট্রি আলাদা করা হয়েছে। অতএব, অনিবন্ধিত বৈশিষ্ট্য এবং প্রকারগুলি যা আপনার অ্যাপে অনুমতি ব্যবহার করে উপলব্ধ কিন্তু ফ্যাক্টরি রেজিস্ট্রিতে অন্তর্ভুক্ত নয়, অটোমেশন API ব্যবহার করে অ্যাক্সেসযোগ্য নয় এবং সেগুলি বাল্ক traits() বা types() পদ্ধতি কলগুলিতে ফেরত দেওয়া হয় না।