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

1. Tổng quan

Trong 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 sang một ứng dụng thể dục mẫu bằng cách triển khai các ý định tích hợp (BII) từ danh mục BII về Sức khoẻ và thể dục.

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 thông qua Trợ lý bằng cách hỏi những câu như "Ok Google, 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ó thể tương tác cho người dùng để đáp ứng các yêu cầu đối với BII đủ điều kiện.

Màn hình cho thấy Trợ lý trả về một tiện ích để phản hồi một truy vấn của người dùng đã kích hoạt chức năng BII 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ẽ học được 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 văn bản dưới dạng lời nói (TTS) trong Trợ lý cho các tiện ích của bạn.
  • Sử dụng Tài liệu tham khảo về ý định tích hợp sẵn để xác định những BII 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 cho việc phát triển Hành động trong ứng dụng. Thông tin này phải có:

  • Một cửa sổ dòng lệnh để chạy các lệnh shell, có 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 thiết bị Android ảo có quyền truy cập Internet.
  • Một Tài khoản Google đã đă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 tính năng hiểu ngôn ngữ tự nhiên (NLU) để đọc yêu cầu của người dùng và so khớp yêu cầu đó với một ý định tích hợp sẵn (BII) của Trợ lý. Sau đó, Trợ lý sẽ ánh xạ ý định đến chức năng (triển khai BII) mà bạn đăng ký cho ý định đó trong ứng dụng của mình. Cuối cùng, Trợ lý sẽ đá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 bằng 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 đăng ký hỗ trợ BII GET_EXERCISE_OBSERVATION. Trong chức 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 này để tạo một tiện ích được cá nhân hoá để Trợ lý hiển thị cho người dùng và một phần giới thiệu TTS để Trợ lý thông báo.

Sơ đồ sau đâ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 của Trợ lý.

Tiện ích FitActions

Ứng dụng mẫu FitActions chứa một tiện ích thông tin về hoạt động tập luyện 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 lựa chọn phù hợp để 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 hoạt động của tiện ích

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 Broadcast Receiver của thiết bị. Dịch vụ này truy xuất thông tin về tiện ích từ định nghĩa của receiver tiện ích trong tài nguyên AndroidManifest.xml của ứng dụng. Dịch vụ 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 widgets.StatsWidgetProvider của trình nhận, 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ý các luồng tạo đối tượng StatsWidget. Ứng dụng này đảm nhận 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 bài tập vào các thực thể đó từ cơ sở dữ liệu ứng dụng.
  • Định dạng dữ liệu tập luyện để dễ đọc bằng formatDataAndSetWidget().
  • Cung cấp giá trị mặc định nếu không có dữ liệu về bài tập, sử dụng setNoActivityDataWidget().

Thêm tính 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 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, chẳng hạn 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ề bài tập bằng cách hỏi những câu như "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."
    • 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 có tham số loại bài tập.

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 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 Welcome to Android Studio (Chào mừng bạn đến với Android Studio), hãy nhấp vào Import project (Nhập dự án).
  2. Tìm và chọn thư mục nơi 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ờ --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 của bạn và tránh lỗi "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 bằng một tên riêng biệt cho 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 trên một thiết bị thử nghiệm. 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 Trình bổ trợ, hãy chuyển đến Marketplace rồi tìm "Trợ lý Google". Bạn cũng có thể tải 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 các thay đổi cho ứng dụng, bạn nên tìm hiểu những việc mà ứng dụng mẫu có thể làm.

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

  1. Trong Android Studio, hãy chọn thiết bị thực hoặc thiết bị ảo rồi chọn Run > Run app (Chạy > Chạy ứng dụng) hoặc nhấp vào biểu tượng RunBiểu tượng ứng dụng chạy trong Android Studio. (Chạy) 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 minh rằng Trợ lý hoạt động. Bạn sẽ cần đăng nhập vào Trợ lý trên thiết bị của mình (nếu chưa đăng nhập).

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

Khám phá nhanh ứng dụng để xem ứng dụng có thể làm gì. Ứng dụng sẽ điền sẵn 10 hoạt động tập thể dục và hiển thị thông tin này trên chế độ xem đầu tiên.

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

  1. Nhấn vào nút 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ữ 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 để tìm FitActions.
  4. Nhấn và giữ biểu tượng FitActions rồi đặt tiện ích này lên màn hình chính.

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

4. Thêm Thao tác trong ứng dụng

Ở bước này, bạn sẽ thêm khả 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 vào shortcuts.xml. Chức 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 nào của Android 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 sau:
    <!-- 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 duy nhất của bạn.

Khả năng này liên kết BII GET_EXERCISE_OBSERVATION với ý định app-widget để khi BII được kích hoạt, tiện ích sẽ khởi tạo 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 mà người dùng yêu cầu. Ứng dụng này hỗ trợ 3 loại bài tập: "chạy bộ", "đ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ề những 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 trường hợp không thực hiện được truy vấn của người dùng vì truy vấn đó thiếu các tham số bắt buộc theo chức năng. Chức năng GET_EXERCISE_OBSERVATION yêu cầu tham số exerciseObservation.aboutExercise.name, được chỉ định bằng thuộc tính android:required="true". Trong những trường hợp này, Trợ lý 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 chức năng GET_EXERCISE_OBSERVATION bằ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 khả năng GET_EXERCISE_OBSERVATION, hãy cập nhật lớp tiện ích để hỗ trợ lệnh gọi bằng giọng nói cho Hành động trong ứng dụng.

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

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

  1. Thêm phần phụ thuộc của thư viện Tiện ích mở rộng 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 Đồ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 lần thay đổi build.gradle giúp bạn tránh được 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 kéo 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 một truy vấn bằng giọng nói kích hoạt việc thực hiện tiện ích, Trợ lý sẽ dùng dịch vụ này để gửi yêu cầu đến ứng dụng. Dịch vụ này sẽ nhận được yêu cầu cùng với dữ liệu BII. Dịch vụ này sử dụng dữ liệu này để tạo một đối tượng tiện ích RemoteView nhằm 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 về 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 phiên bản 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 và 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ư này mà bạn dùng 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 cho 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 các ý định của Android do chức năng GET_EXERCISE_OBSERVATION tạo ra:

  • optionsBundle = Gói
    • Bundle là các đối tượng được dùng trên các ranh giới 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 đến tiện ích.
  • bii = actions.intent.GET_EXERCISE_OBSERVATION
    • Tên của BII có 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 Bundle đặc biệt do Hành động trong ứng dụng tạo ra sẽ được lồng bên trong các lựa chọn về tiện ích Bundle. Nó 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ừ cụm từ tìm kiếm 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 loại cơ sở dữ liệu tương ứng.

Giờ đây, khi lớp StatsWidget có thể xử lý dữ liệu ý định Android của Hành động trong ứng dụng, hãy cập nhật logic quy trình tạo tiện ích để kiểm tra xem tiện ích có được kích hoạt bởi một Hành động trong ứng dụng hay không.

  1. Trong StatsWidget.kt, hãy thay thế hàm updateAppWidget() bằng đoạn 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, 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 do ý định Android của Hành động trong ứng dụng truyền.

  1. Thêm hàm observeAndUpdateRequestedExercise bằng mã sau:
    // 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ước, hãy sử dụng một lớp repository hiện có trong ứng dụng để truy xuất dữ liệu về hoạt động thể dục từ cơ sở dữ liệu cục bộ của ứng dụng. Lớp này cung cấp một API giúp đơn giản hoá việc truy cập vào cơ sở dữ liệu. Kho lưu trữ hoạt động bằng cách hiển thị một đối tượng LiveData khi thực hiện các truy vấn đối với cơ sở dữ liệu. Trong mã của bạn, 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 thuộc tính này để cung cấp ngữ cảnh có thể nghe được cho các tiện ích. Chức năng này được cung cấp bởi thư viện mở rộng tiện ích của Hành động trong ứng dụng, cho phép bạn đặt văn bản và phần giới thiệu TTS đi kèm với tiện ích của bạn trong Trợ lý.

Một vị trí phù hợp để cung cấp phần giới thiệu TTS là 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. Hãy xem phần Đề xuất về kiểu chuyển văn bản sang lời nói trong video về các tiện ích của chúng tôi để biết các đề xuất về 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 phiên bản tiện ích.

  1. Thêm hàm setTts mới này vào StatsWidget.kt bằng mã sau:
    // 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 tất 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 được yêu cầu.

  1. Cập nhật hàm setNoActivityDataWidget() trong StatsWidget.kt bằng mã sau:
    // 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 một 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ý nhiều cách mà người dùng có thể yêu cầu Trợ lý kích hoạt 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 phầ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 xét và chấp nhận các chính sách và điều khoản dịch vụ về Hành động trong ứng dụng.

Kiểm thử một loại bài tập dự kiến

Trả về một tiện ích cho biết 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 một BII, hãy chọn actions.intent.GET_EXERCISE_OBSERVATION.
  2. Trong hộp exerciseObservation, hãy cập nhật tên Bài tập mặc định từ climbing thành run.
  3. Nhấp vào Run App Action (Chạy thao tác trên ứng dụng).

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

Kiểm thử một loại bài tập không mong muốn

Cách kiểm thử một loại bài tập thể dục 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 thao tác trên ứng dụng).

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

Màn hình cho thấy một tiện ích không trả về thông tin về bài tập thể dục bằng cách sử dụng 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 sẽ trả về một tiện ích hiển thị thông tin về hoạt động đã ghi nhật ký gần đây nhất của mọi loại bài tập.

Cách kiểm thử ý đị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 thao tác trên ứng dụng).

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

Màn hình cho thấy một tiện ích hiển thị hoạt động gần đây nhất được ghi lại, 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 các truy vấn của người dùng bằng Tiện ích Android thông qua 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 một tiện ích để truy cập vào các tham số từ Android Extras.

Bước tiếp theo

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

Sau đây là một số đề xuất để bạn tìm hiểu thêm về việc 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 của bạn trên Actions on Google, hãy khám phá những tài nguyên sau:

Theo dõi chúng tôi trên Twitter @ActionsOnGoogle để nắm bắt những thông báo mới nhất của chúng tôi, đồng thời đăng bài lên Twitter kèm theo thẻ hashtag #appactions để chia sẻ những gì bạn đã tạo!

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 với lớp học lập trình này.