Bevor Sie die Home-APIs für Android verwenden können, müssen Sie das Zuhause in Ihrer App initialisieren. In diesem Schritt erstellen Sie eine Singleton-Instanz von Home für den lokalen Kontext.
Es sollte immer nur eine Instanz von Home aktiv sein.
Dies ist der Einstiegspunkt für die Home APIs. Außerdem müssen Sie angeben, welche Traits und Gerätetypen Sie mit der Device & Structure API und der Automation API verwenden möchten. Wenn du gerade erst mit dem Google Home-Ökosystem beginnst und nicht sicher bist, welche Merkmale oder Gerätetypen du registrieren sollst, haben wir in diesem Leitfaden einige der häufigsten Vorschläge gemacht.
Home-Instanz erstellen
Importieren Sie zuerst diese Pakete in Ihre App:
import android.content.Context
import com.google.home.FactoryRegistry
import com.google.home.HomeConfig
import com.google.home.Home
So initialisieren Sie die Home APIs:
Rufen Sie einen Verweis auf den Kontext
Applicationab. Dieser Kontext ist nicht vom Aktivitätslebenszyklus abhängig und ist so lange verfügbar, wie Ihre App aktiv ist. Sie können sie abrufen, indem SiegetApplicationContext()in einemActivityoderServiceaufrufen:val context = getApplicationContext()Erstelle eine
FactoryRegistry-Instanz mit allen Attributen und Gerätetypen, die du in deiner App verwenden möchtest.In dieser Anleitung haben wir einige gängige Gerätetypen (Gerätetypen „Light“, „Plug“, „Sensor“, „Switch“ und „Thermostat“, Anwesenheits- und Assistant-Merkmale für Automatisierungen) vorgeschlagen, falls Sie sich nicht sicher sind, was Sie benötigen. Weitere Informationen finden Sie unter Registrierung von Merkmalen und Gerätetypen.
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))Für jedes einzelne Merkmal und jeden hier registrierten Gerätetyp sind Importanweisungen erforderlich (Android Studio sollte Sie auffordern, diese hinzuzufügen).
Instanziieren Sie
HomeConfigmit dem CoroutinenkontextDispatchers.IOund Ihrer Registry-Instanz.val homeConfig = HomeConfig( coroutineContext = Dispatchers.IO, factoryRegistry = registry)Erstellen Sie schließlich die Singleton-Instanz von
Home, dem Einstiegspunkt für die APIs, mit dem Kontext und demHomeConfig.val homeManager: HomeClient = Home.getClient(context, homeConfig)
Um Fehler bei ungültigen Sitzungen zu vermeiden, ist es wichtig, dass nur eine Singleton-Instanz von Home erstellt wird, indem sie in eine Objektdeklaration eingeschlossen wird.
In der Beispiel-App wird dies beispielsweise so umgesetzt:
internal object HomeClientModule {
@Provides
@Singleton
fun provideHomeClient(@ApplicationContext context: Context): HomeClient {
return Home.getClient(
context,
HomeConfig(
coroutineContext = IODispatcherModule.provideIoDispatcher(),
factoryRegistry = registry,
),
)
}
}
Von der App initiierte Google-Anmeldung
Möglicherweise möchten Sie die Google-Authentifizierungen Ihrer Nutzer in Ihrer App verwalten. So können Sie dasselbe Nutzerkonto für verschiedene Google-Dienste wie Google Home, Drive und Maps verwenden.
Mit der von der App initiierten Google-Anmeldung können Sie eine HomeClient-Instanz abrufen, die explizit mit einem bestimmten Nutzer verknüpft ist. So werden die Google-Kontoauswahl und der Einwilligungsbildschirm umgangen, wenn das Konto bereits autorisiert ist.
Außerdem wird so verhindert, dass Nutzer zwei verschiedene Bildschirme zur Kontoauswahl sehen – einen von der Anmeldung der App und einen von Google Home.
Führen Sie dazu dieselben Schritte wie unter Home-Instanz erstellen beschrieben aus. Rufen Sie jedoch in Schritt 4 anstelle von Home.getClient(context, homeConfig) den Befehl Home.getClient(context, userAccount,
homeConfig) auf. Der zweite Parameter ist dabei ein Lazy<UserAccount>. Dadurch wird eine Instanz von HomeClientWithProvidedAccount zurückgegeben, einer Unterklasse von HomeClient, die explizit mit dem angegebenen Google-Konto verknüpft ist:
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()
)
Wenn der angegebene Nutzer nicht autorisiert ist, fordern Sie ihn auf, seine Einwilligung zu erteilen, indem Sie die folgenden Methoden für die HomeClientWithProvidedAccount-Instanz aufrufen:
registerActivityResultCallerForPermissions()mit einem Verweis auf den ActivityResultCaller, den Sie verwenden möchten.requestPermissions(). Dadurch wird der GHP-Zustimmungsbildschirm aufgerufen, auf dem der Nutzer seine Einwilligung erteilen kann.
Sie können ein HomeClient mit einem UserAccount erstellen und dann requestPermissions() mit forceLaunch==true aufrufen, um den Einwilligungsbildschirm noch einmal zu starten, damit der Nutzer seine Berechtigungen aktualisieren kann:
val client =
Home.getClient(
context = context.applicationContext,
account =
lazy {
UserAccount.GoogleAccount(androidAccount)
},
homeConfig = HomeConfig()
)
client.registerActivityResultCallerForPermissions(this)
client.requestPermissions(forceLaunch= true)
Weitere Informationen zum Verwalten von Berechtigungen für Home-APIs finden Sie unter Permissions API.
Registrierung von Traits und Gerätetypen
Mit der Klasse FactoryRegistry können Entwickler die Größe des App-Binärprogramms optimieren, indem sie explizit angeben, welche Merkmale und Gerätetypen von ihrer App verwendet werden.
Berechtigungen und die Werksregistrierung sind voneinander entkoppelt. Daher sind nicht registrierte Merkmale und Typen, die für Ihre App über Berechtigungen verfügbar sind, aber nicht in der Werksregistrierung enthalten sind, über die Automation API nicht zugänglich und werden auch nicht in den Bulk-Methodenaufrufen traits() oder types() zurückgegeben.