Khởi chạy trang chủ trên Android

Trước khi sử dụng bất kỳ API Home nào cho Android, bạn phải khởi động Home trong ứng dụng của mình. Trong bước này, bạn sẽ tạo một thực thể singleton của Home cho ngữ cảnh cục bộ.

Mỗi lần, bạn chỉ có thể kích hoạt một phiên bản của Home.

Đây là điểm truy cập vào Home API, đồng thời liên quan đến việc khai báo những đặc điểm và loại thiết bị mà bạn dự định sử dụng với Device & Structure API và Automation API. Nếu bạn chỉ mới bắt đầu sử dụng hệ sinh thái Google Home và không biết nên đăng ký những đặc điểm hoặc loại thiết bị nào, thì chúng tôi đã đề xuất một số đặc điểm và loại thiết bị phổ biến nhất tại đây trong hướng dẫn này.

Tạo một phiên bản Home

Để bắt đầu, hãy nhập các gói này vào ứng dụng của bạn:

import android.content.Context
import com.google.home.FactoryRegistry
import com.google.home.HomeConfig
import com.google.home.Home

Cách khởi chạy Home API:

  1. Tạo một tham chiếu đến ngữ cảnh Application. Ngữ cảnh này không phụ thuộc vào bất kỳ vòng đời hoạt động nào và sẽ tồn tại miễn là ứng dụng của bạn còn hoạt động. Bạn có thể lấy đối tượng này bằng cách gọi getApplicationContext() trong Activity hoặc Service:

    val context = getApplicationContext()
    
  2. Tạo một thực thể FactoryRegistry với tất cả các đặc điểm và loại thiết bị mà bạn dự định sử dụng trong ứng dụng của mình.

    Trong hướng dẫn này, chúng tôi đã đề xuất một số loại phổ biến (các loại thiết bị Đèn, Ổ cắm, Cảm biến, Công tắc và Máy điều nhiệt, các đặc điểm về sự hiện diện và Trợ lý cho các hoạt động tự động hoá), phòng trường hợp bạn không chắc chắn về những gì mình cần. Để tìm hiểu thêm, hãy xem phần Đăng ký đặc điểm và loại thiết bị.

    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))
    

    Bạn phải nhập câu lệnh cho từng đặc điểm và loại thiết bị riêng lẻ đã đăng ký tại đây (Android Studio sẽ nhắc bạn thêm những câu lệnh này).

  3. Tạo một HomeConfig bằng cách sử dụng ngữ cảnh coroutine Dispatchers.IO và phiên bản sổ đăng ký của bạn.

    val homeConfig = HomeConfig(
            coroutineContext = Dispatchers.IO,
            factoryRegistry = registry)
    
  4. Cuối cùng, hãy tạo phiên bản singleton của Home (đây là điểm truy cập vào các API) bằng cách sử dụng ngữ cảnh và HomeConfig.

    val homeManager: HomeClient = Home.getClient(context, homeConfig)
    

Để tránh lỗi với các phiên không hợp lệ, điều quan trọng là chỉ tạo một thực thể singleton của Home bằng cách gói thực thể đó trong một khai báo đối tượng.

Ví dụ: Ứng dụng mẫu thực hiện theo cách này:

internal object HomeClientModule {
  @Provides
  @Singleton
  fun provideHomeClient(@ApplicationContext context: Context): HomeClient {
    return Home.getClient(
      context,
      HomeConfig(
        coroutineContext = IODispatcherModule.provideIoDispatcher(),
        factoryRegistry = registry,
      ),
    )
  }
}

Tính năng đăng nhập bằng Google do ứng dụng khởi tạo

Bạn có thể muốn quản lý các hoạt động xác thực của người dùng bằng Google trong ứng dụng của mình. Việc này cho phép bạn sử dụng cùng một tài khoản người dùng trên nhiều dịch vụ của Google, chẳng hạn như Google Home, Drive, Maps, v.v.

Với tính năng đăng nhập bằng Google do ứng dụng khởi tạo, bạn có thể nhận được một phiên bản HomeClient được liên kết rõ ràng với một người dùng cụ thể, nhờ đó bỏ qua trình chọn Tài khoản Google và màn hình đồng ý khi tài khoản đã được uỷ quyền.

Ngoài ra, phương pháp này giúp người dùng không thấy hai màn hình chọn tài khoản riêng biệt – một màn hình từ quy trình đăng nhập của ứng dụng và một màn hình từ Google Home.

Để thực hiện việc này, hãy làm theo các bước tương tự như trong phần Tạo một thực thể Home, nhưng thay vì gọi Home.getClient(context, homeConfig) ở Bước 4, hãy gọi Home.getClient(context, userAccount, homeConfig), trong đó tham số thứ hai là Lazy<UserAccount>. Thao tác này sẽ trả về một phiên bản của HomeClientWithProvidedAccount, một lớp con của HomeClient, được liên kết rõ ràng với Tài khoản Google đã chỉ định:

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()
     )

Nếu người dùng được chỉ định không được uỷ quyền, hãy nhắc người dùng cấp quyền bằng cách gọi các phương thức sau trên thực thể HomeClientWithProvidedAccount:

  1. registerActivityResultCallerForPermissions() có một mục tham chiếu đến ActivityResultCaller mà bạn muốn sử dụng.
  2. requestPermissions(). Thao tác này sẽ mở ra màn hình Đồng ý của GHP, nơi người dùng có thể cấp quyền của họ.

Bạn có thể tạo một HomeClient bằng UserAccount rồi gọi requestPermissions() bằng forceLaunch==true để khởi chạy lại màn hình đồng ý nhằm cho phép người dùng cập nhật các quyền mà họ đã cấp:

val client =
     Home.getClient(
       context = context.applicationContext,
       account =
         lazy {
              UserAccount.GoogleAccount(androidAccount)
         },
       homeConfig = HomeConfig()
     )

client.registerActivityResultCallerForPermissions(this)
client.requestPermissions(forceLaunch= true)

Hãy xem Permissions API để biết thêm thông tin về cách quản lý quyền đối với Home API.

Đăng ký các trait và loại thiết bị

Lớp FactoryRegistry giúp nhà phát triển tối ưu hoá kích thước nhị phân của ứng dụng bằng cách cho phép họ chỉ rõ những đặc điểm và loại thiết bị mà ứng dụng của họ sử dụng.

Xin lưu ý rằng các quyền và sổ đăng ký gốc được tách rời. Do đó, các đặc điểm và loại chưa đăng ký có sẵn cho ứng dụng của bạn bằng cách sử dụng các quyền nhưng không có trong sổ đăng ký của nhà máy sẽ không thể truy cập được bằng Automation API và cũng không được trả về trong các lệnh gọi phương thức traits() hoặc types() hàng loạt.