Android 用の Home API を使用する前に、アプリはユーザーの家のデバイス(API では「構造」と呼びます)にアクセスする権限を取得する必要があります。Permissions API を使用すると、ユーザーは Google アカウントを使用して、Home APIs アプリに自宅のデバイスへのアクセス権を付与できます。
Permissions API を統合する
続行する前に、Android でホームを初期化するの手順を完了していることを確認してください。このステップの homeManager
インスタンスは、ここにあるすべての権限の例で使用されています。
まず、SDK で ActivityResultCaller
を登録します。たとえば、サンプルアプリでは次のように処理します。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
homeManager.registerActivityResultCallerForPermissions(this)
}
権限を確認する
権限をリクエストする前に、アプリのユーザーがすでに同意しているかどうかを確認することをおすすめします。そのためには、Home インスタンスの hasPermissions()
メソッドを呼び出して、PermissionsState
値の Flow
を取得します。
val permissionsReadyState =
homeManager.hasPermissions().collect { state ->
state == PermissionsState.GRANTED ||
state == PermissionsState.PERMISSIONS_STATE_UNAVAILABLE ||
state == PermissionsState.NOT_GRANTED
when (permissionsReadyState) {
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")
else ->
throw IllegalStateException(
"HomeClient.hasPermissions state should be PermissionsState.GRANTED or " +
"PermissionsState.PERMISSIONS_STATE_UNAVAILABLE")
}
}
チェックで PermissionsState
が NOT_GRANTED
または PERMISSIONS_STATE_UNAVAILABLE
を返した場合は、権限をリクエストします。チェックで GRANTED
の PermissionsState
が返されたにもかかわらず、後続の structures()
呼び出しで構造が返されなかった場合、ユーザーは Google Home app (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}")
}
}
}
}
権限 UI を適切に起動するには、アプリの OAuth を設定しておく必要があります。
権限を付与する
これで、アプリを実行して、ユーザーに権限を付与してもらうことができるはずです。権限を付与できるユーザーのタイプと、権限を付与できるデバイスのタイプは、アプリを Google Home Developer Console に登録しているかどうかによって異なります。
Home API を使用してアプリを公開するには、Developer Console 登録が必要です。Home API のテストと使用に必要ありません。
アプリが Developer Console に登録されていない場合、アプリは未確認の状態になります。Home API の使用をテストする際は、次の方法をおすすめします。
アプリの権限を付与できるのは、OAuth コンソールでテストユーザーとして登録されているユーザーのみです。未確認のアプリの場合、テストユーザーの上限は 100 人です。
未確認アプリは、Home APIs の OAuth でサポートされているデバイスタイプ(Developer Console のデバイスタイプのリスト)のデバイスにアクセスできます。ストラクチャ内のすべてのデバイスにアクセス権が付与されます。
アプリが Developer Console に登録され、1 つ以上のデバイスタイプへのアクセスが承認され、OAuth のブランド認証が完了している場合、ステータスは [verified](認証済み)になります。アプリをリリースするには、この状態が必要です。
- テストユーザーの上限は適用されなくなります。どのユーザーでもアプリに権限を付与できます。
- ユーザーは、Developer Console で承認されたデバイスタイプにのみ権限を付与できます。
OAuth が設定されたので、アプリから requestPermissions()
への呼び出しにより、次のダイアログがトリガーされます。
- 使用する Google アカウントを選択するよう求めるメッセージが表示されます。
- アプリにアクセスを許可するストラクチャを選択するよう求めるメッセージが表示されます。
- 未確認アプリの場合、Home API でサポートされているすべてのデバイスタイプをアプリで使用できます。
- 確認済みのアプリの場合、ユーザーは Developer Console で承認されたデバイスタイプにのみ権限を付与できます。
- アプリが管理できる機密性の高いデバイスタイプについては、ユーザーはデバイスごとにアクセスを制限できます。たとえば、ユーザーが 3 つのロックを持っている場合、アクセス権を付与できるのはそのうちの 1 つのロックのみです。
権限が付与されると、アプリは Home API を使用して、ストラクチャ内のデバイスの状態を読み取り、制御できるようになります。特定のデバイスタイプまたは機密性の高いデバイスについて、ユーザーがアプリに権限を付与しない場合、アプリは Home API を使用してそのデバイスにアクセスしたり、制御したり、自動化したりすることができなくなります。
権限を変更
別のストラクチャー内のデバイスにアクセスする権限を付与するには、アカウント選択ツールを起動して、切り替える Google アカウントとストラクチャーをユーザーが選択できるようにします。このプロセスでは、以前に同意していた場合でも、ユーザーに同意画面が再度表示されます。
これを行うには、forceLaunch
フラグを true
に設定して requestPermissions()
を再度呼び出します。
homeManager.requestPermissions(forceLaunch=true)
権限を取り消す
ユーザーは、以前に付与したアクセス権を取り消すことができます。
Google のマイアカウント ページ > [データとプライバシー] > [サードパーティ製のアプリとサービス] から確認できます。これにより、最初の同意時に発行された OAuth トークンが取り消され、ユーザーがすべてのサーフェス(スマートフォン)と構造で使用していたアプリのインスタンスへのアクセスが取り消されます。
ユーザーは、次の URL スキームを使用して、サードパーティ製のアプリとサービスのサブページにディープリンクで誘導されることがあります。
https://myaccount.google.com/connections/link?project_number=Cloud project_number
GHA > [設定] > [リンクされたアプリ] ページから。GHA の をクリックすると、[設定] ページに移動します。[リンク済みアプリ] タイルをクリックすると、同意画面に似たページが表示されます。このページから、ユーザーはアプリへのアクセス権を削除できます。また、この同じページで、アプリがアクセスできるデバイスタイプや特定の機密性の高いデバイスを変更することもできます。
OkGoogle の権限
okGoogle
コマンドはデバイスレベルのコマンドであり、構造内の任意のデバイスを自動化するために使用できます。ただし、Home APIs アプリはすべてのデバイスにアクセスできるとは限りません。次の表に、このような場合に権限がどのように適用されるかを示します。
自動化 | トレイト | 権限の適用 |
---|---|---|
午後 10 時に、寝室のスピーカーで「おやすみ」とブロードキャストする。 |
デバイスの
AssistantBroadcastTrait
。 |
自動化の作成:
|
午後 10 時に、すべてのデバイスで「就寝時間です」とブロードキャストする |
ストラクチャに対する
AssistantBroadcastTrait
。 |
自動化の作成:
|
午後 10 時、「何か音楽を再生して」 |
AssistantFulfillmentTrait.OkGoogleCommand
|
自動化の作成:
|
「音楽をかけて」と言われた場合 |
VoiceStarterTrait.OkGoogleEvent
|
自動化の作成:
|