Antes de usar cualquiera de las APIs de Home para Android, la app debe tener permiso para acceder a los dispositivos de la casa del usuario, a los que se hace referencia en la API como la estructura. Con la API de Permissions, el usuario puede, con su Cuenta de Google, otorgar acceso a las apps de las APIs de Home a los dispositivos de su casa.
El flujo de permisos permite que el usuario cree una estructura y asigne su dirección si aún no se configuró, sin tener que usar la Google Home app (GHA).
Integra la API de Permissions
Antes de continuar, asegúrate de haber seguido los pasos de
Inicializa la casa en Android.
La instancia homeManager de ese paso se usa en todos los ejemplos de Permissions aquí.
Primero, registra un
ActivityResultCaller
con el SDK. Por ejemplo, así es como lo controla la app de ejemplo:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
homeManager.registerActivityResultCallerForPermissions(this)
}
Verifica si tu app tiene permisos
Antes de solicitar permisos, te recomendamos que verifiques si el usuario de la app ya otorgó su consentimiento para acceder a la estructura. Para ello, llama
al
hasPermissions()
método de la instancia de Home para obtener un Flow de
PermissionsState
valores:
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())
}
}
Si la verificación muestra un PermissionsState de NOT_GRANTED o PERMISSIONS_STATE_UNAVAILABLE, significa que el usuario o la aplicación no tienen acceso a la estructura.
Si la verificación muestra un PermissionsState
de GRANTED, pero una llamada posterior a structures() no muestra ninguna estructura, significa que el usuario revocó el acceso
a la app a través de la página de configuración de GHA o que no tiene el acceso requerido.
Solicita permisos
Se debe otorgar permiso a tu app para acceder a las estructuras y los dispositivos dentro de una estructura determinada.
Si el usuario aún no otorgó permisos, usa el
requestPermissions()
método de la instancia de Home para iniciar la IU de Permissions y procesar el resultado:
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}")
}
}
}
}
Para que la IU de Permissions se inicie correctamente, ya debes haber configurado OAuth para tu app.
Otorga permisos
Ahora deberías poder ejecutar tu app y hacer que un usuario otorgue permisos. El tipo de usuarios que pueden otorgar permisos y los tipos de dispositivos para los que están disponibles los permisos diferirán según si registraste tu app en la Google Home Developer Console.
Se requiere el registro de Developer Console para publicar una app con las APIs de Home. No es necesario probar y usar las APIs de Home.
Si una app no está registrada en Developer Console, estará en estado sin verificar. Se recomienda para probar el uso de las APIs de Home:
Una app sin verificar tendrá acceso a dispositivos de cualquier tipo que sea compatible con OAuth para las APIs de Home (la lista de tipos de dispositivos en la Developer Console). Se otorgarán todos los dispositivos de una estructura.
Si una app está registrada en Developer Console y se aprobó el acceso a uno o más tipos de dispositivos, y se completó la verificación de marca para OAuth, estará en estado verificado. Este estado es necesario para lanzar una app a producción:
- Ya no se aplican los límites de usuarios de prueba. Cualquier usuario puede otorgar permiso a la app.
- El usuario solo puede otorgar permiso a los tipos de dispositivos que se aprobaron en el Developer Console.
Ahora que OAuth está configurado, la llamada de la app a requestPermissions() activa los siguientes diálogos:
- Se le solicita al usuario que seleccione la Cuenta de Google que desea usar.
- Se le solicita al usuario que seleccione la estructura a la que desea otorgar acceso a la app.
- En el caso de una app sin verificar, todos los tipos de dispositivos compatibles con las APIs de Home están disponibles para la app.
- En el caso de una app verificada, el usuario solo puede otorgar permiso a los tipos de dispositivos que se aprobaron en Developer Console.
- En el caso de los tipos de dispositivos sensibles a los que la app tiene acceso para administrar, el usuario puede restringir el acceso por dispositivo. Por ejemplo, si un usuario tiene tres cerraduras, puede otorgar acceso a solo una de ellas.
Una vez que se otorga el permiso, la app puede usar las APIs de Home para leer el estado de los dispositivos en la estructura y controlarlos. Si el usuario no otorga permiso a la app para un tipo de dispositivo en particular o un dispositivo sensible, la app no podrá usar las APIs de Home para acceder a él, controlarlo ni automatizarlo.
Cambiar permisos
Para otorgar permiso para acceder a dispositivos en una estructura diferente, se puede iniciar el selector de cuentas para permitir que el usuario elija la Cuenta de Google y la estructura a la que desea cambiar. Durante este proceso, se volverá a mostrar la pantalla de consentimiento al usuario, incluso si ya se otorgó el consentimiento.
Para ello, vuelve a llamar a
requestPermissions()
con forcePermissionFlow configurado como ForcePermissionFlow.FORCE_LAUNCH:
homeManager.requestPermissions(forcePermissionFlow = ForcePermissionFlow.FORCE_LAUNCH)
Cambia los permisos con sugerencias de estructura
Las sugerencias de estructura permiten que una app preseleccione una estructura específica o restrinja la lista de estructuras disponibles cuando solicita un cambio incremental en los permisos de las APIs de Home del usuario. Si pasas parámetros de estructura a la solicitud de autorización, el diálogo de permisos se enfocará automáticamente en la estructura elegida, lo que reducirá la fricción del usuario y evitará errores de configuración.
Las sugerencias de estructura se administran con la
ConsentScreenOptions
clase de datos. La clase ConsentScreenOptions acepta los siguientes parámetros de configuración:
structureId: Es el ID de estructura específico que se preseleccionará en el diálogo de permisos. Para obtenerlo, verifica las propiedades de la estructura que se está actualizando.allowedStructureIds: Es una lista de IDs de estructura. Si se proporciona, el diálogo de permisos filtrará las estructuras disponibles para mostrar solo las de esta lista. En la mayoría de los casos, se puede dejar sin especificar, a menos que quieras asegurarte de que el usuario permanezca dentro de una lista de estructuras ya otorgada.allowStructureChange: Determina si el usuario tiene permiso para cambiar la estructura preseleccionada. En la mayoría de los casos, configúralo comotruesi se especifica al menos uno deallowedStructureIdsystructureIdpara admitir el comportamiento natural del usuario.
Pasa este objeto como parámetro opcional en la llamada requestPermissions(), con forcePermissionFlow configurado como ForcePermissionFlow.FORCE_LAUNCH:
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(forcePermissionFlow = ForcePermissionFlow.FORCE_LAUNCH, consentScreenOptions = consentOptions)
Se mostrará al usuario la pantalla de consentimiento ya filtrada a la estructura que se indica en el objeto ConsentScreenOptions.
Permite que el usuario cambie de estructura con sugerencias de estructura
Si un usuario tiene varias estructuras en una app y quieres preseleccionar una mientras le permites cambiar entre sus estructuras disponibles, habilita los cambios de estructura con la marca allowStructureChange y proporciona una lista de estructuras en allowedStructureIds:
val consentOptions = ConsentScreenOptions(
structureId = target-structure-id,
allowedStructureIds = listOf(target-structure-id, another-structure-id),
allowStructureChange = true
)
Revocar permiso
Los usuarios pueden revocar el acceso otorgado anteriormente:
A través de la página Mi cuenta de Google > Datos y privacidad > Apps y servicios de terceros. Esto revocará el token de OAuth que se emitió cuando se otorgó el consentimiento inicial y revocará el acceso a cualquier instancia de la app que el usuario estaba usando en todas las plataformas (teléfonos) y estructuras.
Se puede dirigir al usuario con un vínculo directo a la subpágina Apps y servicios de terceros con el siguiente esquema de URL:
https://myaccount.google.com/connections/link?project_number=Cloud project_numberA través de la página GHA > Configuración > Apps vinculadas. Si haces clic en en GHA, se te dirigirá a la página Configuración. Desde allí, haz clic en el mosaico Apps vinculadas que te lleva a una página similar a la pantalla de consentimiento. Desde esta página, el usuario puede quitar el acceso a la app. El usuario puede usar esta misma página para cambiar los tipos de dispositivos o los dispositivos sensibles específicos a los que puede acceder la app.
Consulta los tipos de dispositivos para los que un usuario otorgó permisos
En el ecosistema de Google Home, para la mayoría de los tipos de dispositivos, los usuarios pueden otorgar permisos para todos los dispositivos de ese tipo a la vez. En el caso de los tipos de dispositivos sensibles o restringidos, como cerraduras, cámaras o timbres, los usuarios deben otorgarles permiso de forma individual.
Para determinar si un usuario otorgó permiso para acceder a un tipo de dispositivo sensible o restringido, usa la función consentedDeviceTypes() a nivel de la estructura:
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
}
}
}
}
Permisos de Ok Google
El
okGoogle
comando es un comando a nivel del dispositivo y se puede usar para automatizar cualquier dispositivo de la
estructura. Sin embargo, es posible que una app de las APIs de Home no tenga acceso a todos los dispositivos. En la siguiente tabla, se describe cómo se aplican los permisos en esos casos.
| Automatización | Rasgo | Aplicación de permisos |
|---|---|---|
| A las 10:00 p.m., anuncia "Hora de dormir" en la bocina de la habitación. |
AssistantBroadcastTrait
en el dispositivo. |
Creación de automatización:
|
| A las 10:00 p.m., anuncia "Hora de dormir" en todos los dispositivos. |
AssistantBroadcastTrait
en la estructura. |
Creación de automatización:
|
| A las 10:00 p.m., "reproduce música". |
AssistantFulfillmentTrait.OkGoogleCommand
|
Creación de automatización:
|
| Cada vez que alguien dice "reproduce música". |
VoiceStarterTrait.OkGoogleEvent
|
Creación de automatización:
|
Orientación si el usuario revoca los permisos completos
Si el usuario revoca los permisos completos, todas las automatizaciones existentes dejarán de funcionar. Además, si el usuario revoca el acceso a dispositivos específicos, los activadores, las condiciones y las acciones asociadas con esos dispositivos dejarán de funcionar.
Cada vez que se inicie la app, asegúrate de que los permisos sigan vigentes. Si se revocaron, asegúrate de quitar todos los datos anteriores, incluidos los datos almacenados en caché en la aplicación.
Cuando se revoca el acceso a la estructura, se
StructureAccessRevokedEvent
entrega a tu backend de la nube. Consulta
Otorgamientos de estructura para
ver el flujo de trabajo de revocación de extremo a extremo de la nube de socios y la app para dispositivos móviles.


