Android için Home API'lerinden herhangi birini kullanmadan önce uygulamanızda evi başlatmanız gerekir. Bu adımda, yerel bağlam için singleton örneğiHome oluşturacaksınız.
Aynı anda yalnızca bir Home örneği etkin olmalıdır.
Bu, Home API'lerinin giriş noktasıdır. Ayrıca, Cihaz ve Yapı ile Otomasyon API'lerinde hangi özellikleri ve cihaz türlerini kullanmayı planladığınızı da bildirmeniz gerekir. Google Home ekosistemini kullanmaya yeni başlıyorsanız ve hangi özellikleri veya cihaz türlerini kaydettireceğinizden emin değilseniz bu kılavuzda en yaygın olanlardan bazılarını önerdik.
Home örneği oluşturma
Başlamak için şu paketleri uygulamanıza aktarın:
import android.content.Context
import com.google.home.FactoryRegistry
import com.google.home.HomeConfig
import com.google.home.Home
Home API'lerini başlatmak için:
Applicationbağlamına referans alın. Bu bağlam, herhangi bir etkinlik yaşam döngüsüne bağlı değildir ve uygulamanız çalıştığı sürece geçerli olur. Kodu,ActivityveyaServiceiçindegetApplicationContext()numaralı telefonu arayarak alabilirsiniz:val context = getApplicationContext()Uygulamanızda kullanmayı planladığınız tüm özellikler ve cihaz türleriyle bir
FactoryRegistryörneği oluşturun.Neye ihtiyacınız olduğundan emin değilseniz bu kılavuzda bazı yaygın olanları (ışık, fiş, sensör, anahtar ve termostat cihaz türleri, otomasyonlar için varlık ve Asistan özellikleri) önerdik. Daha fazla bilgi edinmek için Özelliklerin ve cihaz türlerinin kaydı başlıklı makaleyi inceleyin.
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))Burada kayıtlı her bir özellik ve cihaz türü için içe aktarma ifadeleri gereklidir (Android Studio bu ifadeleri eklemenizi ister).
HomeConfigöğesiniDispatchers.IOcoroutine bağlamını ve kayıt örneğinizi kullanarak oluşturun.val homeConfig = HomeConfig( coroutineContext = Dispatchers.IO, factoryRegistry = registry)Son olarak, bağlamı ve
HomeConfigkullanarak API'lerin giriş noktası olanHome'nin singleton örneğini oluşturun.val homeManager: HomeClient = Home.getClient(context, homeConfig)
Geçersiz oturumlarla ilgili hataları önlemek için Home'nin yalnızca tekil bir örneğinin oluşturulması ve bunun bir nesne bildirimi içine sarmalanması önemlidir.
Örneğin, Sample App bunu şu şekilde yapar:
internal object HomeClientModule {
@Provides
@Singleton
fun provideHomeClient(@ApplicationContext context: Context): HomeClient {
return Home.getClient(
context,
HomeConfig(
coroutineContext = IODispatcherModule.provideIoDispatcher(),
factoryRegistry = registry,
),
)
}
}
Uygulama tarafından başlatılan Google ile Oturum Açma
Kullanıcınızın Google kimlik doğrulamalarını uygulamanızda yönetmek isteyebilirsiniz. Bu sayede, Google Home, Drive ve Haritalar gibi çeşitli Google hizmetlerinde aynı kullanıcı hesabını kullanabilirsiniz.
Uygulama tarafından başlatılan Google ile oturum açma özelliği sayesinde, belirli bir kullanıcıya açıkça bağlı bir HomeClient örneği elde edebilirsiniz. Böylece, hesap zaten yetkilendirilmişse Google Hesap seçici ve izin ekranı atlanır.
Ayrıca bu yaklaşım, kullanıcıların iki farklı hesap seçimi ekranı görmesini engeller. Bu ekranlardan biri uygulamanın oturum açma ekranı, diğeri ise Google Home'un ekranıdır.
Bunu yapmak için Kullanıcıların kimliğini Google ile oturum açma özelliğiyle doğrulama başlıklı makaleyi incelemeniz ve aşağıdaki adımları tamamlamanız gerekir:
OAuth web uygulaması istemci kimliği oluşturma
- Google Cloud Console'u açın.
- Google Cloud Console Kimlik Bilgileri sayfasına gidin.
- Mevcut bir projeyi seçin veya yeni bir proje oluşturun.
- OAuth izin ekranını yapılandırın (yapmadıysanız)
- Kimlik bilgisi oluşturmadan önce OAuth onay ekranının, gizlilik politikası ve hizmet şartları URL'leri dahil olmak üzere uygulamanızın ayrıntılarıyla yapılandırıldığından emin olun.
- OAuth istemci kimliği oluşturun (Web Uygulaması türü)
- Kimlik bilgileri sayfasında
+ CREATE CREDENTIALSsimgesini tıklayın ve açılır menüden OAuth istemci kimliği'ni seçin. - Application type (Uygulama türü) için Web application'ı (Web uygulaması) seçin.
- Web istemciniz için bir ad girin (ör. "My App Web Backend").
- Oluştur'u tıklayın.
- Kimlik bilgileri sayfasında
- İstemci kimliğini alma
- Oluşturma işleminden sonra konsolda yeni istemci kimliğiniz gösterilir. Bu, Android uygulamanızda kullanacağınız değerdir (ör. "{project number}-.....apps.googleusercontent.com").
- Müşteri kimliğini doğrudan sabit kodlamak yerine harici olarak (ör.
build.gradleiçinde) saklamanız önerilir.
Google ile oturum açma isteği oluşturma
Google ile oturum açma isteği oluşturmak için web uygulaması kimliğini kullanın:
// Your Google Cloud console Web Client ID for Google Sign-In
val serverClientId = BuildConfig.DEFAULT_WEB_CLIENT_ID
// Build the request for Google ID token
val googleIdOption = GetGoogleIdOption.Builder()
.setFilterByAuthorizedAccounts(false) // Show all Google Accounts on the device
.setServerClientId(serverClientId) // embed WebClientID in token
.build()
// Build the GetCredentialRequest
val request = GetCredentialRequest.Builder().addCredentialOption(googleIdOption).build()
Google ile oturum açma akışını oluşturma
Oturum açma akışını uygulamak için CredentialManager isteğini yürütmek üzere Sign in with Google kullanın. Kullanıcı bir hesap seçtikten sonra, android.accounts.Account oluşturmak için e-posta adresini ortaya çıkan Google kimlik jetonundan çıkarın. Bu hesap daha sonra, oturum açmış kullanıcıya özel olarak bağlı bir HomeClient örneğini başlatmak için kullanılır.
try {
// CredentialManager is responsible for interacting with various credential providers on the device
val credentialManager = CredentialManager.create(context)
// Credential returns when user has selected an account and the getCredential call completes
val result = credentialManager.getCredential(context = context, request = request)
val credential = result.credential
if (
credential is CustomCredential &&
credential.type == GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL
) {
try {
val googleCredential = GoogleIdTokenCredential.createFrom(credential.data)
googleCredential.id.let { userEmail ->
Log.i(TAG, "Email found in Google ID Token: $email")
/*
Why "com.google"?
The string "com.google" is a standard identifier used in Android's android.accounts.
Account system to represent accounts managed by Google. This is often used when
interacting with Android's Account Manager or when using Google-specific APIs. So,
even if the email ends in "@gmail.com", the underlying account type or provider is
still considered "com.google" within the Android system.
*/
val account = Account(userEmail, "com.google")
Log.d(TAG,"Switched account to : $userEmail")
// Get the new Home Client Instance with the userEmail
}
Log.i(TAG, "Account switch complete. Emitting navigation event.")
} catch (e: Exception) {
Log.e(TAG,"Could not convert CustomCredential to Google ID Token", e)
}
}
} catch (e: Exception) {
Log.e(TAG, "Google Sign-In failed with unexpected error", e)
}
Yeni bir HomeClient örneği edinme
Ev örneği oluşturma bölümünde belirtilen adımları uygulayın ancak 4. adımda Home.getClient(context, homeConfig) işlevini çağırmak yerine Home.getClient(context, userAccount,
homeConfig) işlevini çağırın. Burada ikinci parametre Lazy<UserAccount> olur. Bu, belirtilen Google Hesabı'na açıkça bağlı olan HomeClientWithProvidedAccount (HomeClient alt sınıfı) örneğini döndürür:
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()
)
Belirtilen kullanıcı yetkili değilse HomeClientWithProvidedAccount örneğinde aşağıdaki yöntemleri çağırarak kullanıcıdan izin isteyin:
registerActivityResultCallerForPermissions()ile kullanmak istediğiniz ActivityResultCaller'a referans verin.requestPermissions(). Bu işlem, kullanıcının izin verebileceği GHP izin ekranını açar.
UserAccount ile HomeClient oluşturabilir, ardından kullanıcıya izin verme işlemlerini güncellemesi için izin ekranını tekrar başlatmak üzere forceLaunch==true ile requestPermissions() işlevini çağırabilirsiniz:
val client =
Home.getClient(
context = context.applicationContext,
account =
lazy {
UserAccount.GoogleAccount(androidAccount)
},
homeConfig = HomeConfig()
)
client.registerActivityResultCallerForPermissions(this)
client.requestPermissions(forceLaunch= true)
Ev API'leri izinlerini yönetme hakkında daha fazla bilgi için Permissions API başlıklı makaleyi inceleyin.
Yeni HomeClient ile etkinliğin tamamını yenileme
Yeni bir HomeClient örneğiniz olduğunda, yeniden abone olmak ve bu kullanıcı hesabıyla ilişkili tüm yapıları, cihazları ve diğer ilgili verileri getirmek için etkinliğin tamamını yenilemeniz gerekir.
Özelliklerin ve cihaz türlerinin kaydı
FactoryRegistry sınıfı, geliştiricilerin uygulamaları tarafından hangi özelliklerin ve cihaz türlerinin kullanıldığını açıkça belirtmelerine olanak tanıyarak uygulama ikili boyutlarını optimize etmelerine yardımcı olur.
İzinlerin ve fabrika kaydının birbirinden bağımsız olduğunu unutmayın. Bu nedenle, izinler kullanılarak uygulamanızda kullanılabilen ancak fabrika kayıt defterine dahil edilmeyen kayıtlı olmayan özelliklere ve türlere Automation API kullanılarak erişilemez ve bunlar toplu traits() veya types() yöntem çağrıları içinde döndürülmez.