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

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

Cách triển khai cây duyệt nội dung nghe nhìn được cung cấp trong hỗ trợ car-broadcastradio- thư viện 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 thành và từ URI. Bạn nên triển khai đài hãy sử dụng thư viện này để tạo cây duyệt qua liên kết.

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

Để chuyển đổi liền mạch giữa đài phát và các ứng dụng khác hiển thị trong nội dung đa phương tiện, thư viện car-media-common chứa các lớp cần được tích hợp vào đài . MediaAppSelectorWidget có thể được đưa vào XML cho ứng dụng đài phát thanh (biểu tượng và trình đơn thả xuống được dùng trong các ứng dụng đài và phương tiện 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 chạy AppSelectionFragment, cho thấy một danh sách nguồn nội dung nghe nhìn có thể chuyển sang. Nếu muốn 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 tiện ích tuỳ chỉnh để chạy AppSelectionFragment khi trình chuyển đổi sẽ được hiển thị.

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

Một ví dụ về cách triển khai được cung cấp trong quá trình triển khai ứng dụng đài phát tham chiếu, đặt tại packages/apps/Car/Radio.

Thông số kỹ thuật kiểm soát chi tiết

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

  • onPlay, onStop. (Bật) tắt tiếng phát đài.
  • onPause. Chế độ tạm dừng dịch chuyển thời gian (nếu được hỗ trợ).
  • onPlayFromMediaId. Phát mọi nội dung trong thư mục cấp cao nhất. Ví dụ: "Phát FM" hoặc "Phát đài".
  • onPlayFromUri. Phát một tần suất cụ thể. Ví dụ: "Phát tần số 88.5 FM".
  • onSkipToNext, onSkipToPrevious. Chuyển tới sự kiện tiếp theo hoặc trước đó đài phát thanh.
  • onSetRating. Thêm hoặc xoá khỏi mục Yêu thích hoặc khỏi mục Yêu thích.

MediaBrowser cho thấy một MediaItem trên ba loại thư mục cấp cao nhất:

  • (Không bắt buộc) Chương trình (đài). Chế độ này thường được sử dụng bởi đài dò kép để cho biết tất cả các đài phát thanh có thể điều chỉnh được 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 hoạt động (ngoài phạm vi thu tín hiệu).
  • Kênh băng tần. Tất cả các kênh thực tế có thể sử dụ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 băng tần có một thư mục cấp cao nhất riêng biệt.
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/Programs) là một MediaItem có URI có thể dùng được bằng MediaSession để điều chỉnh. Mỗi thư mục cấp cao nhất (AM/FM/Programs) là một MediaItem có một mediaId có thể được sử dụng với MediaSession để kích hoạt phát lại và tuỳ thuộc vào quyết định của OEM. Để ví dụ: "Phát FM" "Phát nhạc SA," và "Phát đài" là tất cả các truy vấn radio không cụ thể sử dụng mediaId để gửi đến ứng dụng radio OEM. Ứng dụng phát thanh có thể quyết định nội dung sẽ phát từ yêu cầu chung và mediaId.

Phiên nội dung đa phương tiện

Vì không có khái niệm tạm dừng một 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. Với đài, hành động Dừng có liên quan đến việc tắt tiếng luồng trong khi Play liên quan đến việc loại bỏ tiếng.

Một số bộ dò (hoặc ứng dụng) đài phát thanh cung cấp khả năng 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.

Phát từ các hành động mediaId và URI để điều chỉnh đến một đài được tìm nạp từ giao diện MediaBrowser. MediaId là một chuỗi tuỳ ý do ứng dụng radio 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 trạm nhất định. URI sẽ có một giản đồ được xác định rõ. Tóm lại, việc được URI hoá biểu mẫu ProgramSelector. Mặc dù phương thức này giúp duy trì thuộc tính công khai, nhưng không cần thiết ổn định, mặc dù nó có thể thay đổi khi trạm chuyển sang tần số khác.

Theo thiết kế, onPlayFromSearch không được sử dụng. Là trách nhiệm của khách hàng (ứng dụng đồng hành) để chọn một kết quả tìm kiếm từ cây MediaBrowser. Di chuyển trách nhiệm đó đối với ứng dụng phát thanh sẽ làm tăng độ phức tạp, đòi hỏi phải có hợp đồng chính thức về cách các 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 phần cứng khác nhau nền tảng.

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

Việc chuyển đến đài tiếp theo hoặc đài phát trước đó sẽ phụ thuộc vào bối cảnh hiện tại:

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

Ứng dụng radio xử lý các thao tác này.

Xử lý lỗi

TransportControls các hành động (Phát, Dừng và Tiếp theo) không đưa ra ý kiến phản hồi về việc hành động đó có thành công hay không. Cách duy nhất để chỉ ra lỗi là đặt MediaSession chuyển trạng thái thành STATE_ERROR có thông báo lỗi.

Ứng dụng đài phải xử lý các thao tác đó rồi thực thi các thao tác đó hoặc đặt trạng thái lỗi. Nếu việc thực thi lệnh Play không diễn ra ngay lập tức, thì bạn phải thay đổi trạng thái phát thành STATE_CONNECTING (trong trường hợp chỉnh trực tiếp) hoặc STATE_SKIPPING_TO_PREVIOUS hoặc NEXT trong khi thực thi lệnh.

Khách hàng nên xem PlaybackState và xác minh rằng phiên này đã thay đổi chương trình hiện tại thành nội dung được yêu cầu hoặc được nhập vào trạng thái lỗi. STATE_CONNECTING không được vượt quá 30 giây. Tuy nhiên, một giai điệu trực tiếp vào một Tần số AM/FM sẽ hoạt động nhanh hơn nhiều.

Thêm và xoá thiết bị yêu thích

MediaSession có hỗ trợ xếp hạng, có thể được sử dụng để kiểm soát Mục yêu thích. onSetRating được gọi với một xếp hạng thuộc loại RATING_HEART thêm hoặc xoá đài phát hiện được điều chỉnh đến hoặc khỏi danh sách Ưa thích.

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

Hạn chế của API MediaSession là chỉ trạm hiện được điều chỉnh có thể được thêm hoặc bị xóa. Ví dụ: Bạn phải chọn các mục đầu tiên rồi mới bắt đầu có thể xóa được. Đây chỉ là một hạn chế của ứng dụng MediaBrowser, chẳng hạn như ứng dụng đồng hành. Ứng dụng radio cũng không bị hạn chế tương tự. Phần này là không bắt buộc khi một ứ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 dò) thành một kênh tuỳ ý phù hợp với một công nghệ vô tuyến cụ thể) có hiệu lực trong một khu vực nhất định, tất cả các kênh (tần suất) hợp lệ đều được liệt kê cho từng băng tần. Ở khu vực Hoa Kỳ, số lượng này lên tới 101 kênh FM trong khoảng từ 87,8 đến Phạm vi 108,0 MHz (sử dụng khoảng cách 0,2 MHz) và các kênh 117 AM trong phạm vi 530 đến 1700 kHz (sử dụng khoảng cách 10kHz). Vì đài phát HD sử dụng cùng một không gian kênh, biểu trưng 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ó nhưng không cho phép các giao thức hiển thị như nhóm theo tổ hợp phát sóng âm thanh trực tiếp (DAB).

Có thể không chỉnh sửa được các mục nhập trong danh sách Mục yêu thích. Ví dụ: nếu một cho ngoài phạm vi. Ứng dụng phát thanh có thể phát hiện hoặc không phát hiện xem mục nhập có thể được điều chỉnh đến trước. Nếu có, nút này có thể không đánh dấu là có thể phát.

Để xác định thư mục cấp cao nhất, cơ chế tương tự mà Bluetooth sử dụng cũng được áp dụng. Đó là gói Nội dung bổ sung của MediaDescription đối tượng chứa trường dành riêng cho bộ điều chỉnh giống như Bluetooth thực hiện với EXTRA_BT_FOLDER_TYPE. Đối với đài phát thanh, việc này dẫn đến việc xác định các trường mới sau đây trong API công khai:

  • EXTRA_BCRADIO_FOLDER_TYPE = "android.media.extra.EXTRA_BCRADIO_FOLDER_TYPE". Một trong số 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 cho một băng tần cụ thể.

    Không cần xác định bất kỳ trường siêu dữ liệu tuỳ chỉnh dành riêng cho đài phát thanh, vì tất cả dữ liệu có liên quan sẽ phù hợp với giao thứ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 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, không cần tìm nạp tần số FM cho mục nhập trên chương trình hiện tại hoặc danh sách Mục yêu thích (vì khách hàng sẽ hoạt động trên nội dung đa phương tiện mã nhận dạng). Tuy nhiên, nếu có nhu cầu đó (ví dụ: cho mục đích hiển thị), 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 giai đoạn phiên hoạt động. Để biết thông tin chi tiết, hãy xem ProgramSelector.

    Để tránh các vấn đề liên quan đến hiệu suất hoặc 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 onLoadChildren() biến thể không có tuỳ chọn xử lý.

    Mục nhập 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à ưa thích) có thể có nhiều mediaIds (tuỳ thuộc vào ứng dụng radio; hỗ trợ thư viện sẽ có mỗi loại khác nhau). Các URI (ở biểu mẫu ProgramSelector) khác nhau giữa các kênh và chương trình thô đượ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 gần như 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ụ: thời điểm cập nhật AF).

    Việc có mediaIds khác nhau cho các mục nhập từ các loại danh sách khác nhau tạo ra có thể áp dụng nhiều biện pháp đối với chúng. Bạn có thể truyền qua danh sách Ưa thích hoặc danh sách Tất cả chương trình trên onSkipToNext, tuỳ thuộc vào thư mục của MediaItem đã chọn (xem MediaSession).

    Thao tác tinh chỉnh đặc biệt

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

    Để hỗ trợ những thao tác này, một số thư mục cấp cao nhất có phương thức FLAG_PLAYABLE bộ cờ (cùng với FLAG_BROWSABLE) cho thư mục).

    Hành động Dò theo Cách cấp
    Phát đài Kênh phát thanh bất kỳ startService(ACTION_PLAY_BROADCASTRADIO)

    HOẶC

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

    Việc xác định chương trình cần điều chỉnh là tuỳ thuộc vào ứng dụng. Đây là thường là kênh được điều chỉnh gần đây nhất trong danh sách được cung cấp. Để biết thông tin chi tiết về ACTION_PLAY_BROADCASTRADIO, xem Ý đị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 MediaBrowserService phân phối đài phát sóng cây xanh. Để thực hiện việc này, hãy gọi resolveService với ý định ACTION_PLAY_BROADCASTRADIO (xem Ý định chơi chung) và Cờ MATCH_SYSTEM_ONLY. Để tìm tất cả các dịch vụ có cung cấp phát thanh (ở đây có thể có nhiều hơn một; ví dụ: riêng AM/FM và vệ tinh), hãy sử dụng queryIntentServices.

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

    Để kết nối với MediaBrowserService đã chọn, tạo Thực thể MediaBrowser cho một thành phần dịch vụ nhất định và connect. Sau khi thiết lập kết nối, bạn có thể lấy tên người dùng cho MediaSession 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 một onGetRoot triển khai dịch vụ của họ. Ứng dụng phải cho phép các ứng dụng hệ thống kết nối mà không có trong danh sách cho phép. Để biết chi tiết về danh sách cho phép, hãy xem Chấp nhận gói ứng dụng Trợ lý và chữ ký.

    Nếu ứng dụng dành riêng cho nguồn (ví dụ: ứng dụng phát thanh) được cài đặt trên không có sự hỗ trợ nguồn như vậy, nó 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. Do đó, khách hàng sẵn sàng kiểm tra xem một nguồn có sẵn trên một thiết bị, bạn phải:

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

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

    Tên nhóm nhạc

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

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

    • AM
    • FM
    • DAB

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

    Ý định chơi chung

    Mỗi ứng dụng dành riêng để phát nguồn nhất định (như đài hoặc CD) phải xử lý một ý định chơi chung là bắt đầu phát một số nội dung có thể từ trạng thái không hoạt động (ví dụ: sau khi khởi động). Cách chọn nội dung 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 được phát gần đây.Có một ý định được xác định cho từng nguồn âm thanh:

    • 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 học, CD/DVD, nhưng không phải CD-DA (có thể là CD ở chế độ hỗn hợp)
    • android.car.intent.action.PLAY_AUX: Không chỉ định Cổng AUX
    • android.car.intent.action.PLAY_BLUETOOTH
    • android.car.intent.action.PLAY_USB: Không chỉ định Thiết bị USB
    • android.car.intent.action.PLAY_LOCAL: Bộ nhớ phương tiện cục bộ (đèn flash tích hợp)

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

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

    Để một số triển khai ứng dụng dễ dàng hơn, có một cách thay thế tạo lệnh Play đó (việc này cũng phải được ứng dụng radio triển khai): cấp playFromMediaId bằng rootId của nút gốc (được dùng làm mediaId). Trong khi nút gốc không thể phát, mã gốc của mã này là một chuỗi tuỳ ý có thể được cung cấp để tiêu thụ dưới dạng mediaId. Tuy nhiên, khách hàng không bắt buộc để hiểu rõ vấn đề này.

    Bộ chọn chương trình

    Mặc dù mediaId là đủ để chọn một kênh từ MediaBrowserService, thì mục tiêu này sẽ bị ràng buộc 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 một con trỏ tuyệt đối (chẳng hạn như một tần suất tuyệt đối) để duy trì tần suất giữa các phiên và thiết bị.

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

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

    Để cho phép ProgramSelector khớp với MediaBrowser- hoặc Giải pháp dựa trên MediaSession, hãy xác định một giản đồ URI để chuyển đổi tuần tự. Giản đồ là đượ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ể xoá để cung cấp giá trị nhận dạng ổn định dùng dưới dạng 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

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

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

    Các URI này phải được gán cho từng MediaItem trong đài cấp cao nhất . Ngoài ra, MediaSession phải hỗ trợ cả playFromMediaIdplayFromUri. Tuy nhiên, URI chủ yếu dành cho radio trích xuất siêu dữ liệu (chẳng hạn như tần số FM) và lưu trữ liên tục. Không có đảm bảo URI sẽ có sẵn cho tất cả các mục nội dung đa phương tiện (ví dụ: khi Khung này chưa hỗ trợ loại mã nhận dạng). Mặt khác, Mã nhận dạng nội dung đa phương tiện luôn hoạt động. Ứng dụng không nên sử dụng URI để chọn các mục trên phiên MediaBrowser hiện tại. Thay vào đó, hãy sử dụng playFromMediaId. Điều đó có nghĩa là không phải là tuỳ chọn cho ứng dụng phân phát và URI bị thiếu là dành riêng cho các trường hợp hợp lý.

    Thiết kế ban đầu sử dụng một dấu hai chấm thay vì chuỗi :// sau phần lược đồ. Tuy nhiên, định dạng này không được hỗ trợ bởi android.net.Uri để tham chiếu URI phân cấp tuyệt đối.

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

    Các nguồn âm thanh khác cũng có thể được xử lý tương tự. Ví dụ: đầu vào phụ trợ 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ả trong một thiết lập có nhiều nguồn được phân phát/MediaBrowserServices, bạn nên có một MediaSession duy nhất trong một .

    CD âm thanh

    Tương tự như Audio CD (Đĩa CD âm thanh) ở chỗ ứng dụng phân phối các đĩa như vậy sẽ hiển thị MediaBrowser với một mục nhập có thể xem (hoặc nhiều mục khác, nếu hệ thống có Trình thay đổi đĩa CD), do đó 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 biết về các bản nhạc trên mỗi đĩa CD (ví dụ: khi tất cả các đĩa được cắm vào một hộp mực cùng một lúc và máy không đọc hết tất cả), sau đó 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 vị trí cụ thể, mục sẽ không phải là PLAYABLE hoặc BROWSABLE (nhưng mỗi vị trí phải luôn có trong cây).

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

    Những mục nhập này sẽ được đánh dấu theo cách tương tự như phát các thư mục radio là; chúng sẽ chứa các trường bổ sung được xác định trong MediaDescription API:

    • EXTRA_CD_TRACK: Đối với mỗi MediaItem trong CD âm thanh, Số 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ó tiêu đề của bản nhạc.

    Đầu vào phụ trợ

    Ứng dụng phân phát đầu vào phụ trợ sẽ hiển thị cây MediaBrowser với một mục nhập duy nhất (hoặc nhiều hơn, khi có nhiều cổng) biểu thị AUX trong cổng. 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 AUX MediaItem sẽ có thêm một trường EXTRA_AUX_PORT_NAME được đặt thành tên không được bản địa hoá của cổng không có "AUX" cụm từ tìm kiếm. Ví dụ: "AUX 1" sẽ được đặt thành "1", "AUX" phía trước" thành "phía trước" và "AUX" thành một chuỗi trống. Trong ngôn ngữ không phải tiếng Anh, tên này sẽ vẫn giữ nguyên chuỗi tiếng Anh. Không có khả năng như EXTRA_BCRADIO_BAND_NAME_EN, các giá trị do OEM xác định và không phải ràng buộc vào danh sách xác định trước.

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

    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"

    Khách hàng cần xem xét MediaItems cấp cao nhất để biết các phần tử có EXTRA_CD_DISK hoặc EXTRA_AUX_PORT_NAME trường bổ sung thiết lập.

    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 của thiết kế này.

    Truyền phát radio MediaBrowserService (xử lý ACTION_PLAY_BROADCASTRADIO):

    • Đài phát (có thể xem)EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_PROGRAMS
      • URI BBC One (có thể chơi): broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=90500
      • URI ABC 88.1 (có thể chơi): broadcastradio://program/RDS_PI/5678?AMFM_FREQUENCY=88100
      • URI ABC 88.1 HD1 (có thể phát): broadcastradio://program/HD_STATION_ID_EXT/158241DEADBEEF?AMFM_FREQUENCY=88100&RDS_PI=5678
      • URI 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 SA (có thể phát): broadcastradio://program/AMFM_FREQUENCY/620
      • URI BBC One (có thể chơi): broadcastradio://program/DAB_SID_EXT/1E24102?RDS_PI=1234
    • Mục yêu thích (có thể xem, có thể phát)EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_FAVORITES
      • URI BBC One (có thể chơi): broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=101300
      • URI của BBC Two (không phát được): broadcastradio://program/RDS_PI/1300?AMFM_FREQUENCY=102100
    • SA (có thể xem, có thể phát): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="AM"
      • URI 530 sáng (có thể phát): broadcastradio://program/AMFM_FREQUENCY/530
      • URI 540 SA (có thể phát): broadcastradio://program/AMFM_FREQUENCY/540
      • 550 SA (có thể phát) URI: broadcastradio://program/AMFM_FREQUENCY/550
    • FM (có thể xem, có thể 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, có thể 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, có thể phát) EXTRA_CD_DISK=3
      • Tự quay bản thân (có thể chơi) EXTRA_CD_TRACK=1
      • Reise, Reise (có thể chơi) EXTRA_CD_TRACK=2
    • Ô trống 4 (không phát được) EXTRA_CD_DISK=4

    AUX MediaBrowserService (xử lý ACTION_PLAY_AUX):

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