Triển khai chế độ điều khiển vô tuyến

Việc triển khai chức năng điều khiển đài dựa trên MediaSessionMediaBrowse, cho phép các ứng dụng Trợ lý giọng nói và Nội dung nghe nhìn điều khiển đài. Để biết thêm thông tin, hãy xem bài viết Tạo ứng dụng đa phương tiện cho ô tô trên developer.android.com.

Việc triển khai cây duyệt qua nội dung nghe nhìn được cung cấp trong thư viện hỗ trợ car-broadcastradio trong packages/apps/Car/libs. Thư viện này cũng chứa các phần mở rộng của ProgramSelector để chuyển đổi sang và từ URI. Bạn nên sử dụng thư viện này để tạo cây duyệt web liên kết khi triển khai đài phát thanh.

Trình chuyển đổi nguồn nội dung nghe nhìn

Để chuyển đổi liền mạch giữa đài và các ứng dụng khác hiển thị trong nội dung nghe nhìn, thư viện car-media-common chứa các lớp cần được tích hợp vào ứng dụng đài. Bạn có thể đưa MediaAppSelectorWidget vào tệp XML cho ứng dụng đài (biểu tượng và trình đơn thả xuống dùng trong ứng dụng đa phương tiện và đài tham chiếu):

<com.android.car.media.common.MediaAppSelectorWidget
    android:id="@+id/app_switch_container"
    android:layout_width="@dimen/app_switch_widget_width"
    android:layout_height="wrap_content"
    android:background="@drawable/app_item_background"
    android:gravity="center" />

Tiện ích này sẽ chạy AppSelectionFragment, hiển thị danh sách các nguồn nội dung nghe nhìn có thể chuyển sang. Nếu muốn có một giao diện người dùng khác với giao diện được cung cấp, bạn có thể tạo một tiện ích tuỳ chỉnh để chạy AppSelectionFragment khi trình chuyển đổi hiển thị.

AppSelectionFragment newFragment = AppSelectionFragment.create(widget,
            packageName, fullScreen);
    newFragment.show(mActivity.getSupportFragmentManager(), null);

Một cách triển khai mẫu được cung cấp trong cách triển khai ứng dụng đài phát thanh tham chiếu, nằm trong packages/apps/Car/Radio.

Thông số kỹ thuật chi tiết về chế độ điều khiển

Giao diện MediaSession (thông qua MediaSession.Callback) cung cấp các cơ chế điều khiển cho chương trình phát thanh đang phát:

  • onPlay, onStop. (Bật/tắt) tiếng phát đài.
  • onPause. Tạm dừng dịch chuyển thời gian (nếu được hỗ trợ).
  • onPlayFromMediaId. Phát bất kỳ nội dung nào trong thư mục cấp cao nhất. Ví dụ: "Phát FM" hoặc "Phát đài phát thanh".
  • onPlayFromUri. Phát một tần số cụ thể. Ví dụ: "Phát tần số 88,5 FM".
  • onSkipToNext, onSkipToPrevious. Chuyển sang đài tiếp theo hoặc đài trước.
  • onSetRating. Thêm hoặc xoá vào hoặc khỏi danh sách Ưa thích.

MediaBrowser hiển thị một MediaItem có thể điều chỉnh trên ba loại thư mục cấp cao nhất:

  • (Không bắt buộc) Chương trình (trạm). Chế độ này thường được dùng cho radio thu sóng kép để cho biết tất cả các đài phát thanh có thể điều chỉnh tại vị trí của người dùng.
  • Yêu thích. Các chương trình phát thanh được thêm vào danh sách Yêu thích, một số chương trình có thể không phát được (ngoài phạm vi thu sóng).
  • Kênh băng tần. Tất cả các tần số có thể phát sóng trong khu vực hiện tại (87,9, 88,1, 88,3, 88,5, 88,7, 88,9, 89,1, v.v.). Mỗi dải tần có một thư mục cấp cao nhất riêng.
Cấu trúc cây MediaBrowserService
Hình 2. Cấu trúc cây MediaBrowserService

Mỗi phần tử trong mỗi thư mục này (AM/FM/Chương trình) là một MediaItem có URI có thể được sử dụng với MediaSession để điều chỉnh. Mỗi thư mục cấp cao nhất (AM/FM/Chương trình) là một MediaItem có mediaId có thể được sử dụng với MediaSession để kích hoạt chế độ phát và tuỳ thuộc vào quyết định của OEM. Ví dụ: "Phát FM", "Phát AM" và "Phát đài phát thanh" đều là các truy vấn đài phát thanh không cụ thể sử dụng mediaId để gửi đến ứng dụng đài phát thanh của OEM. Ứng dụng đài phát thanh sẽ quyết định nội dung phát từ yêu cầu chung và mediaId.

MediaSession

Do không có khái niệm tạm dừng luồng phát sóng, nên các thao tác Phát, Tạm dừng và Dừng không phải lúc nào cũng áp dụng cho đài phát thanh. Với đài phát thanh, hành động Dừng được liên kết với việc tắt tiếng luồng phát trong khi hành động Phát được liên kết với việc bỏ chế độ tắt tiếng.

Một số bộ thu sóng (hoặc ứng dụng) có thể mô phỏng việc tạm dừng luồng phát sóng bằng cách lưu nội dung vào bộ nhớ đệm rồi phát lại sau. Trong những trường hợp như vậy, hãy sử dụng onPause.

Thao tác phát từ mediaId và URI nhằm điều chỉnh một đài phát thanh được tìm nạp từ giao diện MediaBrowser. mediaId là một chuỗi tuỳ ý do ứng dụng phát thanh cung cấp để áp đặt một giá trị duy nhất (vì vậy, một mã nhận dạng nhất định chỉ trỏ đến một mục) và ổn định (vì vậy, một mục nhất định có cùng mã nhận dạng trong toàn bộ phiên) để xác định một đài nhất định. URI sẽ có một giản đồ được xác định rõ ràng. Tóm lại, một dạng URI hoá của ProgramSelector. Mặc dù việc này giúp duy trì thuộc tính duy nhất, nhưng thuộc tính này không cần phải ổn định, mặc dù có thể thay đổi khi đài chuyển sang một tần số khác.

Theo thiết kế, onPlayFromSearch không được sử dụng. Ứng dụng khách (ứng dụng đồng hành) có trách nhiệm chọn một kết quả tìm kiếm từ cây MediaBrowser. Việc chuyển trách nhiệm đó sang ứng dụng đài sẽ làm tăng độ phức tạp, yêu cầu các hợp đồng chính thức về cách truy vấn chuỗi sẽ xuất hiện và dẫn đến trải nghiệm người dùng không đồng đều trên các nền tảng phần cứng khác nhau.

Lưu ý: Ứng dụng phát thanh không chứa thông tin bổ sung hữu ích để tìm kiếm tên đài không hiển thị với ứng dụng thông qua giao diện MediaBrowser.

Việc chuyển sang đài tiếp theo hoặc trước đó phụ thuộc vào ngữ cảnh hiện tại:

  • Khi một ứng dụng được điều chỉnh sang một đài trong danh sách Yêu thích, ứng dụng đó có thể chuyển sang đài tiếp theo trong danh sách Yêu thích.
  • Khi nghe một đài trong Danh sách chương trình, bạn có thể sẽ được chuyển sang đài tiếp theo có sẵn, được sắp xếp theo số kênh.
  • Việc nghe một kênh tuỳ ý có thể dẫn đến việc điều chỉnh sang kênh thực tế tiếp theo, ngay cả khi không có tín hiệu truyền tin.

Ứng dụng đài phát thanh sẽ xử lý các thao tác này.

Xử lý lỗi

Các thao tác TransportControls (Phát, Dừng và Tiếp theo) không cung cấp phản hồi về việc thao tác có thành công hay không. Cách duy nhất để cho biết lỗi là đặt trạng thái MediaSession thành STATE_ERROR kèm theo thông báo lỗi.

Ứng dụng đài phát thanh phải xử lý các hành động đó và thực thi hoặc đặt trạng thái lỗi. Nếu không thực thi lệnh Phát ngay lập tức, trạng thái phát phải được thay đổi thành STATE_CONNECTING (trong trường hợp điều chỉnh trực tiếp) hoặc STATE_SKIPPING_TO_PREVIOUS hoặc NEXT trong khi lệnh đang được thực thi.

Ứng dụng phải theo dõi PlaybackState và xác minh rằng phiên đã thay đổi chương trình hiện tại thành chương trình đã yêu cầu hoặc đã chuyển sang trạng thái lỗi. STATE_CONNECTING không được vượt quá 30 giây. Tuy nhiên, việc điều chỉnh trực tiếp đến một tần số AM/FM nhất định sẽ hoạt động nhanh hơn nhiều.

Thêm và xoá mục yêu thích

MediaSession có hỗ trợ phân loại, có thể dùng để kiểm soát mục Yêu thích. onSetRating được gọi bằng điểm xếp hạng thuộc loại RATING_HEART sẽ thêm hoặc xoá đài đang được điều chỉnh vào hoặc khỏi danh sách Yêu thích.

Ngược với các giá trị đặt trước cũ, mô hình này giả định một danh sách Favorites (Yêu thích) không theo thứ tự và không giới hạn, khi mỗi mục yêu thích đã lưu được phân bổ cho một vị trí số (thường là từ 1 đến 6). Do đó, các hệ thống dựa trên chế độ cài đặt trước sẽ không tương thích với thao tác onSetRating.

Hạn chế của API MediaSession là bạn chỉ có thể thêm hoặc xoá đài đang được điều chỉnh. Ví dụ: trước tiên, bạn phải chọn các mục thì mới có thể xoá các mục đó. Đây chỉ là hạn chế của ứng dụng MediaBrowser, chẳng hạn như một ứng dụng đồng hành. Ứng dụng đài phát thanh không bị hạn chế tương tự. Phần này là không bắt buộc khi ứng dụng không hỗ trợ tính năng Yêu thích.

MediaBrowser

Để thể hiện tần số hoặc tên kênh thực (khi điều chỉnh đến một kênh tuỳ ý phù hợp với một công nghệ vô tuyến nhất định) hợp lệ cho một khu vực nhất định, tất cả các kênh (tần số) hợp lệ đều được liệt kê cho mỗi băng tần. Ở khu vực Hoa Kỳ, điều này tương đương với 101 kênh FM trong dải tần số từ 87,8 đến 108,0 MHz (sử dụng khoảng cách 0,2 MHz) và 117 kênh AM trong dải tần số từ 530 đến 1700 kHz (sử dụng khoảng cách 10 kHz). Vì đài HD sử dụng cùng một không gian kênh, nên đài này không được trình bày riêng biệt.

Danh sách các chương trình phát thanh hiện có là danh sách phẳng vì không cho phép các lược đồ hiển thị như nhóm theo nhóm phát thanh trực tiếp (DAB).

Bạn có thể không điều chỉnh được các mục trong danh sách Yêu thích. Ví dụ: nếu một chương trình nhất định nằm ngoài phạm vi. Ứng dụng đài phát thanh có thể hoặc không thể phát hiện liệu có thể điều chỉnh trước mục nhập hay không. Nếu có, trình phát có thể không đánh dấu mục đó là có thể phát.

Để xác định các thư mục cấp cao nhất, chúng tôi áp dụng cùng một cơ chế mà Bluetooth sử dụng. Tức là gói Extras của đối tượng MediaDescription chứa một trường dành riêng cho bộ thu giống như Bluetooth với EXTRA_BT_FOLDER_TYPE. Trong trường hợp phát thanh truyền hình, điều này dẫn đến việc xác định các trường mới sau trong API công khai:

  • EXTRA_BCRADIO_FOLDER_TYPE = "android.media.extra.EXTRA_BCRADIO_FOLDER_TYPE". Một trong các giá trị sau:
    • BCRADIO_FOLDER_TYPE_PROGRAMS = 1. Các chương trình hiện có.
    • BCRADIO_FOLDER_TYPE_FAVORITES = 2. Mục yêu thích.
    • BCRADIO_FOLDER_TYPE_BAND = 3. Tất cả các kênh thực tế cho một băng tần nhất định.

    Bạn không cần xác định bất kỳ trường siêu dữ liệu tuỳ chỉnh nào dành riêng cho đài phát thanh, vì tất cả dữ liệu liên quan đều phù hợp với lược đồ MediaBrowser.MediaItem hiện có:

    • Tên chương trình (RDS PS, tên dịch vụ DAB). MediaDescription.getTitle.
    • Tần số FM. URI (xem ProgramSelector) hoặc MediaDescription.getTitle (nếu mục nhập nằm trong thư mục BROADCASTRADIO_FOLDER_TYPE_BAND).
    • Giá trị nhận dạng dành riêng cho đài phát thanh (RDS PI, DAB SId). MediaDescription.getMediaUri được phân tích cú pháp thành ProgramSelector.

    Thông thường, bạn không cần tìm nạp tần số FM cho một mục trong chương trình hiện tại hoặc danh sách Yêu thích (vì ứng dụng sẽ hoạt động trên mã nhận dạng nội dung nghe nhìn). Tuy nhiên, nếu cần thiết (ví dụ: cho mục đích hiển thị), URI sẽ xuất hiện trong URI và có thể được phân tích cú pháp thành ProgramSelector. Tuy nhiên, bạn không nên sử dụng URI để chọn các mục trong phiên hiện tại. Để biết thông tin chi tiết, hãy xem ProgramSelector.

    Để tránh các vấn đề về hiệu suất hoặc liên quan đến liên kết, dịch vụ MediaBrowser phải hỗ trợ phân trang:

    Lưu ý: Theo mặc định, tính năng phân trang được triển khai theo mặc định trong biến thể onLoadChildren() mà không xử lý các tuỳ chọn.

    Các mục liên quan từ tất cả các loại danh sách (kênh thô, chương trình tìm thấy và chương trình yêu thích) có thể có các mediaId khác nhau (tuỳ thuộc vào ứng dụng đài phát thanh; thư viện hỗ trợ sẽ có các mediaId khác nhau). URI (ở dạng ProgramSelector) khác nhau giữa các kênh thô và chương trình được tìm thấy trong hầu hết các trường hợp (ngoại trừ FM không có RDS), nhưng hầu hết giống nhau giữa các chương trình được tìm thấy và chương trình yêu thích (ngoại trừ, ví dụ: khi AF được cập nhật).

    Việc có các mediaId khác nhau cho các mục nhập từ các loại danh sách khác nhau cho phép bạn thực hiện các thao tác khác nhau trên các mục nhập đó. Bạn có thể duyệt qua danh sách Favorites (Yêu thích) hoặc danh sách All Programs (Tất cả chương trình) trên onSkipToNext, tuỳ thuộc vào thư mục của MediaItem đã chọn gần đây (xem MediaSession).

    Thao tác điều chỉnh đặc biệt

    Danh sách chương trình cho phép người dùng điều chỉnh sang một đài cụ thể, nhưng không cho phép người dùng đưa ra các yêu cầu chung như "Điều chỉnh sang FM". Điều này có thể dẫn đến việc điều chỉnh sang một đài đã nghe gần đây trên băng tần FM.

    Để hỗ trợ các thao tác như vậy, một số thư mục cấp cao nhất đã đặt cờ FLAG_PLAYABLE (cùng với FLAG_BROWSABLE cho thư mục).

    Thao tác Chỉnh đến Cách phát hành
    Phát đài Bất kỳ kênh phát thanh nào startService(ACTION_PLAY_BROADCASTRADIO)

    HOẶC,

    playFromMediaId(MediaBrowser.getRoot())
    Play FM Bất kỳ kênh FM nào Phát từ mediaId của băng tần FM.

    Việc xác định chương trình nào sẽ được điều chỉnh là tuỳ thuộc vào ứng dụng. Thông thường, đây là kênh được điều chỉnh gần đây nhất trong danh sách đã cho. Để biết thông tin chi tiết về ACTION_PLAY_BROADCASTRADIO, hãy xem phần Ý định chơi chung.

    Khám phá và kết nối dịch vụ

    PackageManager có thể trực tiếp tìm thấy cây phát thanh truyền hình phân phát MediaBrowserService. Để thực hiện việc này, hãy gọi resolveService bằng ý định ACTION_PLAY_BROADCASTRADIO (xem Ý định phát chung) và cờ MATCH_SYSTEM_ONLY. Để tìm tất cả dịch vụ phát thanh (có thể có nhiều dịch vụ; ví dụ: AM/FM và vệ tinh riêng biệt), hãy sử dụng queryIntentServices.

    Dịch vụ đã phân giải cũng xử lý ý định liên kết android.media.browse.MediaBrowserService. Thông tin này được xác minh bằng GTS.

    Để kết nối với MediaBrowserService đã chọn, hãy tạo thực thể MediaBrowser cho một thành phần dịch vụ và connect nhất định. Sau khi thiết lập kết nối, bạn có thể lấy một handle đến MediaSession thông qua getSessionToken.

    Ứng dụng Radio có thể hạn chế các gói ứng dụng khách được phép kết nối trong quá trình triển khai dịch vụ của ứng dụng đó bằng onGetRoot. Ứng dụng phải cho phép các ứng dụng hệ thống kết nối mà không cần đưa vào danh sách trắng. Để biết thông tin chi tiết về việc đưa vào danh sách trắng, hãy xem phần Chấp nhận gói và chữ ký của ứng dụng Trợ lý.

    Nếu ứng dụng dành riêng cho nguồn (ví dụ: ứng dụng đài phát thanh) được cài đặt trên một thiết bị không hỗ trợ nguồn đó, thì ứng dụng đó vẫn sẽ tự quảng cáo là xử lý ý định ACTION_PLAY_BROADCASTRADIO, nhưng cây MediaBrowser sẽ không chứa thẻ dành riêng cho đài phát thanh. Do đó, ứng dụng muốn kiểm tra xem một nguồn nhất định có trên thiết bị hay không, phải:

    1. Khám phá dịch vụ phát thanh (gọi resolveService cho ACTION_PLAY_BROADCASTRADIO).
    2. Tạo MediaBrowser rồi kết nối với MediaBrowser đó.
    3. Xác định sự hiện diện của MediaItem với EXTRA_BCRADIO_FOLDER_TYPE bổ sung.

    Lưu ý: Trong hầu hết trường hợp, ứng dụng phải quét tất cả các cây MediaBrowser hiện có để phát hiện tất cả các nguồn hiện có cho một thiết bị nhất định.

    Tên ban nhạc

    Danh sách ban nhạc được biểu thị bằng một tập hợp các thư mục cấp cao nhất có thẻ loại thư mục được đặt thành BCRADIO_FOLDER_TYPE_BAND. Tiêu đề của MediaItem là các chuỗi được bản địa hoá đại diện cho tên ban nhạc. Trong hầu hết các trường hợp, bản dịch sẽ giống với bản dịch tiếng Anh, nhưng ứng dụng không thể phụ thuộc vào giả định đó.

    Để cung cấp cơ chế ổn định cho việc tra cứu một số dải tần nhất định, một thẻ bổ sung sẽ được thêm vào các thư mục dải tần, EXTRA_BCRADIO_BAND_NAME_EN. Đây là tên chưa bản địa hoá của ban nhạc và chỉ có thể nhận một trong các giá trị được xác định trước sau đây:

    • AM
    • FM
    • DAB

    Nếu ban nhạc không có trong danh sách này, bạn không nên đặt thẻ tên ban nhạc. Tuy nhiên, nếu có trong danh sách, dải tần số đó phải được đặt thẻ. Đài phát thanh HD không liệt kê các băng tần riêng biệt vì sử dụng cùng một phương tiện cơ bản như AM/FM.

    Ý định chơi chung

    Mỗi ứng dụng chuyên phát một nguồn nhất định (chẳng hạn như đài phát thanh hoặc CD) phải xử lý ý định phát chung để bắt đầu phát một số nội dung có thể ở trạng thái không hoạt động (ví dụ: sau khi khởi động). Việc lựa chọn nội dung để phát là tuỳ thuộc vào ứng dụng, nhưng thường là chương trình phát thanh hoặc bản nhạc CD đã phát gần đây.Mỗi nguồn âm thanh sẽ có một ý định riêng được xác định:

    • android.car.intent.action.PLAY_BROADCASTRADIO
    • android.car.intent.action.PLAY_AUDIOCD: CD-DA hoặc CD-Text
    • android.car.intent.action.PLAY_DATADISC: Đĩa dữ liệu quang như CD/DVD, nhưng không phải CD-DA (có thể là CD ở chế độ kết hợp)
    • android.car.intent.action.PLAY_AUX: Không chỉ định cổng AUX nào
    • android.car.intent.action.PLAY_BLUETOOTH
    • android.car.intent.action.PLAY_USB: Không chỉ định thiết bị USB nào
    • android.car.intent.action.PLAY_LOCAL: Bộ nhớ phương tiện cục bộ (bộ nhớ flash tích hợp)

    Ý định được chọn để sử dụng cho lệnh phát chung, vì chúng giải quyết cùng lúc hai vấn đề: chính lệnh phát chung và việc khám phá dịch vụ. Lợi ích khác của việc có ý định như vậy là có thể thực thi hành động đơn giản đó mà không cần mở phiên MediaBrowser.

    Việc khám phá dịch vụ thực sự là vấn đề quan trọng hơn được giải quyết bằng các ý định này. Quy trình khám phá dịch vụ sẽ trở nên dễ dàng và rõ ràng hơn theo cách này (xem phần Khám phá và kết nối dịch vụ).

    Để giúp một số hoạt động triển khai ứng dụng dễ dàng hơn, có một cách thay thế để phát lệnh Play như vậy (ứng dụng đài cũng phải triển khai lệnh này): phát playFromMediaId bằng rootId của nút gốc (dùng làm mediaId). Mặc dù nút gốc không dùng để phát, nhưng rootId của nút này là một chuỗi tuỳ ý có thể được tạo để sử dụng dưới dạng mediaId. Tuy nhiên, ứng dụng không bắt buộc phải hiểu được sự khác biệt này.

    ProgramSelector

    Mặc dù mediaId là đủ để chọn một kênh từ MediaBrowserService, nhưng kênh này sẽ liên kết với một phiên và không nhất quán giữa các nhà cung cấp. Trong một số trường hợp, ứng dụng có thể cần con trỏ tuyệt đối (chẳng hạn như tần suất tuyệt đối) để duy trì con trỏ đó giữa các phiên và thiết bị.

    Trong thời đại phát sóng kỹ thuật số, tần số đơn thuần không đủ để điều chỉnh một đài cụ thể. Do đó, hãy sử dụng ProgramSelector để điều chỉnh sang kênh tương tự hoặc kỹ thuật số. ProgramSelector bao gồm hai phần:

    • Mã nhận dạng chính. Giá trị nhận dạng duy nhất và ổn định cho một đài phát thanh nhất định không thay đổi nhưng có thể không đủ để điều chỉnh đài phát thanh đó. Ví dụ: mã RDS PI có thể được dịch thành ký hiệu gọi ở Hoa Kỳ.
    • Mã nhận dạng phụ. Các giá trị nhận dạng bổ sung hữu ích để điều chỉnh đến đài đó (ví dụ: tần số), có thể bao gồm các giá trị nhận dạng từ các công nghệ phát thanh khác. Ví dụ: một đài DAB có thể có phương thức dự phòng phát sóng tương tự.

    Để cho phép ProgramSelector phù hợp với giải pháp dựa trên MediaBrowser hoặc MediaSession, hãy xác định giản đồ URI để chuyển đổi tuần tự giải pháp đó. Giản đồ được xác định như sau:

    broadcastradio://program/<primary ID type>/<primary ID>?
    <secondary ID type>=<secondary ID>&<secondary ID type>=<secondary ID>

    Trong ví dụ này, phần Giá trị nhận dạng phụ (sau dấu chấm hỏi (?)) là không bắt buộc và có thể bị xoá để cung cấp giá trị nhận dạng ổn định để sử dụng làm mediaId. Ví dụ:

    • broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=88500&AMFM_FREQUENCY=103300
    • broadcastradio://program/AMFM_FREQUENCY/102100
    • broadcastradio://program/DAB_SID_EXT/14895264?RDS_PI=1234

    Phần thẩm quyền (còn gọi là máy chủ lưu trữ) của program cung cấp một số không gian để mở rộng giao thức trong tương lai. Các chuỗi loại giá trị nhận dạng được chỉ định chính xác là tên của các chuỗi đó trong định nghĩa HAL 2.x của IdentifierType và định dạng giá trị là số thập phân hoặc thập lục phân (có tiền tố 0x).

    Tất cả giá trị nhận dạng theo nhà cung cấp đều được biểu thị bằng tiền tố VENDOR_. Ví dụ: VENDOR_0 cho VENDOR_STARTVENDOR_1 cho VENDOR_START cộng với 1. Các URI như vậy chỉ dành riêng cho phần cứng đài phát mà chúng được tạo và không thể chuyển giữa các thiết bị do các nhà sản xuất thiết bị gốc (OEM) khác nhau tạo ra.

    Bạn phải chỉ định các URI này cho từng MediaItem trong thư mục đài phát cấp cao nhất. Ngoài ra, MediaSession phải hỗ trợ cả playFromMediaIdplayFromUri. Tuy nhiên, URI chủ yếu dùng để trích xuất siêu dữ liệu radio (chẳng hạn như tần số FM) và bộ nhớ cố định. Không có gì đảm bảo rằng URI sẽ có sẵn cho tất cả các mục nội dung nghe nhìn (ví dụ: khi khung chưa hỗ trợ loại mã nhận dạng chính). Mặt khác, Mã nhận dạng nội dung nghe nhìn luôn hoạt động. Không nên khách hàng sử dụng URI để chọn các mục trong phiên MediaBrowser hiện tại. Thay vào đó, hãy sử dụng playFromMediaId. Tuy nhiên, ứng dụng phân phát không bắt buộc phải có URI và các URI bị thiếu được dành riêng cho các trường hợp được biện minh rõ ràng.

    Thiết kế ban đầu sử dụng một dấu hai chấm thay vì trình tự :// sau phần giao thức. Tuy nhiên, android.net.Uri không hỗ trợ URI dạng cũ cho các tham chiếu URI phân cấp tuyệt đối.

    Các loại nguồn khác

    Bạn có thể xử lý các nguồn âm thanh khác theo cách tương tự. Ví dụ: đầu vào phụ và trình phát CD âm thanh.

    Một ứng dụng có thể phân phát nhiều loại nguồn. Trong những trường hợp như vậy, bạn nên tạo một MediaBrowserService riêng cho từng loại nguồn. Ngay cả khi thiết lập với nhiều nguồn/MediaBrowserServices được phân phát, bạn nên có một MediaSession trong một ứng dụng.

    CD âm thanh

    Tương tự như đĩa CD âm thanh, ứng dụng phân phát các ổ đĩa như vậy sẽ hiển thị MediaBrowser bằng một mục có thể duyệt (hoặc nhiều mục nếu hệ thống có trình thay đổi đĩa CD). Đổi lại, mục này sẽ chứa tất cả các bản nhạc của một đĩa CD nhất định. Nếu hệ thống không có thông tin về các bản nhạc trên mỗi đĩa CD (ví dụ: khi tất cả các đĩa được chèn vào một hộp mực cùng một lúc và hệ thống không đọc được tất cả các đĩa), thì MediaItem cho toàn bộ đĩa sẽ chỉ là PLAYABLE, chứ không phải BROWSABLE cộng với PLAYABLE. Nếu không có ổ đĩa trong một khe nhất định, thì mục đó sẽ không phải là PLAYABLE hay BROWSABLE (nhưng mỗi khe phải luôn có trong cây).

     Cấu trúc cây của đĩa CD âm thanh
    Hình 3. Cấu trúc cây của đĩa CD âm thanh.

    Các mục này sẽ được đánh dấu theo cách tương tự như các thư mục phát thanh truyền hình; các mục này sẽ chứa các trường bổ sung được xác định trong API MediaDescription:

    • EXTRA_CD_TRACK: Đối với mỗi MediaItem trên đĩa CD âm thanh, số lượng bản nhạc dựa trên 1.
    • EXTRA_CD_DISK: Số đĩa dựa trên 1.

    Đối với hệ thống hỗ trợ CD-Text và ổ đĩa tương thích, MediaItem cấp cao nhất sẽ có tiêu đề của ổ đĩa. Tương tự, MediaItems cho các bản nhạc sẽ có tên của bản nhạc.

    Đầu vào phụ

    Ứng dụng phân phát đầu vào phụ hiển thị một cây MediaBrowser với một mục nhập (hoặc nhiều mục nhập khi có nhiều cổng) đại diện cho cổng AUX. MediaSession tương ứng sẽ lấy mediaId và chuyển sang nguồn đó sau khi nhận được yêu cầu playFromMediaId.

    Cấu trúc cây AUX
    Hình 4. Cấu trúc cây AUX.

    Mỗi mục MediaItem AUX sẽ có một trường bổ sung EXTRA_AUX_PORT_NAME được đặt thành tên không được bản địa hoá của cổng mà không có cụm từ "AUX". Ví dụ: "AUX 1" sẽ được đặt thành "1", "AUX front" thành "front" và "AUX" thành một chuỗi trống. Trong các ngôn ngữ không phải tiếng Anh, thẻ tên sẽ vẫn giữ nguyên chuỗi tiếng Anh. Không giống như đối với EXTRA_BCRADIO_BAND_NAME_EN, các giá trị này do OEM xác định và không bị ràng buộc vào một danh sách được xác định trước.

    Nếu phần cứng có thể phát hiện các thiết bị được kết nối với cổng AUX, thì phần cứng sẽ đánh dấu MediaItem là PLAYABLE, chỉ khi đầu vào được kết nối. Phần cứng vẫn phải được liệt kê (nhưng không phải PLAYABLE) nếu không có thiết bị nào được kết nối với cổng này. Nếu phần cứng không có khả năng như vậy, thì bạn phải luôn đặt MediaItem thành PLAYABLE.

    Các trường bổ sung

    Xác định các trường sau:

    • EXTRA_CD_TRACK = "android.media.extra.CD_TRACK"
    • EXTRA_CD_DISK = "android.media.extra.CD_DISK"
    • EXTRA_AUX_PORT_NAME = "android.media.extra.AUX_PORT_NAME"

    Ứng dụng cần xem xét các MediaItems cấp cao nhất cho các phần tử có trường bổ sung EXTRA_CD_DISK hoặc EXTRA_AUX_PORT_NAME.

    Ví dụ chi tiết

    Các ví dụ sau đây đề cập đến cấu trúc cây MediaBrowser cho các loại nguồn thuộc thiết kế này.

    Phát sóng đài MediaBrowserService (xử lý ACTION_PLAY_BROADCASTRADIO):

    • Đài (có thể xem)EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_PROGRAMS
      • URI BBC One (có thể phát): broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=90500
      • URI của ABC 88.1 (có thể phát): broadcastradio://program/RDS_PI/5678?AMFM_FREQUENCY=88100
      • URI của ABC 88.1 HD1 (có thể phát): broadcastradio://program/HD_STATION_ID_EXT/158241DEADBEEF?AMFM_FREQUENCY=88100&RDS_PI=5678
      • URI của ABC 88.1 HD2 (có thể phát): broadcastradio://program/HD_STATION_ID_EXT/158242DEADBEFE
      • 90.5 FM (có thể phát) – FM không có RDSURI: broadcastradio://program/AMFM_FREQUENCY/90500
      • URI 620 AM (có thể phát): broadcastradio://program/AMFM_FREQUENCY/620
      • URI BBC One (có thể phát): broadcastradio://program/DAB_SID_EXT/1E24102?RDS_PI=1234
    • Yêu thích (có thể xem, phát)EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_FAVORITES
      • URI BBC One (có thể phát): broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=101300
      • URI BBC Two (không phát được): broadcastradio://program/RDS_PI/1300?AMFM_FREQUENCY=102100
    • AM (có thể xem, có thể phát): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="AM"
      • URI 530 AM (có thể phát): broadcastradio://program/AMFM_FREQUENCY/530
      • URI 540 AM (có thể phát): broadcastradio://program/AMFM_FREQUENCY/540
      • URI 550 AM (có thể phát): broadcastradio://program/AMFM_FREQUENCY/550
    • FM (có thể xem, phát): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="FM"
      • URI 87,7 FM (có thể phát): broadcastradio://program/AMFM_FREQUENCY/87700
      • URI 87,9 FM (có thể phát): broadcastradio://program/AMFM_FREQUENCY/87900
      • URI 88,1 FM (có thể phát): broadcastradio://program/AMFM_FREQUENCY/88100
    • DAB (có thể phát): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="DAB"

    Audio CD MediaBrowserService (xử lý ACTION_PLAY_AUDIOCD):

    • Đĩa 1 (có thể phát) EXTRA_CD_DISK=1
    • Đĩa 2 (có thể xem, phát) EXTRA_CD_DISK=2
      • Bản nhạc 1 (có thể phát) EXTRA_CD_TRACK=1
      • Bản nhạc 2 (có thể phát) EXTRA_CD_TRACK=2
    • Đĩa nhạc của tôi (có thể xem, phát) EXTRA_CD_DISK=3
      • All By Myself (có thể phát) EXTRA_CD_TRACK=1
      • Reise, Reise (có thể phát) EXTRA_CD_TRACK=2
    • Khe 4 trống (không phát được) EXTRA_CD_DISK=4

    AUX MediaBrowserService (xử lý ACTION_PLAY_AUX):

    • AUX trước (có thể phát) EXTRA_AUX_PORT_NAME="front"
    • AUX sau (có thể phát) EXTRA_AUX_PORT_NAME="rear"