Bật nguồn cấp dữ liệu từng chặng

Nguồn cấp dữ liệu từng chặng cung cấp thông tin chỉ đường cho các thiết bị không được thiết kế cho hướng dẫn chỉ đường dựa trên bản đồ. Hướng dẫn này cung cấp các lần diễn tập sắp tới với các phần tử mà bạn cung cấp:

  • biểu tượng (trái, phải, quay đầu)
  • rẽ số tại đường vòng
  • tên đường
  • khoảng cách và thời gian ước tính đến bước di chuyển tiếp theo hoặc điểm đến cuối cùng

Bạn có thể sử dụng nguồn cấp dữ liệu theo từng chặng để tạo ra những trải nghiệm mà giao diện người dùng SDK điều hướng đầy đủ không phù hợp, chẳng hạn như đối với Android Auto hoặc cho màn hình nhỏ khi không có toàn bộ ngăn xếp Android. Ví dụ: bạn có thể sử dụng tính năng này cho những người lái xe hai bánh, trong đó bạn có thể chiếu hướng dẫn chỉ chỉ đường để giúp họ đến điểm đến nhanh hơn và tự tin hơn mà không bị phân tâm.

Để sử dụng SDK này, bạn sẽ tạo một dịch vụ và đăng ký dịch vụ đó với SDK điều hướng cho Android để dịch vụ đó có thể nhận thông tin điều hướng mới theo thời gian thực (khoảng một lần một giây trong quá trình điều hướng).

Tài liệu này cho bạn biết cách tạo và đăng ký một dịch vụ điều hướng nhận thông tin điều hướng từ SDK và cung cấp trạng thái điều hướng cho thiết bị nhận.

Tổng quan

Phần này mô tả cách thêm thư viện TurnByTurn vào các dự án của bạn và tóm tắt quy trình cấp cao để xây dựng chức năng theo từng chặng.

Để sử dụng phiên bản độc lập của thư viện TurnByTurn, hãy làm theo các bước sau:

  1. Thiết lập môi trường để truy cập vào kho lưu trữ Maven của máy chủ như mô tả trong phần Bắt đầu sử dụng SDK trình điều khiển trong Tài liệu về chuyến đi và đơn đặt hàng.

  2. Thêm phần phụ thuộc sau vào cấu hình Maven hoặc Gradle:

    Maven

    <dependencies>
      ...
      <dependency>
        <groupId>com.google.android.maps</groupId>
        <artifactId>google_turnbyturn</artifactId>
        <version>1.0.0</version>
      </dependency>
    </dependencies>
    

    Gradle

    dependencies {
      ...
      implementation 'com.google.android.maps:google_turnbyturn:1.0.0'
    }
    

Thêm thư viện TurnByTurn vào dự án của bạn bằng cách sử dụng tệp JAR đã tải xuống (phiên bản thay thế)

Thư viện rẽByTurn có sẵn dưới dạng tệp JAR trong thư mục SDK này. Nếu bạn không có quyền truy cập, hãy liên hệ với người đại diện của mình.

  1. Tải xuống và giải nén google_turnbyturn_*.jar.
  2. Sao chép tệp JAR đã tải xuống vào thư mục app/libs của dự án.
  3. Thêm phần sau vào build.gradle để đưa JAR vào bản dựng.

    dependencies {
       ...
       api fileTree(include: ['*.jar'], dir: 'libs')
    }
    

Sử dụng Thư viện TurnByTurn

Dưới đây là các bước cấp cao để bật chức năng từng chặng. Các phần tiếp theo sẽ cung cấp thông tin chi tiết về từng bước.

  1. Tạo một dịch vụ để nhận thông tin cập nhật về lộ trình di chuyển.

  2. Đăng ký dịch vụ.

  3. Tìm hiểu các trạng thái điều hướng.

  4. Xem ví dụ về màn hình chỉ đường cho thấy các phần tử thiết yếu.

Tạo một dịch vụ để nhận thông tin cập nhật về lộ trình di chuyển {#service}

SDK điều hướng liên kết với dịch vụ TurnByTurn của bạn và gửi nội dung cập nhật điều hướng qua Android Messenger. Bạn có thể tạo một dịch vụ chỉ đường mới cho những nội dung cập nhật này hoặc sử dụng một dịch vụ hiện có.

Lợi ích của việc sử dụng một dịch vụ để nhận thông tin cập nhật điều hướng là dịch vụ đó có thể tồn tại trong một quy trình riêng ở chế độ nền.

Dịch vụ trong ví dụ sau nhận thông tin điều hướng và sử dụng TurnByTurnManager để chuyển đổi dữ liệu thành đối tượng NavInfo chứa thông tin điều hướng.

/**
 *   Receives turn-by-turn navigation information forwarded from NavSDK.
 */
public class NavInfoReceivingService extends Service {
  /** The messenger used by the service to receive nav step updates. */
  private Messenger incomingMessenger;
  private TurnByTurnManager turnByTurnManager;

  private final class IncomingNavStepHandler extends Handler {
    public IncomingNavStepHandler(Looper looper) {
      super(looper);
    }

    @Override
    public void handleMessage(Message msg) {
      // Identify the message through the msg.what field.
      if (TurnByTurnManager.MSG_NAV_INFO == msg.what) {
        // Extract the NavInfo object using the TurnByTurnManager.
        NavInfo navInfo = turnByTurnManager
          .readNavInfoFromBundle(msg.getData()));
      // Do something with the NavInfo
    }
  }
}

@Nullable
@Override
public IBinder onBind(Intent intent) {
  return incomingMessenger.getBinder();
}

@Override
public void onCreate() {
  turnByTurnManager = TurnByTurnManager.createInstance();
  HandlerThread thread =
    new HandlerThread("NavInfoReceivingService",
      Process.THREAD_PRIORITY_DEFAULT);
  thread.start();
  incomingMessenger = new Messenger(
    new IncomingNavStepHandler(thread.getLooper()));
}

Mã tin nhắn

Bạn có thể xác định thông báo NavInfo thông qua trường Message.what của lớp Message. Trường này được đặt thành giá trị của TurnByTurnManager.MSG_NAV_INFO.

Đăng ký dịch vụ nhận bản cập nhật điều hướng {#register}

Các đoạn mã sau đây sẽ đăng ký dịch vụ chỉ đường.

boolean isNavInfoReceivingServiceRegistered =
          navigator.registerServiceForNavUpdates(
              getPackageName(), NavInfoReceivingService.class.getName(), numNextStepsToPreview);

Khởi động và dừng dịch vụ

Dịch vụ điều hướng sẽ hoạt động miễn là SDK điều hướng liên kết với dịch vụ đó. Bạn có thể gọi startService()stopService() theo cách thủ công để kiểm soát vòng đời của dịch vụ chỉ đường. Tuy nhiên, khi bạn đăng ký dịch vụ bằng SDK Điều hướng, dịch vụ của bạn sẽ tự động bắt đầu và chỉ dừng khi bạn huỷ đăng ký. Tuỳ thuộc vào cách thiết lập ứng dụng, bạn có thể cân nhắc bắt đầu sử dụng dịch vụ trên nền trước, như mô tả trong phần Tổng quan về dịch vụ trong tài liệu Android.

Đang huỷ đăng ký dịch vụ

Để ngừng nhận thông tin cập nhật về chỉ đường, hãy huỷ đăng ký dịch vụ khỏi SDK Điều hướng.

navigator.unregisterServiceForNavUpdates();

Tìm hiểu các trạng thái điều hướng {#states}

Sử dụng NavInfo.getNavState() để lấy trạng thái điều hướng hiện tại, một trong những trạng thái sau:

  • Enroute – Trạng thái ENROUTE có nghĩa là tính năng chỉ đường có hướng dẫn hiện đang hoạt động và người dùng đang ở trên tuyến đường được cung cấp. Hiện đã có thông tin về bước điều động sắp tới.

  • Đang định tuyếnREROUTING có nghĩa là quá trình điều hướng đang diễn ra nhưng trình điều hướng đang tìm kiếm một tuyến mới. Chưa có bước điều động sắp tới vì chưa có tuyến đường mới nào. Trong ứng dụng mẫu, thông báo "Đang định tuyến..." sẽ xuất hiện trên màn hình thông tin chỉ đường. Sau khi tìm thấy một tuyến đường, thông báo NavInfo sẽ được gửi với trạng thái ENROUTE.

  • Đã dừngSTOPPED có nghĩa là lộ trình chỉ đường đã kết thúc. Ví dụ: quá trình điều hướng sẽ dừng khi người dùng thoát khỏi phần điều hướng trong ứng dụng. Trong ứng dụng mẫu, trạng thái STOPPED sẽ xoá màn hình thông tin chỉ đường để ngăn hướng dẫn bước còn lại xuất hiện.

Điền vào chế độ hiển thị nguồn cấp dữ liệu

Hiện bạn đã thiết lập dịch vụ theo từng chặng, phần này trình bày về các thành phần hình ảnh và văn bản mà bạn có thể sử dụng để điền sẵn thẻ hướng dẫn cho nguồn cấp dữ liệu theo từng chặng.

Trên màn hình thiết bị di động, hiển thị ngã rẽ trái sắp tới cách Đại lộ W Ahwanee 30 mét. Ở cuối màn hình, thời gian còn lại để tới điểm đến là 46 phút và quãng đường còn lại là 39 dặm.

Khi người lái xe vào chế độ chỉ đường có hướng dẫn, một thẻ điều hướng sẽ xuất hiện ở trên cùng, chứa ngày chỉ đường được điền từ SDK Điều hướng. Hình ảnh có liên quan cho thấy ví dụ về các phần tử điều hướng thiết yếu này.

Bảng này hiển thị các trường cho thông tin điều hướng và nơi bạn tìm thấy các thông tin đó.

Các trường cho mỗi bước điều hướng Các trường cho toàn bộ chuyến đi
Tìm thấy ở StepInfo Tìm thấy ở NavInfo
Tên đầy đủ của đường Thời gian còn lại
Biểu tượng thao tác Khoảng cách tới điểm đến
Khoảng cách đến bước tiếp theo
Trường hướng dẫn làn đường

Hướng dẫn làn đường

SDK điều hướng thể hiện các làn đường trong thẻ rẽ điều hướng dưới dạng đối tượng dữ liệu LaneLaneDirection. Đối tượng Lane đại diện cho một làn đường cụ thể trong quá trình điều hướng và có danh sách các đối tượng LaneDirection mô tả tất cả các ngã rẽ có thể được tạo từ làn đường này.

Cấu hình hướng dẫn làn đường mẫu.

Hướng đề xuất mà người lái xe nên đi trong một làn đường được đánh dấu thông qua trường isRecommended (Đề xuất).

Ví dụ về hướng dẫn làn đường

Đoạn mã sau minh hoạ cách thể hiện dữ liệu về các làn được hiển thị ở trên.

// Lane 1
LaneDirections = [{/*laneShape=*/ STRAIGHT, /*isRecommended=*/ false},
                  {/*laneShape=*/ SLIGHT_LEFT, /*isRecommended=*/ true}]

// Lane 2
LaneDirections = [{/*laneShape=*/ STRAIGHT, /*isRecommended=*/ false}]

Tạo biểu tượng cho các thao tác

enum Maneuver xác định từng thao tác có thể xảy ra trong khi điều hướng, và bạn có thể thực hiện một bước nhất định trong phương thức StepInfo.getManeuver().

Bạn phải tạo biểu tượng thao tác và ghép các biểu tượng này với các thao tác có liên quan. Đối với một số thao tác, bạn có thể thiết lập mối liên kết một với một với một biểu tượng, chẳng hạn như DESTINATION_LEFTDESTINATION_RIGHT. Tuy nhiên, vì một số thao tác tương tự nhau, nên bạn có thể cần liên kết nhiều thao tác với một biểu tượng duy nhất. Ví dụ: TURN_LEFTON_RAMP_LEFT đều có thể ánh xạ tới biểu tượng rẽ trái.

Một số thao tác có chứa nhãn clockwise hoặc counterclockwise bổ sung mà SDK xác định dựa trên phía lái xe của một quốc gia. Ví dụ: ở các quốc gia mà khi lái xe ở phía bên trái đường, người lái xe sẽ đi vòng quanh hoặc quay đầu theo chiều kim đồng hồ, trong khi các quốc gia phía bên phải đường thì đi theo chiều kim đồng hồ. SDK điều hướng phát hiện xem một thao tác xảy ra trong lưu lượng truy cập bên trái hay bên phải và đưa ra thao tác phù hợp. Do đó, biểu tượng thao tác có thể khác nhau khi thao tác theo chiều kim đồng hồ so với thao tác ngược chiều kim đồng hồ.

Mở rộng để xem các biểu tượng ví dụ cho các thao tác khác nhau

Biểu tượng mẫu Thao tác quay đầu
DEPART
UNKNOWN
STRAIGHT
ON_RAMP_UNSPECIFIED
OFF_RAMP_UNSPECIFIED
NAME_CHANGE
TURN_RIGHT
ON_RAMP_RIGHT
TURN_LEFT
ON_RAMP_LEFT
TURN_SLIGHT_RIGHT
ON_RAMP_SLIGHT_RIGHT
OFF_RAMP_SLIGHT_RIGHT
TURN_SLIGHT_LEFT
ON_RAMP_SLIGHT_LEFT
OFF_RAMP_SLIGHT_LEFT
TURN_SHARP_RIGHT
ON_RAMP_SHARP_RIGHT
OFF_RAMP_SHARP_RIGHT
TURN_SHARP_LEFT
ON_RAMP_SHARP_LEFT
OFF_RAMP_SHARP_LEFT
TURN_U_TURN_COUNTERCLOCKWISE
ON_RAMP_U_TURN_COUNTERCLOCKWISE
OFF_RAMP_U_TURN_COUNTERCLOCKWISE
TURN_U_TURN_CLOCKWISE
ON_RAMP_U_TURN_CLOCKWISE
OFF_RAMP_U_TURN_CLOCKWISE
ROUNDABOUT_SHARP_RIGHT_COUNTERCLOCKWISE
ROUNDABOUT_SHARP_RIGHT_CLOCKWISE
ROUNDABOUT_RIGHT_COUNTERCLOCKWISE
ROUNDABOUT_RIGHT_CLOCKWISE
ROUNDABOUT_SLIGHT_RIGHT_COUNTERCLOCKWISE
ROUNDABOUT_SLIGHT_RIGHT_CLOCKWISE
ROUNDABOUT_STRAIGHT_COUNTERCLOCKWISE
ROUNDABOUT_STRAIGHT_CLOCKWISE
ROUNDABOUT_SLIGHT_LEFT_COUNTERCLOCKWISE
ROUNDABOUT_SLIGHT_LEFT_CLOCKWISE
ROUNDABOUT_LEFT_COUNTERCLOCKWISE
ROUNDABOUT_LEFT_CLOCKWISE
ROUNDABOUT_SHARP_LEFT_COUNTERCLOCKWISE
ROUNDABOUT_SHARP_LEFT_CLOCKWISE
ROUNDABOUT_U_TURN_COUNTERCLOCKWISE
ROUNDABOUT_U_TURN_CLOCKWISE
ROUNDABOUT_COUNTERCLOCKWISE
ROUNDABOUT_CLOCKWISE
ROUNDABOUT_EXIT_COUNTERCLOCKWISE
ROUNDABOUT_EXIT_CLOCKWISE
MERGE_RIGHT
OFF_RAMP_RIGHT
MERGE_LEFT
OFF_RAMP_LEFT
FORK_RIGHT
TURN_KEEP_RIGHT
ON_RAMP_KEEP_RIGHT
OFF_RAMP_KEEP_RIGHT
FORK_LEFT
TURN_KEEP_LEFT
ON_RAMP_KEEP_LEFT
OFF_RAMP_KEEP_LEFT
MERGE_UNSPECIFIED
DESTINATION
DESTINATION_RIGHT
DESTINATION_LEFT
FERRY_BOAT
FERRY_TRAIN

Sử dụng biểu tượng đã tạo

Một danh sách nhỏ các biểu tượng được tạo do SDK điều hướng cung cấp.

Để hỗ trợ các trường hợp sử dụng Android Auto, SDK điều hướng sẽ hỗ trợ tạo biểu tượng thao tác và hướng dẫn làn đường. Các biểu tượng này phù hợp với hướng dẫn về kích thước hình ảnh của thư viện Ứng dụng Android Auto cho ô tô. Thư viện này đề xuất nhắm đến hộp giới hạn 500 x 74 dp. Xem setsLaneImageCarIcon trong tài liệu tham khảo Android để biết thông tin chi tiết.

Ví dụ về quá trình tạo biểu tượng

NavigationUpdatesOptions options =
  NavigationUpdatesOptions.builder()
             .setNumNextStepsToPreview(numNextStepsToPreview)
             .setGeneratedStepImagesType(GeneratedStepImagesType.BITMAP)
             .setDisplayMetrics(getResources().getDisplayMetrics())
             .build();
boolean isRegistered =
          navigator.registerServiceForNavUpdates(
              getPackageName(),
              NavInfoReceivingService.class.getName(),
              options);

Sau khi bạn bật tính năng tạo biểu tượng, đối tượngTurnbyTurn StepInfo sẽ điền các biểu tượng vào các trường maneuverBitmaplanesBitmap.

Các bước tiếp theo