Android 用の Home API を使用する前に、アプリはユーザーの家にあるデバイス(API ではストラクチャ と呼ばれます)にアクセスする権限を持っている必要があります。 Permissions API を使用すると、ユーザーは Google アカウントを使用して、Home API アプリに家にあるデバイスへのアクセス権を付与できます。
権限フローを使用すると、Google Home app (GHA)を使用しなくても、ストラクチャがまだ設定されていない場合にユーザーがストラクチャを作成できます。
Permissions API を統合する
先に進む前に、
Android でホームを初期化するの手順を完了していることを確認してください。
この手順の homeManager インスタンスは、ここに示すすべての権限の例で使用されます。
まず、SDK に
ActivityResultCaller
を登録します。たとえば、サンプルアプリでは次のように処理されます。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
homeManager.registerActivityResultCallerForPermissions(this)
}
権限を確認する
権限をリクエストする前に、アプリのユーザーがストラクチャへのアクセスにすでに同意しているかどうかを確認することをおすすめします。これを行うには、Home インスタンスの
hasPermissions()
メソッドを呼び出して、Flow の
PermissionsState
値を取得します。
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())
}
}
チェックで PermissionsState が NOT_GRANTED または PERMISSIONS_STATE_UNAVAILABLE と返された場合、ユーザーまたはアプリケーションにストラクチャへのアクセス権がないことを意味します。
チェックで PermissionsState
が GRANTED と返された後、structures() を呼び出してもストラクチャが返されない場合は、ユーザーが GHA の設定ページからアプリへのアクセス権を取り消したか、必要なアクセス権がないことを意味します。
権限をリクエストする
特定のストラクチャ内のストラクチャとデバイスにアクセスするには、アプリに権限を付与する必要があります。
ユーザーがまだ権限を付与していない場合は、Home インスタンスの
requestPermissions()
メソッドを使用して権限 UI を起動し、結果を処理します。
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}")
}
}
}
}
PermissionsManager権限 UI を適切に起動するには、アプリの OAuth をすでに 設定しておく必要があります。
権限を付与する
これで、アプリを実行してユーザーに権限を付与できるようになりました。権限を付与できるユーザーの タイプと、権限を付与できるデバイスのタイプは、 アプリを 登録しているかどうかによって異なります。Google Home Developer Console
Developer Console Home API を使用してアプリを公開するには、 登録が必要です。Home API のテストと使用には必要ありません。
アプリがDeveloper Consoleに登録されていない場合 、アプリは未確認の状態になります。これは、Home API の使用をテストする場合におすすめします。
アプリの権限を付与できるのは、OAuth コンソールでテストユーザーとして登録されているユーザーのみです。未確認のアプリのテストユーザーは 100 人までです。
未確認のアプリは、Home API の OAuth で サポートされている任意のデバイスタイプのデバイスにアクセスできます( Developer Consoleデベロッパー コンソールのデバイスタイプの一覧)。ストラクチャ内のすべてのデバイスに権限が付与されます。
アプリが デベロッパー コンソールに登録されている場合Developer Console 、1 つ以上のデバイスタイプへのアクセスが承認され、OAuth の ブランド 確認が完了している場合、 アプリは確認済みの状態になります。アプリを本番環境にリリースするには、この状態にする必要があります。
- テストユーザーの上限は適用されなくなります。任意のユーザーがアプリに権限を付与できます。
- ユーザーは、 で承認されたデバイスタイプにのみ権限を付与できます。Developer Console
OAuth が設定されると、アプリが requestPermissions() を呼び出すと、次のダイアログが表示されます。
- 使用する Google アカウントを選択するよう求められます。
- アプリにアクセス権を付与するストラクチャを選択するよう求められます。
- 未確認のアプリの場合、Home API でサポートされているすべてのデバイスタイプをアプリで使用できます。
- 確認済みのアプリの場合、ユーザーはデベロッパー コンソールで承認されたデバイスタイプにのみ権限を付与できます。確認済みのアプリの場合、ユーザーはDeveloper Consoleで承認されたデバイスタイプにのみ権限を付与できます。
- アプリが管理できる機密性の高いデバイスタイプの場合、ユーザーはデバイスごとにアクセスを制限できます。たとえば、ユーザーが 3 つのロックを持っている場合、そのうち 1 つのロックにのみアクセス権を付与できます。
権限が付与されると、アプリは Home API を使用して、ストラクチャ内のデバイスの状態を読み取り、制御できます。特定のデバイスタイプまたは機密性の高いデバイスに対してアプリに権限を付与しない場合、アプリは Home API を使用してそのデバイスにアクセス、制御、自動化することはできません。
権限を変更する
別のストラクチャ内のデバイスにアクセスする権限を付与するには、アカウント選択ツールを起動して、切り替える Google アカウントとストラクチャを選択できるようにします。このプロセスでは、以前に同意した場合でも、同意画面が再度表示されます。
これを行うには、forceLaunch フラグを true に設定して requestPermissions() を再度呼び出します。
homeManager.requestPermissions(forceLaunch=true)
ストラクチャのヒントを使用して権限を変更する
ストラクチャのヒントを使用すると、ユーザーの Home API 権限に対する増分変更をリクエストする際に、特定のストラクチャを事前選択したり、使用可能なストラクチャのリストを制限したりできます。ストラクチャ パラメータを認可リクエストに渡すと、権限ダイアログが選択したストラクチャに自動的にフォーカスされるため、ユーザーの操作が簡素化され、構成エラーを防ぐことができます。
ストラクチャのヒントは、
ConsentScreenOptions
データクラスを使用して管理されます。ConsentScreenOptions クラスは、次の構成パラメータを受け入れます。
structureId- 権限ダイアログで事前選択する特定のストラクチャ ID。これは、更新するストラクチャのストラクチャ プロパティを確認することで取得できます。allowedStructureIds- ストラクチャ ID のリスト。指定すると、権限ダイアログで、使用可能なストラクチャがフィルタされ、このリストにあるストラクチャのみが表示されます。 ユーザーがすでに付与されているストラクチャのリスト内に留まるようにする場合を除き、ほとんどの場合は指定しないままにできます。allowStructureChange- ユーザーが事前選択したストラクチャを変更できるかどうかを指定します。ほとんどの場合、allowedStructureIdsとstructureIdの少なくとも 1 つを指定してtrueに設定すると、ユーザーの自然な動作をサポートできます。
forceLaunch フラグを true に設定して、このオブジェクトを requestPermissions() 呼び出しの省略可能なパラメータとして渡します。
import com.google.home.ConsentScreenOptions
// Create the ConsentScreenOptions class, allowing structure changes while
// ensuring the permissions dialog pre-selects the target structure on launch
val consentOptions = ConsentScreenOptions(
structureId = target-structure-id,
allowStructureChange = true
)
homeManager.requestPermissions(forceLaunch=true, consentOptions)
ユーザーには、ConsentScreenOptions オブジェクトに記載されているストラクチャにすでにフィルタされている同意画面が表示されます。
ストラクチャのヒントを使用してユーザーがストラクチャを切り替えられるようにする
アプリに複数のストラクチャがあり、使用可能なストラクチャを切り替えられるようにしながら 1 つのストラクチャを事前選択する場合は、allowStructureChange フラグを使用してストラクチャの変更を有効にし、allowedStructureIds にストラクチャのリストを指定します。
val consentOptions = ConsentScreenOptions(
structureId = target-structure-id,
allowedStructureIds = listOf(target-structure-id, another-structure-id),
allowStructureChange = true
)
権限を取り消す
ユーザーは、以前に付与したアクセス権を取り消すことができます。
Google マイアカウント ページ > [データとプライバシー] > [サードパーティ製のアプリとサービス]。これにより、最初の同意時に発行された OAuth トークンが取り消され、すべてのサーフェス(スマートフォン)とストラクチャでユーザーが使用していたアプリのインスタンスへのアクセス権が取り消されます。
ユーザーは、次の URL スキームを使用して、[サードパーティ製のアプリとサービス] サブページにディープリンクでリダイレクトされることがあります。
https://myaccount.google.com/connections/link?project_number=Cloud project_numberGHA[> 設定 > リンク済みのアプリ] ページ。 の GHA をクリックすると、 [**設定**] ページに移動します。そこから、[リンク済みのアプリ] タイルをクリックすると、同意画面に似たページが表示されます。このページから、ユーザーはアプリへのアクセス権を削除できます。ユーザーは、この同じページを使用して、アプリがアクセスできるデバイスタイプまたは特定の機密性の高いデバイスを変更できます。
ユーザーが付与した権限のデバイスタイプを表示する
Google Home エコシステムでは、ほとんどのデバイスタイプで、ユーザーはそのタイプのすべてのデバイスに一度に権限を付与できます。ロック、カメラ、ドアベルなどの機密性の高いデバイスタイプや制限付きのデバイスタイプの場合、ユーザーは個別に権限を付与する必要があります。
ユーザーが機密性の高いデバイスタイプまたは制限付きのデバイスタイプへのアクセス権を付与しているかどうかを確認するには、ストラクチャ レベルの 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 API アプリはすべてのデバイスにアクセスできるとは限りません。次の表に、このような場合に権限がどのように適用されるかを示します。
| 自動化 | トレイト | 権限の適用 |
|---|---|---|
| 午後 10 時に、寝室のスピーカーで「おやすみ時間」とブロードキャストする。 |
AssistantBroadcastTrait
デバイス上。 |
自動化の作成:
|
| 午後 10 時に、すべてのデバイスで「おやすみ時間です」とブロードキャストする。 |
AssistantBroadcastTrait
ストラクチャ。 |
自動化の作成:
|
| 午後 10 時に「音楽を再生して」 |
AssistantFulfillmentTrait.OkGoogleCommand
|
自動化の作成:
|
| 誰かが「音楽を再生して」と言うたびに |
VoiceStarterTrait.OkGoogleEvent
|
自動化の作成:
|
ユーザーがすべての権限を取り消した場合のガイダンス
ユーザーがすべての権限を取り消すと、既存の自動化はすべて機能しなくなります。また、ユーザーが特定のデバイスへのアクセス権を取り消すと、そのデバイスに関連付けられているスターター、条件、アクションは機能しなくなります。
アプリが起動するたびに、権限が有効な状態であることを確認してください。権限が取り消された場合は、アプリケーションにキャッシュされているデータを含め、以前のデータがすべて削除されていることを確認してください。


