অ্যান্ড্রয়েডে অনুমতি API

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

এই অনুমতি প্রক্রিয়াটি ব্যবহারকারীকে Google Home app (GHA) ব্যবহার না করেই একটি কাঠামো তৈরি করার সুযোগ দেয়, যদি আগে থেকে কোনোটি তৈরি করা না থাকে।

অনুমতি এপিআই একীভূত করুন

এগিয়ে যাওয়ার আগে, নিশ্চিত করুন যে আপনি অ্যান্ড্রয়েডে হোম ইনিশিয়ালাইজ করার ধাপটি অনুসরণ করেছেন। সেই ধাপের homeManager ইনস্ট্যান্সটি এখানকার সমস্ত পারমিশন উদাহরণে ব্যবহৃত হয়।

প্রথমে, SDK-এর সাথে একটি ActivityResultCaller রেজিস্টার করুন। উদাহরণস্বরূপ, স্যাম্পল অ্যাপটি এটি এভাবে পরিচালনা করে:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    homeManager.registerActivityResultCallerForPermissions(this)
  }

অনুমতি যাচাই করুন

অনুমতি অনুরোধ করার আগে, আমরা আপনাকে যাচাই করে দেখার পরামর্শ দিচ্ছি যে অ্যাপটির ব্যবহারকারী কাঠামোটি অ্যাক্সেস করার জন্য ইতিমধ্যে সম্মতি দিয়েছেন কিনা। এটি করার জন্য, PermissionsState ভ্যালুগুলোর একটি Flow ) পেতে Home ইনস্ট্যান্সের hasPermissions() মেথডটি কল করুন:

val permissionsReadyState =
homeManager.hasPermissions().collect { state ->
    when (state) {
      PermissionsState.GRANTED -> println("Permissions granted, no need to request permissions")
      PermissionsState.PERMISSIONS_STATE_UNAVAILABLE ->
          println("Permissions state unavailable, request permissions")

      PermissionsState.NOT_GRANTED ->
          println("OAuth permission is enabled but not granted yet, request permissions")

      PermissionsState.PERMISSIONS_STATE_UNINITIALIZED -> println(
          "Permissions state is not initialized yet. Clients should wait for another status update"
      )
      else ->
          throw IllegalStateException("""
            HomeClient.hasPermissions state should be PermissionsState.GRANTED,
            PermissionState.PERMISSIONS_STATE_UNINITIALIZED, or
            PermissionsState.PERMISSIONS_STATE_UNAVAILABLE. Actual state: $state
          """.trimIndent())
    }
}

যদি চেকটি NOT_GRANTED বা PERMISSIONS_STATE_UNAVAILABLE PermissionsState রিটার্ন করে, তার মানে হলো হয় ব্যবহারকারী অথবা অ্যাপ্লিকেশনটির স্ট্রাকচারটিতে অ্যাক্সেস নেই। যদি চেকটি GRANTED PermissionsState রিটার্ন করে কিন্তু পরবর্তীতে structures() কল করলে কোনো স্ট্রাকচার রিটার্ন না হয়, তাহলে হয় ব্যবহারকারী GHA সেটিংস পেজের মাধ্যমে অ্যাপটির অ্যাক্সেস প্রত্যাহার করেছেন, অথবা ব্যবহারকারীর প্রয়োজনীয় অ্যাক্সেস নেই।

অনুমতির জন্য অনুরোধ করুন

একটি নির্দিষ্ট কাঠামোর মধ্যে থাকা কাঠামো এবং ডিভাইসগুলো অ্যাক্সেস করার জন্য আপনার অ্যাপকে অনুমতি দিতে হবে।

যদি ব্যবহারকারী আগে থেকে অনুমতি না দিয়ে থাকেন, তাহলে Permissions UI চালু করতে এবং ফলাফলটি প্রক্রিয়া করতে Home ইনস্ট্যান্সের requestPermissions() পদ্ধতিটি ব্যবহার করুন:

fun requestPermissions(scope: CoroutineScope, onShowSnackbar: (String) -> Unit) {
  scope.launch {
    val result =
      try {
        homeManager.requestPermissions()
      } catch (e: HomeException) {
        PermissionsResult(
          PermissionsResultStatus.ERROR,
          "Got HomeException with error: ${e.message}",
        )
      }
    when (result.status) {
      PermissionsResultStatus.SUCCESS -> {
        Log.i(TAG, "Permissions successfully granted.")
      }
      PermissionsResultStatus.CANCELLED -> {
        Log.i(TAG, "User cancelled Permissions flow.")
        onShowSnackbar("User cancelled Permissions flow")
      }
      else -> {
        Log.e(
          TAG,
          "Failed to grant permissions with error: ${result.status}, ${result.errorMessage}",
        )
        onShowSnackbar("Failed to grant permissions with error: ${result.errorMessage}")
      }
    }
  }
}

পারমিশন UI সঠিকভাবে চালু হওয়ার জন্য, আপনাকে অবশ্যই আপনার অ্যাপের জন্য আগে থেকেই OAuth সেট আপ করে রাখতে হবে।

অনুমতি দিন

এখন আপনি আপনার অ্যাপটি চালাতে এবং ব্যবহারকারীকে অনুমতি প্রদান করতে সক্ষম হবেন। কোন ধরনের ব্যবহারকারী অনুমতি দিতে পারবে এবং কোন ধরনের ডিভাইসের জন্য অনুমতি দেওয়া যাবে, তা নির্ভর করবে আপনি আপনার অ্যাপটি Google Home Developer Console নিবন্ধন করেছেন কিনা তার উপর।

হোম এপিআই ব্যবহার করে কোনো অ্যাপ প্রকাশ করার জন্য Developer Console নিবন্ধন করা আবশ্যক। হোম এপিআই পরীক্ষা ও ব্যবহার করার জন্য এর প্রয়োজন নেই।

যদি কোনো অ্যাপ Developer Console নিবন্ধিত না থাকে , তাহলে সেটি যাচাইবিহীন অবস্থায় থাকবে। হোম এপিআই-এর ব্যবহার পরীক্ষা করার জন্য এটি সুপারিশ করা হয়:

  • শুধুমাত্র OAuth কনসোলে টেস্ট ইউজার হিসেবে নিবন্ধিত ব্যবহারকারীরাই অ্যাপটির জন্য অনুমতি প্রদান করতে পারবেন। একটি যাচাইবিহীন অ্যাপের জন্য টেস্ট ইউজারের সীমা ১০০ জন।

  • একটি যাচাইবিহীন অ্যাপ হোম এপিআই-এর জন্য OAuth দ্বারা সমর্থিত যেকোনো ধরনের ডিভাইসে অ্যাক্সেস পাবে ( Developer Console ডিভাইসের প্রকারের তালিকা দেওয়া আছে)। একটি কাঠামোর মধ্যে থাকা সমস্ত ডিভাইসকে এই অ্যাক্সেস দেওয়া হবে।

যদি কোনো অ্যাপ Developer Console নিবন্ধিত হয় এবং এক বা একাধিক ডিভাইসের ধরনে অ্যাক্সেসের জন্য অনুমোদন পেয়েছে, এবং OAuth-এর জন্য ব্র্যান্ড যাচাইকরণ সম্পন্ন হয়েছে , তাহলে এটি একটি যাচাইকৃত অবস্থায় থাকবে। প্রোডাকশনে একটি অ্যাপ চালু করার জন্য এই অবস্থাটি আবশ্যক:

  • পরীক্ষামূলক ব্যবহারকারীর সীমাবদ্ধতা আর প্রযোজ্য নয়। যেকোনো ব্যবহারকারী অ্যাপটিকে অনুমতি দিতে পারবেন।
  • ব্যবহারকারী শুধুমাত্র সেই ডিভাইস টাইপগুলিতেই অনুমতি দিতে পারবেন যেগুলি Developer Console অনুমোদিত হয়েছে।

এখন যেহেতু OAuth সেট আপ করা হয়েছে, অ্যাপের requestPermissions() কলটি নিম্নলিখিত ডায়ালগগুলি ট্রিগার করে:

  1. ব্যবহারকারীকে তার পছন্দের গুগল অ্যাকাউন্টটি বেছে নিতে বলা হয়।
  2. ব্যবহারকারীকে সেই কাঠামোটি নির্বাচন করতে বলা হয়, যেটিতে তিনি অ্যাপটিকে প্রবেশাধিকার দিতে চান।
    1. একটি যাচাইবিহীন অ্যাপের ক্ষেত্রে, হোম এপিআই দ্বারা সমর্থিত সকল ধরনের ডিভাইস অ্যাপটির জন্য উপলব্ধ থাকে।
    2. একটি যাচাইকৃত অ্যাপের ক্ষেত্রে, ব্যবহারকারী শুধুমাত্র সেই ডিভাইস টাইপগুলিতেই অনুমতি দিতে পারেন যেগুলি Developer Console অনুমোদিত হয়েছে।
    3. যেসব সংবেদনশীল ডিভাইস অ্যাপটির পরিচালনা করার ক্ষমতা আছে, সেগুলোর ক্ষেত্রে ব্যবহারকারী প্রতিটি ডিভাইসের জন্য আলাদাভাবে অ্যাক্সেস সীমাবদ্ধ করতে পারেন। উদাহরণস্বরূপ, যদি কোনো ব্যবহারকারীর তিনটি লক থাকে, তবে তিনি সেগুলোর মধ্যে কেবল একটি লকের অ্যাক্সেস দিতে পারবেন।
  • OAuth সম্মতি - অ্যাকাউন্ট নির্বাচন করুন
  • OAuth সম্মতি - ডিভাইস লিঙ্ক করুন 01
  • OAuth সম্মতি - ডিভাইস ০২ লিঙ্ক করুন
চিত্র ১ : OAuth সম্মতি প্রবাহের উদাহরণ

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

অনুমতি পরিবর্তন করুন

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

forceLaunch ফ্ল্যাগটি true সেট করে requestPermissions() আবার কল করার মাধ্যমে এটি করা যেতে পারে:

homeManager.requestPermissions(forceLaunch=true)

অনুমতি প্রত্যাহার করুন

ব্যবহারকারীরা পূর্বে প্রদত্ত প্রবেশাধিকার প্রত্যাহার করতে পারেন:

  1. Google MyAccounts পেজ > ডেটা ও গোপনীয়তা > থার্ড-পার্টি অ্যাপস ও পরিষেবা- এর মাধ্যমে। এটি প্রাথমিক সম্মতি দেওয়ার সময় ইস্যু করা OAuth টোকেনটি বাতিল করে দেবে এবং ব্যবহারকারী সমস্ত প্ল্যাটফর্ম (ফোন) ও প্ল্যাটফর্মে অ্যাপটির যে কোনো ইনস্ট্যান্স ব্যবহার করছিলেন, সেটির অ্যাক্সেসও প্রত্যাহার করে নেবে।

    ব্যবহারকারীকে নিম্নলিখিত ইউআরএল স্কিম ব্যবহার করে একটি ডিপ লিঙ্কের মাধ্যমে থার্ড-পার্টি অ্যাপস ও পরিষেবা সাব-পেজে নির্দেশিত করা যেতে পারে:

    https://myaccount.google.com/connections/link?project_number=Cloud project_number
    
  2. GHA > সেটিংস > লিঙ্কড অ্যাপস পেজের মাধ্যমে। GHA তে ক্লিক করলে আপনাকে সেটিংস পেজে নিয়ে যাওয়া হবে। সেখান থেকে, লিঙ্কড অ্যাপস টাইলটিতে ক্লিক করুন, যা আপনাকে সম্মতি স্ক্রিনের মতো দেখতে একটি পেজে নিয়ে যাবে। এই পেজ থেকে ব্যবহারকারী অ্যাপটির অ্যাক্সেস বন্ধ করতে পারেন। কোন ধরনের ডিভাইস বা নির্দিষ্ট সংবেদনশীল ডিভাইসগুলো অ্যাপটির জন্য অ্যাক্সেসযোগ্য হবে, তা পরিবর্তন করতেও ব্যবহারকারী এই একই পেজ ব্যবহার করতে পারেন।

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

কোনো ব্যবহারকারী সংবেদনশীল বা সীমাবদ্ধ ডিভাইসের ধরণ অ্যাক্সেস করার অনুমতি দিয়েছেন কিনা তা নির্ধারণ করতে, স্ট্রাকচার-স্তরের consentedDeviceTypes() ফাংশনটি ব্যবহার করুন:

import com.google.home.Structure
import com.google.home.DeviceType
import com.google.home.DeviceTypeFactory
import com.google.home.consentedDeviceTypes // Extension function from the SDK
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.launch

/**
 * Example of how an app may monitor which device types have been granted access by a user.
 */
fun monitorDeviceConsent(structure: Structure, myScope: CoroutineScope) {
    // Obtain the flow of consented device type factories
    val consentedTypesFlow: Flow<Set<DeviceTypeFactory<out DeviceType>>> =
        structure.consentedDeviceTypes()

    myScope.launch {
        consentedTypesFlow.collect { consentedSet ->
            // Check if the user has consented to share a specific restricted
            // type, such as a Doorbell or Camera.
            val hasCameraAccess = consentedSet.any {
                it.toString() == "matter.google.type.GoogleDoorbellDevice"
            }

            if (hasCameraAccess) {
                // Enable features that require camera access
            } else {
                // Inform the user or disable camera-specific features
            }
        }
    }
}

OkGoogle অনুমতি

okGoogle কমান্ডটি একটি ডিভাইস-স্তরের কমান্ড এবং এটি কাঠামোর যেকোনো ডিভাইসকে স্বয়ংক্রিয় করতে ব্যবহার করা যেতে পারে। তবে, একটি Home APIs অ্যাপের সব ডিভাইসে অ্যাক্সেস নাও থাকতে পারে। এই ধরনের ক্ষেত্রে কীভাবে অনুমতিগুলো প্রয়োগ করা হয়, তা নিচের সারণিতে বর্ণনা করা হয়েছে।

স্বয়ংক্রিয়করণ বৈশিষ্ট্য অনুমতি প্রয়োগ
রাত ১০টায় শোবার ঘরের স্পিকারে "বেডটাইম" প্রচার করুন। ডিভাইসে AssistantBroadcastTrait অটোমেশন তৈরি :
  • সম্প্রচার ডিভাইসটি অবশ্যই একটি অ্যাসিস্ট্যান্ট ডিভাইস হতে হবে।
  • যে ডিভাইসে সম্প্রচারটি করা হয়, সেই ডিভাইসে অ্যাপ এবং ব্যবহারকারীর অ্যাক্সেস থাকতে হবে।
স্বয়ংক্রিয়করণ সম্পাদন :
  • যে ডিভাইসে সম্প্রচারটি করা হয়, সেই ডিভাইসে অ্যাপ এবং ব্যবহারকারীর অ্যাক্সেস থাকতে হবে।
রাত ১০টায় সকল ডিভাইসে "বেডটাইম" সম্প্রচার করুন। AssistantBroadcastTrait কাঠামো সম্পর্কিত বৈশিষ্ট্য। অটোমেশন তৈরি :
  • কাঠামোটিতে অবশ্যই অন্তত একটি অ্যাসিস্ট্যান্ট ডিভাইস থাকতে হবে, যেটিতে অ্যাপ এবং ব্যবহারকারী উভয়েরই প্রবেশাধিকার থাকবে।
  • অ্যাপ এবং ব্যবহারকারীর কাঠামোটিতে প্রবেশাধিকার থাকতে হবে।
স্বয়ংক্রিয়করণ সম্পাদন :
  • অ্যাপ এবং ব্যবহারকারীর কাঠামোটিতে প্রবেশাধিকার থাকতে হবে।
রাত ১০টায়, "কিছু গান বাজান"। AssistantFulfillmentTrait.OkGoogleCommand অটোমেশন তৈরি :
  • যে ডিভাইসগুলোতে অটোমেশন কমান্ড পাঠায়, সেই ডিভাইসগুলোতে অ্যাপ এবং ব্যবহারকারীর অ্যাক্সেস থাকতে হবে।
স্বয়ংক্রিয়করণ সম্পাদন :
  • অ্যাপ এবং ব্যবহারকারীর অবশ্যই সেই ডিভাইসগুলিতে অ্যাক্সেস থাকতে হবে যেগুলিতে অটোমেশন কমান্ড জারি করে।
যখনই কেউ বলে "কিছু গান বাজাও" VoiceStarterTrait.OkGoogleEvent অটোমেশন তৈরি :
  • অ্যাপ এবং ব্যবহারকারীর অবশ্যই কাঠামোটিতে অ্যাক্সেস থাকতে হবে। একটি অটোমেশনকে ভ্যালিডেশন পাস করতে বা চালানোর জন্য কোনো অ্যাসিস্ট্যান্ট ডিভাইসের প্রয়োজন হয় না, কারণ কাঠামোটিতে অ্যাক্সেস আছে এমন যেকোনো ব্যবহারকারী তাদের ফোন ব্যবহার করে (একই গুগল অ্যাকাউন্ট দিয়ে) অ্যাসিস্ট্যান্টের সাথে যুক্ত হতে এবং ভয়েসস্টার্টার চালু করতে পারেন।
স্বয়ংক্রিয়করণ সম্পাদন :
  • যে ডিভাইসটি অটোমেশন শুরু করে, অ্যাপটির সেটি অ্যাক্সেস করার জন্য কোনো অনুমতির প্রয়োজন হয় না।
  • যে ডিভাইসে কাজটি সম্পন্ন হবে, সেই ডিভাইসটি অ্যাক্সেস করার জন্য অ্যাপ এবং ব্যবহারকারী উভয়েরই অনুমতি থাকতে হবে।

ব্যবহারকারী সম্পূর্ণ অনুমতি প্রত্যাহার করলে নির্দেশিকা

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

প্রতিবার অ্যাপটি চালু করার সময়, অনুমতিগুলো এখনও কার্যকর আছে কিনা তা পরীক্ষা করে দেখুন। যদি সেগুলো বাতিল করা হয়ে থাকে, তাহলে নিশ্চিত করুন যে অ্যাপ্লিকেশনে ক্যাশ করা ডেটা সহ পূর্বের সমস্ত ডেটা মুছে ফেলা হয়েছে।