Xây dựng ứng dụng địa điểm yêu thích

Stay organized with collections Save and categorize content based on your preferences.

Phần này nêu chi tiết các tính năng khác nhau của thư viện mà bạn có thể sử dụng để triển khai chức năng của ứng dụng địa điểm yêu thích (CUE) của bạn.

Khai báo tính năng hỗ trợ danh mục trong tệp kê khai của bạn

Ứng dụng chỉ đường của bạn cần khai báo androidx.car.app.category.POI danh mục ứng dụng cho ô tô trong bộ lọc ý định của CarAppService:

<application>
    ...
   <service
       ...
        android:name=".MyCarAppService"
        android:exported="true">
      <intent-filter>
        <action android:name="androidx.car.app.CarAppService" />
        <category android:name="androidx.car.app.category.POI"/>
      </intent-filter>
    </service>
    ...
<application>

Truy cập vào mẫu bản đồ

Các ứng dụng có thể truy cập vào PlaceListMapTemplate được thiết kế riêng để hiện danh sách các địa điểm yêu thích cùng với một bản đồ do máy chủ hiển thị.

Để có thể truy cập vào mẫu này, ứng dụng của bạn cần khai báo quyền androidx.car.app.MAP_TEMPLATES trong AndroidManifest.xml:

<uses-permission android:name="androidx.car.app.MAP_TEMPLATES"/>

Làm mới nội dung PlaceListMapTemplate

Bạn có thể cho phép người lái xe làm mới nội dung bằng cách nhấn một nút trong khi duyệt qua danh sách các địa điểm được tạo bằng PlaceListMapTemplate. Triển khai phương thức onContentRefreshRequested của giao diện OnContentRefreshListener và sử dụng PlaceListMapTemplate.Builder.setOnContentRefreshListener nhằm thiết lập trình nghe trên mẫu để bật tính năng làm mới danh sách.

Đoạn mã sau đây cho biết cách thiết lập trình nghe trên mẫu:

Kotlin

PlaceListMapTemplate.Builder()
    ...
    .setOnContentRefreshListener {
        // Execute any desired logic
        ...
        // Then call invalidate() so onGetTemplate() is called again
        invalidate()
    }
    .build()

Java

new PlaceListMapTemplate.Builder()
        ...
        .setOnContentRefreshListener(() -> {
            // Execute any desired logic
            ...
            // Then call invalidate() so onGetTemplate() is called again
            invalidate();
        })
        .build();

Nút làm mới chỉ xuất hiện trong tiêu đề của PlaceListMapTemplate nếu trình nghe có giá trị.

Khi trình điều khiển nhấp vào nút làm mới, phương thức onContentRefreshRequested của quá trình triển khai OnContentRefreshListener sẽ được gọi. Trong onContentRefreshRequested, hãy gọi phương thức Screen.invalidate. Sau đó, máy chủ lưu trữ sẽ gọi lại phương thức Screen.onGetTemplate của ứng dụng để truy xuất mẫu có nội dung được làm mới. Xem phần Làm mới nội dung mẫu để biết thêm thông tin chi tiết về cách làm mới mẫu. Chỉ cần mẫu tiếp theo mà onGetTemplate trả về thuộc cùng một loại, thì mẫu đó sẽ được tính là một lần làm mới và không được tính vào hạn mức mẫu.

Tích hợp với Trợ lý Google bằng cách dùng Hành động trong ứng dụng

Hành động trong ứng dụng cho phép người dùng khởi chạy và điều khiển ứng dụng Android bằng giọng nói thông qua Trợ lý Google. Bạn có thể tích hợp Trợ lý với các ứng dụng địa điểm yêu thích bằng cách thêm khả năng cho Hành động trong ứng dụng. Chức năng là biểu thức cho tính năng liên quan của một ứng dụng, chứa Ý định tích hợp (BII) và khả năng thực hiện chức năng đó. Ví dụ: tính năng này cho phép người dùng nói "Này Google, hãy tìm chỗ đỗ xe trên đường trong ExampleApp", và ứng dụng sẽ mở màn hình thích hợp trong ứng dụng của bạn.

Các điểm hạn chế

Hành động trong ứng dụng có những hạn chế sau:

  • Chỉ dành cho các ứng dụng sử dụng Thư viện ứng dụng ô tô trong danh mục quan tâm.
  • Chức năng hỗ trợ thoại chỉ dành cho những ý định tích hợp tính năng Đỗ xe hoặc Sạc pin.
  • Bạn chỉ có thể thực hiện Hành động trong ứng dụng bằng các liên kết sâu.

Các bước tích hợp

  1. Thêm phần tử <meta-data> sau vào phần tử <application> của tệp AndroidManifest.xml:

     <meta-data
         android:name="android.app.shortcuts"
         android:resource="@xml/shortcuts" />
    
  2. Để cho phép Trợ lý liên kết đến nội dung của ứng dụng bằng đường liên kết sâu, bạn cần có phần tử <intent-filter> trong tệp AndroidManifest.xml.

    • Đối với Android Auto, intent-filter giống với ứng dụng dành cho thiết bị di động.

    • Đối với phương thức thực hiện Android Automotive OS, các Hành động trong ứng dụng được kích hoạt bởi các phiên CarAppService. Để cho phép một phiên kích hoạt đường liên kết sâu, bạn phải chỉ định một bộ lọc ý định trong phần tử <activity> của tệp AndroidManifest.xml.

    <activity
      ...
      android:name="androidx.car.app.activity.CarAppActivity">
      …
      <intent-filter>
          <action android:name="android.intent.action.VIEW" />
          <category android:name="android.intent.category.DEFAULT" />
          <category android:name="android.intent.category.BROWSABLE" />
          <data
            android:scheme="YOUR_SCHEME"
            android:host="YOUR_HOST" />
      </intent-filter>
    </activity>
    
  3. Tạo một tệp shortcuts.xml trong thư mục res/xml của dự án ứng dụng có các chức năng phù hợp:

    <?xml version="1.0" encoding="utf-8"?>
    <shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
      <!-- Your Capability definitions will go here -->
    </shortcuts>
    

    Xem các mục Chức năng bên dưới để biết thông tin về chức năng Đỗ xeSạc pin

  4. Cập nhật ứng dụng để xử lý quá trình thực hiện phiên.

    Dưới đây là các mẫu xử lý ý định cho Session.onCreateScreenSession.onNewIntent

    onCreateScreen

    Kotlin

    @Override
    fun onCreateScreen(@NonNull intent: Intent): Screen {
      if (intent.getData() != null) {
          val uri: Uri = intent.getData()
          // uri = "YOUR_SCHEME://YOUR_HOST?name=Levis%20center"
          // Build your Templates with parsed uri parameters
      ...
     }
    }
    

    Java

    @Override
    public Screen onCreateScreen(@NonNull Intent intent) {
     if (intent.getData() != null) {
       Uri uri = intent.getData();
       // uri = "YOUR_SCHEME://YOUR_HOST?name=Levis%20center"
       // Build your Templates with parsed uri parameters
      …
     }
    }
    

    onNewIntent

    Kotlin

    @Override
    fun onNewIntent(@NonNull intent: Intent): Screen {
      if (intent.getData() != null) {
          val uri: Uri = intent.getData()
          // uri = "YOUR_SCHEME://YOUR_HOST?name=Levis%20center"
          // Build your Templates with parsed uri parameters
          …
      }
    }
    

    Java

    @Override
    public void onNewIntent(@NonNull Intent intent) {
     if (intent.getData() != null) {
       Uri uri = intent.getData();
       // uri = "YOUR_SCHEME://YOUR_HOST?name=Levis%20center"
       // Build your Templates with parsed uri parameters
       …
     }
    }
    

Chức năng

Hành động trong ứng dụng hỗ trợ những chức năng sau:

Đỗ xe

ID hành động: actions.intent.GET_PARKING_FACILITY

Mô tả: Tìm chỗ đỗ xe. Có thể chỉ định loại bãi đỗ xe, tên ứng dụng và vị trí.

Hỗ trợ ngôn ngữ: en-US (Tiếng Anh - Mỹ)

Các tham số:

  • parkingFacility.disambiguatingDescription – Thông tin mô tả loại bãi đỗ xe, chẳng hạn như "miễn phí", "nhân viên đỗ xe" hoặc "đường phố". Bạn có thể lọc thông tin về loại bãi đỗ xe bằng cách dùng tham số này.
  • Những tham số sau có thể giúp bạn xác định vị trí của bãi đỗ xe mà người dùng yêu cầu. Nếu không có thông tin nào hiển thị, bạn nên trả về các cơ sở gần vị trí hiện tại của người dùng nhất.
    • parkingFacility.name – Tên của vị trí cơ sở, chẳng hạn như "Mountain View"
    • parkingFacility.address – Địa chỉ của vị trí cơ sở, chẳng hạn như "123 đường Easy, Mountain View, California"
    • parkingFacility.geo.latitude – Vĩ độ của cơ sở, chẳng hạn như "37.3861"
    • parkingFacility.geo.longitude – Kinh độ của cơ sở, ví dụ như "-122.084"

Định nghĩa capability mẫu:

<?xml version="1.0" encoding="utf-8"?>
<!-- This is a sample shortcuts.xml -->
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">

  <capability android:name="actions.intent.GET_PARKING_FACILITY">
    <intent>
      <url-template
       android:value="YOUR_SCHEME://YOUR_HOST{?name,address,disambiguatingDescription,latitude,longitude}">

      <!-- Eg. name = "Googleplex" -->
      <parameter
        android:name="parkingFacility.name"
        android:key="name"/>
      <!-- Eg. address = "1600 Amphitheatre Pkwy, Mountain View, CA 94043" -->
      <parameter
        android:name="parkingFacility.address"
        android:key="address"/>
      <!-- Eg. disambiguatingDescription = "valet" -->
      <parameter
        android:name="parkingFacility.disambiguatingDescription"
        android:key="disambiguatingDescription"/>
      <!-- Eg. latitude = "37.3861" -->
      <parameter
        android:name="parkingFacility.geo.latitude"
        android:key="latitude"/>
      <!-- Eg. longitude = "-122.084" -->
      <parameter
        android:name="parkingFacility.geo.longitude"
        android:key="longitude"/>
    </intent>
  </capability>
</shortcuts>

Sạc pin

ID hành động: actions.intent.GET_CHARGING_STATION

Mô tả: Tìm trạm sạc. Có thể chỉ định tên hoặc vị trí ứng dụng.

Hỗ trợ ngôn ngữ: en-US (Tiếng Anh - Mỹ)

Các tham số:

  • chargingStation.disambiguatingDescription – Thông tin mô tả loại bãi đỗ xe, chẳng hạn như "miễn phí", "trả phí". Bạn có thể lọc thông tin về kiểu trạm sạc bằng cách dùng tham số này.
  • Những tham số sau có thể giúp bạn xác định vị trí của trạm sạc mà người dùng yêu cầu. Nếu không có thông tin nào hiển thị, bạn nên trả về các trạm gần vị trí hiện tại của người dùng nhất.
    • chargingStation.name – Tên vị trí của trạm, chẳng hạn như "Mountain View"
    • chargingStation.address – Địa chỉ của vị trí trạm, chẳng hạn như "123 đường Easy, Mountain View, California"
    • chargingStation.geo.latitude – Vĩ độ của trạm, chẳng hạn như "37.3861"
    • chargingStation.geo.longitude – Kinh độ của trạm, chẳng hạn như "-122.084"

Định nghĩa capability mẫu:

<?xml version="1.0" encoding="utf-8"?>
<!-- This is a sample shortcuts.xml -->
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
  <capability android:name="actions.intent.GET_CHARGING_STATION">
    <intent>
      <url-template
       android:value="YOUR_SCHEME://YOUR_HOST{?name,address,latitude,longitude,type}">

      <!-- Eg. name = "Googleplex" -->
      <parameter
        android:name="chargingStation.name"
        android:key="name"/>
      <!-- Eg. address = "1600 Amphitheatre Pkwy, Mountain View, CA 94043" -->
      <parameter
        android:name="chargingStation.address"
        android:key="address"/>
      <!-- Eg. latitude = "37.3861" -->
      <parameter
        android:name="chargingStation.geo.latitude"
        android:key="latitude"/>
      <!-- Eg. longitude = "-122.084" -->
      <parameter
        android:name="chargingStation.geo.longitude"
        android:key="longitude"/>
    </intent>
  </capability>
</shortcuts>