Tích hợp các tiện ích trên Android với Trợ lý Google

1. Tổng quan

lớp học lập trình đầu tiên về Hành động trong ứng dụng, bạn đã tìm hiểu cách mở rộng Trợ lý Google cho một ứng dụng thể dục mẫu bằng cách triển khai ý định tích hợp (BII) trong danh mục BII về Sức khoẻ và Thể hình.

Hành động trong ứng dụng cho phép người dùng chạy trực tiếp các tính năng cụ thể của ứng dụng qua Trợ lý bằng cách hỏi những câu như: "Ok Google, hãy bắt đầu chạy trên ExampleApp". Ngoài việc khởi chạy ứng dụng, Trợ lý có thể hiển thị một tiện ích Android có tính tương tác cho người dùng để thực hiện các yêu cầu đối với các BII đủ điều kiện.

Một màn hình cho thấy Trợ lý trả về một tiện ích để phản hồi một\ntruy vấn của người dùng, điều này đã kích hoạt chức năng GET_EXERCISE_OBSERVATION của ứng dụng.

Sản phẩm bạn sẽ tạo ra

Trong lớp học lập trình này, bạn sẽ tìm hiểu cách trả về các tiện ích Android để đáp ứng yêu cầu của người dùng Trợ lý. Bạn cũng sẽ tìm hiểu cách:

  • Tham số BII của người dùng để cá nhân hoá tiện ích.
  • Cung cấp phần giới thiệu chuyển văn bản sang lời nói (TTS) trong Trợ lý cho các tiện ích của bạn.
  • Sử dụng Tham chiếu ý định tích hợp để xác định BII nào hỗ trợ phương thức thực hiện tiện ích.

Điều kiện tiên quyết

Trước khi tiếp tục, hãy đảm bảo môi trường phát triển của bạn đã sẵn sàng để phát triển Hành động trong ứng dụng. Mã này phải:

  • Một thiết bị đầu cuối để chạy các lệnh shell, đã cài đặt git.
  • Bản phát hành ổn định mới nhất của Android Studio.
  • Một thiết bị Android thực hoặc ảo có khả năng truy cập Internet.
  • Tài khoản Google dùng để đăng nhập vào Android Studio, ứng dụng Google và ứng dụng Trợ lý Google.

Nếu bạn đang sử dụng một thiết bị thực, hãy kết nối thiết bị đó với máy phát triển cục bộ.

2. Tìm hiểu cách hoạt động

Trợ lý Google sử dụng khả năng hiểu ngôn ngữ tự nhiên (NLU) để đọc yêu cầu của người dùng rồi khớp yêu cầu đó với ý định tích hợp của Trợ lý (BII). Sau đó, Trợ lý sẽ ánh xạ ý định đến khả năng (sẽ triển khai BII) mà bạn đăng ký cho ý định đó trong ứng dụng. Cuối cùng, Trợ lý đáp ứng yêu cầu của người dùng bằng cách hiển thị tiện ích Android mà ứng dụng của bạn tạo dựa trên các thông tin chi tiết có trong chức năng.

Trong lớp học lập trình này, bạn sẽ xác định một chức năng có thể đăng ký hỗ trợ cho BII GET_EXERCISE_OBSERVATION. Trong khả năng này, bạn hướng dẫn Trợ lý tạo một ý định Android cho lớp tiện ích FitActions để thực hiện các yêu cầu cho BII này. Bạn cập nhật lớp học này để tạo một tiện ích được cá nhân hoá cho Trợ lý để hiển thị với người dùng, cũng như phần giới thiệu TTS để Trợ lý thông báo.

Sơ đồ dưới đây minh hoạ quy trình này:

Sơ đồ quy trình minh hoạ phương thức thực hiện tiện ích Trợ lý.

Tiện ích FitActions

Ứng dụng mẫu FitActions chứa một tiện ích thông tin về bài tập thể dục mà người dùng có thể thêm vào màn hình chính. Tiện ích này là một ứng viên tuyệt vời để thực hiện các truy vấn của người dùng kích hoạt BII GET_EXERCISE_OBSERVATION.

Cách tiện ích này hoạt động

Khi người dùng thêm một tiện ích vào màn hình chính, tiện ích đó sẽ ping thiết bị broadcast receiver. Dịch vụ này truy xuất thông tin về tiện ích này từ định nghĩa trình thu nhận của tiện ích trong tài nguyên AndroidManifest.xml của ứng dụng. Hàm này sử dụng thông tin này để tạo một đối tượng RemoteViews đại diện cho tiện ích.

Ứng dụng mẫu xác định trình thu nhận widgets.StatsWidgetProvider, tương ứng với lớp StatsWidgetProvider:

<!-- app/src/main/AndroidManifest.xml -->

<receiver
  android:name=".widgets.StatsWidgetProvider"
  android:exported="false">
  <intent-filter>
    <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
  </intent-filter>
  <meta-data
    android:name="android.appwidget.provider"
    android:resource="@xml/stats_widget" />
</receiver>

Lớp StatsWidgetProvider, StatsWidgetProvider.kt, quản lý quy trình tạo đối tượng StatsWidget. Google Play xử lý những trách nhiệm sau:

  • Tạo các thực thể tiện ích và điền sẵn dữ liệu tập thể dục từ cơ sở dữ liệu ứng dụng vào các thực thể đó.
  • Định dạng dữ liệu bài tập thể dục để dễ đọc hơn, bằng formatDataAndSetWidget().
  • Cung cấp giá trị mặc định nếu không có dữ liệu tập luyện, bằng cách sử dụng setNoActivityDataWidget().

Thêm khả năng hỗ trợ Trợ lý

Trong lớp học lập trình này, bạn sẽ cập nhật ứng dụng mẫu để xử lý chức năng của Hành động trong ứng dụng. Những thay đổi này bao gồm:

  1. Định cấu hình khả năng BII GET_EXERCISE_OBSERVATION để trả về một thực thể của đối tượng StatsWidget.
  2. Cập nhật lớp StatsWidget để sử dụng các tính năng của Hành động trong ứng dụng như:
    • Sử dụng các tham số BII, cho phép người dùng xem số liệu thống kê cụ thể về các bài tập thể dục bằng cách hỏi những câu như "Ok Google, cho tôi xem số liệu thống kê về lần chạy của tôi trên ExampleApp".
    • Cung cấp chuỗi giới thiệu TTS.
    • Quản lý các trường hợp đặc biệt, chẳng hạn như khi truy vấn của người dùng không bao gồm thông số loại bài tập thể dục.

3. Chuẩn bị môi trường phát triển

Tải tệp cơ sở xuống

Chạy lệnh này để sao chép kho lưu trữ GitHub của ứng dụng mẫu:

git clone --branch start-widget-codelab https://github.com/actions-on-google/appactions-fitness-kotlin.git

Sau khi bạn sao chép kho lưu trữ, hãy làm theo các bước sau để mở kho lưu trữ đó trong Android Studio:

  1. Trong hộp thoại Chào mừng bạn đến với Android Studio, hãy nhấp vào Nhập dự án.
  2. Tìm và chọn thư mục mà bạn đã sao chép kho lưu trữ.

Để xem phiên bản ứng dụng đại diện cho lớp học lập trình đã hoàn thành, hãy sao chép kho lưu trữ ứng dụng mẫu bằng cách sử dụng cờ --branch master.

Cập nhật mã ứng dụng Android

Việc cập nhật mã ứng dụng của ứng dụng sẽ giúp nhận dạng duy nhất ứng dụng trên thiết bị thử nghiệm và tránh việc "Tên gói trùng lặp" nếu ứng dụng được tải lên Play Console. Để cập nhật mã ứng dụng, hãy mở app/build.gradle:

android {
...
  defaultConfig {
    applicationId "com.MYUNIQUENAME.android.fitactions"
    ...
  }
}

Thay thế "MYUNIQUENAME" trong trường applicationId thành một giá trị độc đáo của riêng bạn.

Cài đặt trình bổ trợ kiểm thử

Trình bổ trợ Trợ lý Google cho phép bạn kiểm thử Hành động trong ứng dụng của mình trên một thiết bị kiểm thử. Tính năng này hoạt động bằng cách gửi thông tin đến Trợ lý thông qua ứng dụng Google trên thiết bị Android của bạn. Nếu bạn chưa có trình bổ trợ này, hãy cài đặt theo các bước sau:

  1. Chuyển đến mục Tệp > Cài đặt (Android Studio > Lựa chọn ưu tiên trên MacOS).
  2. Trong mục Plugins (Trình bổ trợ), hãy chọn Marketplace rồi tìm "Google Assistant". Bạn cũng có thể tải xuống và cài đặt công cụ kiểm thử theo cách thủ công.
  3. Cài đặt công cụ rồi khởi động lại Android Studio.

Kiểm thử ứng dụng trên thiết bị

Trước khi thực hiện thêm thay đổi nào đối với ứng dụng, bạn nên nắm được những việc mà ứng dụng mẫu có thể làm.

Chạy ứng dụng trên thiết bị kiểm thử:

  1. Trong Android Studio, hãy chọn thiết bị thực hoặc thiết bị ảo rồi chọn Run (Chạy) > Chạy ứng dụng hoặc nhấp vào biểu tượng ChạyChạy biểu tượng ứng dụng trong Android Studio. trên thanh công cụ.
  2. Nhấn và giữ nút Màn hình chính để thiết lập Trợ lý và xác nhận rằng Trợ lý đang hoạt động. Bạn sẽ cần đăng nhập vào Trợ lý trên thiết bị nếu chưa đăng nhập.

Để biết thêm thông tin về thiết bị Android ảo, hãy xem nội dung Tạo và quản lý thiết bị ảo.

Khám phá nhanh ứng dụng để biết những tính năng của ứng dụng. Ứng dụng điền sẵn 10 hoạt động tập thể dục và hiện thông tin này trong chế độ xem đầu tiên.

Dùng thử tiện ích hiện có

  1. Nhấn vào nút Home (Màn hình chính) để chuyển đến màn hình chính của thiết bị thử nghiệm.
  2. Nhấn và giữ vào một khoảng trống trên màn hình chính rồi chọn Tiện ích.
  3. Di chuyển xuống danh sách tiện ích đến FitActions.
  4. Nhấn và giữ biểu tượng FitActions rồi đặt tiện ích của ứng dụng này lên màn hình chính.

Ảnh chụp màn hình hiển thị tiện ích FitActions trên màn hình chính của thiết bị.

4. Thêm Hành động trong ứng dụng

Ở bước này, bạn thêm chức năng BII GET_EXERCISE_OBSERVATION. Bạn thực hiện việc này bằng cách thêm một phần tử capability mới trong shortcuts.xml. Khả năng này chỉ định cách kích hoạt chức năng, cách sử dụng các tham số BII và ý định Android nào cần gọi để thực hiện yêu cầu.

  1. Thêm một phần tử capability mới vào tài nguyên shortcuts.xml của dự án mẫu bằng cấu hình này:
    <!-- fitnessactions/app/src/main/res/xml/shortcuts.xml -->
    
    <capability android:name="actions.intent.GET_EXERCISE_OBSERVATION">
      <app-widget
        android:identifier="GET_EXERCISE_OBSERVATION"
        android:targetClass="com.devrel.android.fitactions.widgets.StatsWidgetProvider"
        android:targetPackage="PUT_YOUR_APPLICATION_ID_HERE">
        <parameter
          android:name="exerciseObservation.aboutExercise.name"
          android:key="aboutExerciseName"
          android:required="true">
        </parameter>
        <extra android:name="hasTts" android:value="true"/>
      </app-widget>
      <!-- Add Fallback Intent-->
    </capability>
    
    Thay thế giá trị android:targetPackage (PUT_YOUR_APPLICATION_ID_HERE) bằng applicationId của riêng bạn.

Chức năng này ánh xạ BII GET_EXERCISE_OBSERVATION với ý định app-widget để khi BII được kích hoạt, tiện ích này sẽ tạo thực thể và hiển thị cho người dùng.

Trước khi kích hoạt tiện ích, Trợ lý sẽ trích xuất các tham số BII được hỗ trợ từ truy vấn của người dùng. Lớp học lập trình này yêu cầu tham số BII exerciseObservation.aboutExercise.name, đại diện cho loại bài tập thể dục mà người dùng yêu cầu. Ứng dụng hỗ trợ 3 loại bài tập thể dục: "chạy", "đi bộ" và "đạp xe". Bạn cung cấp một khoảng không quảng cáo nội tuyến để thông báo cho Trợ lý về các giá trị được hỗ trợ này.

  1. Xác định các phần tử khoảng không quảng cáo này bằng cách thêm cấu hình này, phía trên chức năng GET_EXERCISE_OBSERVATION, vào shortcuts.xml:
    <!-- shortcuts.xml -->
    
    <!-- shortcuts are bound to the GET_EXERCISE_OBSERVATION capability and
         represent the types of exercises supported by the app. -->
    
    <shortcut
      android:shortcutId="running"
      android:shortcutShortLabel="@string/activity_running">
      <capability-binding android:key="actions.intent.GET_EXERCISE_OBSERVATION">
        <parameter-binding
          android:key="exerciseObservation.aboutExercise.name"
          android:value="@array/runningSynonyms"/>
      </capability-binding>
    </shortcut>
    
    <shortcut
      android:shortcutId="walking"
      android:shortcutShortLabel="@string/activity_walking">
      <capability-binding android:key="actions.intent.GET_EXERCISE_OBSERVATION">
        <parameter-binding
          android:key="exerciseObservation.aboutExercise.name"
          android:value="@array/walkingSynonyms"/>
      </capability-binding>
    </shortcut>
    
    <shortcut
      android:shortcutId="cycling"
      android:shortcutShortLabel="@string/activity_cycling">
      <capability-binding android:key="actions.intent.GET_EXERCISE_OBSERVATION">
        <parameter-binding
          android:key="exerciseObservation.aboutExercise.name"
          android:value="@array/cyclingSynonyms"/>
      </capability-binding>
    </shortcut>
    
    <capability android:name="actions.intent.GET_EXERCISE_OBSERVATION">
      <!-- ... -->
    </capability>
    

Thêm ý định dự phòng

Ý định dự phòng xử lý các tình huống không thể thực hiện truy vấn của người dùng vì truy vấn thiếu tham số mà chức năng yêu cầu. Chức năng GET_EXERCISE_OBSERVATION yêu cầu tham số exerciseObservation.aboutExercise.name, do thuộc tính android:required="true" chỉ định. Đối với những trường hợp này, Trợ lý sẽ yêu cầu bạn xác định một ý định dự phòng để cho phép yêu cầu thành công, ngay cả khi không có tham số nào được cung cấp trong truy vấn.

  1. Trong shortcuts.xml, hãy thêm một ý định dự phòng vào khả năng GET_EXERCISE_OBSERVATION bằng cách sử dụng cấu hình sau:
    <!-- shortcuts.xml -->
    
    <capability android:name="actions.intent.GET_EXERCISE_OBSERVATION">
    
      <app-widget>
        <!-- ... -->
      </app-widget>
    
      <!-- Fallback intent with no parameters needed to successfully execute.-->
      <intent
        android:identifier="GET_EXERCISE_OBSERVATION_FALLBACK"
        android:action="android.intent.action.VIEW"
        android:targetClass="com.devrel.android.fitactions.widgets.StatsWidgetProvider">
      </intent>
    </capability>
    

Trong cấu hình mẫu này, phương thức thực hiện dự phòng là một ý định Android không có tham số trong dữ liệu Extra.

5. Bật tiện ích cho Trợ lý

Sau khi thiết lập tính năng GET_EXERCISE_OBSERVATION, hãy cập nhật lớp tiện ích để hỗ trợ lời gọi thoại cho Hành động trong ứng dụng.

Thêm thư viện mở rộng tiện ích

Thư viện mở rộng tiện ích Hành động trong ứng dụng giúp cải thiện các tiện ích để mang đến trải nghiệm sử dụng Trợ lý cho tính năng chuyển tiếp bằng giọng nói. Cụ thể, nó cho phép bạn cung cấp phần giới thiệu TTS tùy chỉnh cho các tiện ích của bạn.

  1. Thêm phần phụ thuộc Thư viện mở rộng tiện ích vào tài nguyên /app/build.gradle của ứng dụng mẫu:
    // app/build.gradle
    
    dependencies {
      //...
      implementation "com.google.assistant.appactions:widgets:0.0.1"
    }
    
    Nhấp vào Sync Now (Đồng bộ hoá ngay) trong hộp cảnh báo xuất hiện trong Android Studio. Việc đồng bộ hoá sau mỗi thay đổi của build.gradle giúp bạn tránh lỗi khi tạo ứng dụng.

Thêm dịch vụ tiện ích

Dịch vụ là một thành phần của ứng dụng có thể thực hiện các thao tác diễn ra trong thời gian dài trong nền. Ứng dụng của bạn cần cung cấp một dịch vụ để xử lý các yêu cầu về tiện ích.

  1. Thêm một dịch vụ vào tài nguyên AndroidManifest.xml của ứng dụng mẫu bằng cấu hình sau:
    <!-- AndroidManifest.xml -->
    <service
       android:name=".widgets.StatsWidgetProvider"
       android:enabled="true"
       android:exported="true">
       <intent-filter>
           <action
               android:name="com.google.assistant.appactions.widgets.PIN_APP_WIDGET" />
       </intent-filter>
    </service>
    
    

Trong khi truy vấn bằng giọng nói kích hoạt phương thức thực hiện tiện ích, Trợ lý sẽ sử dụng dịch vụ này để gửi yêu cầu đến ứng dụng. Dịch vụ nhận được yêu cầu cùng với dữ liệu BII. Dịch vụ sử dụng dữ liệu này nhằm tạo một đối tượng tiện ích RemoteView để kết xuất trong Trợ lý.

Cập nhật lớp tiện ích

Ứng dụng của bạn hiện đã được định cấu hình để định tuyến các yêu cầu chức năng GET_EXERCISE_OBSERVATION đến lớp tiện ích. Tiếp theo, hãy cập nhật lớp StatsWidget.kt để tạo một thực thể tiện ích được cá nhân hoá theo yêu cầu của người dùng bằng cách sử dụng các giá trị tham số BII.

  1. Mở lớp StatsWidget.kt rồi nhập thư viện Tiện ích Hành động trong ứng dụng:
    // StatsWidget.kt
    
    // ... Other import statements
    import com.google.assistant.appactions.widgets.AppActionsWidgetExtension
    
    
  2. Thêm các biến riêng tư sau đây. Bạn có thể dùng các biến này khi xác định thông tin cần điền vào tiện ích:
    // StatsWidget.kt
    
    private val hasBii: Boolean
    private val isFallbackIntent: Boolean
    private val aboutExerciseName: String
    private val exerciseType: FitActivity.Type
    
  3. Thêm hàm init để cho phép lớp sử dụng dữ liệu về các lựa chọn tiện ích được truyền từ Trợ lý:
    // StatsWidget.kt
    
    init {
      val optionsBundle = appWidgetManager.getAppWidgetOptions(appWidgetId)
      val bii = optionsBundle.getString(AppActionsWidgetExtension.EXTRA_APP_ACTIONS_BII)
      hasBii = !bii.isNullOrBlank()
      val params = optionsBundle.getBundle(AppActionsWidgetExtension.EXTRA_APP_ACTIONS_PARAMS)
    
      if (params != null) {
        isFallbackIntent = params.isEmpty
        if (isFallbackIntent) {
          aboutExerciseName = context.resources.getString(R.string.activity_unknown)
        } else {
            aboutExerciseName = params.get("aboutExerciseName") as String
          }
      } else {
          isFallbackIntent = false
          aboutExerciseName = context.resources.getString(R.string.activity_unknown)
      }
      exerciseType = FitActivity.Type.find(aboutExerciseName)
    }
    
    

Hãy cùng tìm hiểu cách những nội dung cập nhật này cho phép lớp StatsWidget.kt phản hồi ý định Android do tính năng GET_EXERCISE_OBSERVATION tạo:

  • optionsBundle = Gói
    • Gói là các đối tượng dùng để vượt qua các ranh giới của quy trình, giữa các hoạt động có ý định và để lưu trữ trạng thái tạm thời qua các thay đổi về cấu hình. Trợ lý sử dụng các đối tượng Bundle để truyền dữ liệu cấu hình vào tiện ích.
  • bii = actions.intent.GET_EXERCISE_OBSERVATION
    • Tên của BII có sẵn trong Gói bằng cách sử dụng AppActionsWidgetExtension.
  • hasBii = true
    • Kiểm tra xem có BII hay không.
  • params = Bundle[{aboutExerciseName=running}]
    • Một Gói đặc biệt do Hành động trong ứng dụng tạo ra sẽ được lồng bên trong các tuỳ chọn tiện ích Bundle. Lớp này chứa các cặp khoá/giá trị của BII. Trong trường hợp này, giá trị running được trích xuất từ truy vấn mẫu: "Ok Google, cho tôi xem số liệu thống kê về hoạt động chạy của tôi trên ExampleApp".
  • isFallbackIntent = false
    • Kiểm tra sự hiện diện của các tham số BII bắt buộc trong ý định Extras.
  • aboutExerciseName = running
    • Nhận giá trị ý định Extras cho aboutExerciseName.
  • exerciseType = RUNNING
    • Sử dụng aboutExerciseName để tra cứu đối tượng kiểu cơ sở dữ liệu tương ứng.

Hiện tại, lớp StatsWidget có thể xử lý dữ liệu ý định gọi đến về Hành động trong ứng dụng trên Android, hãy cập nhật logic quy trình tạo tiện ích để kiểm tra xem tiện ích đó có được Hành động trong ứng dụng kích hoạt hay không.

  1. Trong StatsWidget.kt, hãy thay thế hàm updateAppWidget() bằng mã sau:
    // StatsWidget.kt
    
    fun updateAppWidget() {
       /**
        * Checks for App Actions BII invocation and if BII parameter data is present.
        * If parameter data is missing, use data from last exercise recorded to the
        *  fitness tracking database.
        */
       if (hasBii && !isFallbackIntent) {
           observeAndUpdateRequestedExercise()
       } else observeAndUpdateLastExercise()
    }
    
    

Mã trước đó tham chiếu đến một hàm mới là observeAndUpdateRequestedExercise. Hàm này tạo dữ liệu tiện ích bằng cách sử dụng dữ liệu tham số exerciseType được truyền qua ý định trên Android cho Hành động trong ứng dụng.

  1. Thêm hàm observeAndUpdateRequestedExercise bằng mã này:
    // StatsWidget.kt
    
    /**
    * Create and observe the last exerciseType activity LiveData.
    */
    private fun observeAndUpdateRequestedExercise() {
      val activityData = repository.getLastActivities(1, exerciseType)
    
       activityData.observeOnce { activitiesStat ->
           if (activitiesStat.isNotEmpty()) {
               formatDataAndSetWidget(activitiesStat[0])
               updateWidget()
           } else {
               setNoActivityDataWidget()
               updateWidget()
           }
       }
    }
    
    

Trong đoạn mã trên, hãy sử dụng một lớp kho lưu trữ có trong ứng dụng để truy xuất dữ liệu thể dục từ cơ sở dữ liệu cục bộ của ứng dụng. Lớp này cung cấp API đơn giản hoá quyền truy cập vào cơ sở dữ liệu. Kho lưu trữ hoạt động bằng cách hiển thị đối tượng LiveData khi thực hiện các truy vấn dựa trên cơ sở dữ liệu. Trong mã của mình, bạn quan sát LiveData này để truy xuất hoạt động thể dục mới nhất.

Bật TTS

Bạn có thể cung cấp một chuỗi TTS để Trợ lý thông báo khi hiện tiện ích của bạn. Bạn nên thêm tính năng này để cung cấp ngữ cảnh âm thanh cho tiện ích của mình. Chức năng này do Thư viện mở rộng tiện ích Hành động trong ứng dụng cung cấp. Thư viện này cho phép bạn thiết lập văn bản và phần giới thiệu TTS đi kèm với các tiện ích của bạn trong Trợ lý.

Bạn nên giới thiệu TTS trong hàm formatDataAndSetWidget. Hàm này định dạng dữ liệu hoạt động được trả về từ cơ sở dữ liệu ứng dụng.

  1. Trong StatsWidget.kt, hãy thêm mã này vào hàm formatDataAndSetWidget:
    // StatsWidget.kt
    
    private fun formatDataAndSetWidget(
      activityStat: FitActivity,
    ) {
          // ...
    
          // Add conditional for hasBii for widget with data
          if (hasBii) {
             // Formats TTS speech and display text for Assistant
             val speechText = context.getString(
                 R.string.widget_activity_speech,
                 activityExerciseTypeFormatted,
                 formattedDate,
                 durationInMin,
                 distanceInKm
             )
             val displayText = context.getString(
                 R.string.widget_activity_text,
                 activityExerciseTypeFormatted,
                 formattedDate
             )
             setTts(speechText, displayText)
          }
    }
    
    

Mã trên tham chiếu đến 2 tài nguyên chuỗi: một cho lời nói và một cho văn bản. Xem phần Đề xuất kiểu chuyển văn bản sang lời nói trong video về tiện ích của chúng tôi cho các đề xuất TTS. Mẫu này cũng đề cập đến setTts, một hàm mới cung cấp thông tin TTS cho thực thể của tiện ích.

  1. Thêm hàm setTts mới này vào StatsWidget.kt bằng mã này:
    // StatsWidget.kt
    
    /**
     * Sets TTS to widget
     */
    private fun setTts(
      speechText: String,
      displayText: String,
    ) {
      val appActionsWidgetExtension: AppActionsWidgetExtension =
          AppActionsWidgetExtension.newBuilder(appWidgetManager)
            .setResponseSpeech(speechText)  // TTS to be played back to the user
            .setResponseText(displayText)  // Response text to be displayed in Assistant
            .build()
    
      // Update widget with TTS
      appActionsWidgetExtension.updateWidget(appWidgetId)
    }
    

Cuối cùng, hãy hoàn thiện logic TTS bằng cách đặt thông tin TTS khi cơ sở dữ liệu bài tập trả về dữ liệu trống cho một loại bài tập thể dục được yêu cầu.

  1. Cập nhật hàm setNoActivityDataWidget() trong StatsWidget.kt bằng mã này:
    // StatsWidget.kt
    
    private fun setNoActivityDataWidget() {
      // ...
      // Add conditional for hasBii for widget without data
      if (hasBii) {
        // formats speech and display text for Assistant
        // https://developers.google.com/assistant/app/widgets#library
        val speechText =
          context.getString(R.string.widget_no_activity_speech, aboutExerciseName)
        val displayText =
          context.getString(R.string.widget_no_activity_text)
    
        setTts(speechText, displayText)
      }
    }
    

6. Kiểm thử Hành động trong ứng dụng

Trong quá trình phát triển, hãy sử dụng trình bổ trợ Trợ lý Google để xem trước Hành động trong ứng dụng của Trợ lý trên thiết bị thử nghiệm. Bạn có thể điều chỉnh các tham số ý định cho một Hành động trong ứng dụng bằng công cụ này để kiểm thử cách hành động của bạn xử lý các cách mà người dùng có thể yêu cầu Trợ lý chạy hành động đó.

Tạo bản xem trước

Cách kiểm thử Hành động trong ứng dụng bằng trình bổ trợ:

  1. Chuyển đến Công cụ > Trợ lý Google > Công cụ kiểm tra Hành động trong ứng dụng. Bạn có thể được yêu cầu đăng nhập vào Android Studio bằng Tài khoản Google của mình.
  2. Nhấp vào Tạo bản xem trước. Nếu được yêu cầu, hãy xem lại và chấp nhận các chính sách cũng như điều khoản dịch vụ về Hành động trong ứng dụng.

Thử nghiệm một loại bài tập thể dục dự kiến

Trả về một tiện ích cho thấy thông tin về lần chạy gần đây nhất hoàn tất trong ứng dụng bằng cách làm theo các bước sau trong công cụ kiểm thử:

  1. Ở bước đầu tiên khi công cụ yêu cầu bạn chọn và định cấu hình BII, hãy chọn actions.intent.GET_EXERCISE_OBSERVATION.
  2. Trong hộp exerciseObservation (Quan sát bài tập), hãy cập nhật tên mặc định của Bài tập thể dục từ climbing thành run.
  3. Nhấp vào Run App Action (Chạy Hành động trong ứng dụng).

Màn hình cho thấy một tiện ích được trả về bằng trình bổ trợ Trợ lý Google.

Thử nghiệm một loại bài tập thể dục ngoài dự kiến

Cách kiểm thử một loại bài tập không mong muốn trong công cụ kiểm thử:

  1. Trong hộp exerciseObservation, hãy cập nhật giá trị name từ Run thành Climbing.
  2. Nhấp vào Run App Action (Chạy Hành động trong ứng dụng).

Trợ lý sẽ trả về một tiện ích hiển thị thông báo "Không tìm thấy hoạt động nào" của bạn.

Màn hình hiển thị một tiện ích không có thông tin về bài tập thể dục được trả về qua trình bổ trợ Trợ lý Google.

Kiểm thử ý định dự phòng

Các truy vấn kích hoạt ý định dự phòng phải trả về một tiện ích hiển thị thông tin về hoạt động được ghi lại gần đây nhất thuộc mọi loại bài tập thể dục.

Cách kiểm tra ý định dự phòng:

  1. Trong hộp exerciseObservation, hãy xoá đối tượng aboutExercise.
  2. Nhấp vào Run App Action (Chạy Hành động trong ứng dụng).

Trợ lý sẽ trả về một tiện ích hiển thị thông tin cho bài tập thể dục hoàn thành gần nhất.

Một màn hình hiển thị tiện ích cho thấy hoạt động được ghi lại gần đây nhất, bằng cách sử dụng trình bổ trợ Trợ lý Google.

7. Các bước tiếp theo

Xin chúc mừng!

Giờ đây, bạn có thể đáp ứng yêu cầu bằng cách sử dụng Tiện ích Android có Trợ lý.

Nội dung đã đề cập

Trong lớp học lập trình này, bạn đã tìm hiểu cách:

  • Thêm tiện ích ứng dụng vào BII.
  • Sửa đổi tiện ích để truy cập vào các tham số từ Android Extras.

Các bước tiếp theo

Từ đây, bạn có thể thử cải tiến thêm ứng dụng thể dục của mình. Để tham chiếu dự án đã hoàn tất, hãy xem kho lưu trữ chính trên GitHub.

Dưới đây là một số đề xuất để bạn tìm hiểu thêm về cách mở rộng ứng dụng này bằng Hành động trong ứng dụng:

Để tiếp tục hành trình Actions on Google, hãy khám phá các tài nguyên sau:

Hãy theo dõi chúng tôi trên Twitter @ActionsOnGoogle để luôn cập nhật những thông báo mới nhất của chúng tôi và đăng bài trên Twitter #appactions để chia sẻ những gì bạn đã xây dựng được!

Khảo sát nhận phản hồi

Cuối cùng, vui lòng điền vào bản khảo sát này để đưa ra ý kiến phản hồi về trải nghiệm của bạn khi tham gia lớp học lập trình này.