Implementasi kontrol radio

Implementasi kontrol radio didasarkan pada MediaSession dan MediaBrowse, yang memungkinkan aplikasi Media dan asisten suara mengontrol radio. Untuk informasi selengkapnya, lihat Membuat aplikasi media untuk mobil di developer.android.com.

Implementasi hierarki jelajah media disediakan di library car-broadcastradio-support di packages/apps/Car/libs. Library ini juga berisi ekstensi ProgramSelector untuk mengonversi ke dan dari URI. Sebaiknya implementasi radio menggunakan library ini untuk membuat hierarki penjelajahan terkait.

Pengalih sumber media

Untuk memberikan transisi yang lancar antara radio dan aplikasi lain yang ditampilkan di media, library car-media-common berisi class yang harus diintegrasikan ke dalam aplikasi radio. MediaAppSelectorWidget dapat disertakan dalam XML untuk aplikasi radio (ikon dan drop-down yang digunakan di media referensi dan aplikasi radio):

<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" />

Widget ini meluncurkan AppSelectionFragment, yang menampilkan daftar sumber media yang dapat dialihkan. Jika menginginkan UI selain yang disediakan, Anda dapat membuat widget kustom untuk meluncurkan AppSelectionFragment saat pengalih harus ditampilkan.

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

Contoh implementasi disediakan dalam implementasi aplikasi radio referensi, yang terletak di packages/apps/Car/Radio.

Spesifikasi kontrol mendetail

Antarmuka MediaSession (melalui MediaSession.Callback) menyediakan mekanisme kontrol untuk program radio yang sedang diputar:

  • onPlay, onStop. Membisukan (atau membunyikan) pemutaran radio.
  • onPause. Jeda dengan pergeseran waktu (jika didukung).
  • onPlayFromMediaId. Memutar konten apa pun dari folder tingkat teratas. Misalnya, "Putar FM" atau "Putar Radio".
  • onPlayFromUri. Memutar frekuensi tertentu. Misalnya, "Putar 88,5 FM".
  • onSkipToNext, onSkipToPrevious. Beralih ke stasiun berikutnya atau sebelumnya.
  • onSetRating. Menambahkan atau menghapus ke atau dari Favorit.

MediaBrowser mengekspos MediaItem yang dapat disesuaikan melalui tiga jenis direktori tingkat teratas:

  • (Opsional) Program (stasiun). Mode ini biasanya digunakan oleh radio tuner ganda untuk menunjukkan semua stasiun radio yang dapat disetel di lokasi pengguna.
  • Favorit. Program radio yang ditambahkan ke daftar Favorit, beberapa mungkin tidak tersedia (di luar jangkauan penerimaan).
  • Saluran band. Semua saluran yang secara fisik memungkinkan di wilayah saat ini (87,9, 88,1, 88,3, 88,5, 88,7, 88,9, 89,1, dan seterusnya). Setiap band memiliki direktori tingkat atas yang terpisah.
Struktur hierarki MediaBrowserService
Gambar 2. Struktur hierarki MediaBrowserService

Setiap elemen di setiap folder ini (AM/FM/Program) adalah MediaItem dengan URI yang dapat digunakan dengan MediaSession untuk menyetel. Setiap folder tingkat teratas (AM/FM/Program) adalah MediaItem dengan mediaId yang dapat digunakan dengan MediaSession untuk memicu pemutaran dan bergantung pada pertimbangan OEM. Misalnya, "Putar FM", "Putar AM", dan "Putar Radio" adalah kueri radio non-spesifik yang menggunakan mediaId untuk dikirim ke aplikasi radio OEM. Aplikasi radio yang menentukan apa yang akan diputar dari permintaan generik dan mediaId.

MediaSession

Karena tidak ada konsep untuk menjeda streaming siaran, tindakan Putar, Jeda, dan Hentikan tidak selalu berlaku untuk radio. Untuk radio, tindakan Berhenti dikaitkan dengan membisukan streaming sedangkan Putar dikaitkan dengan menghapus bisukan.

Beberapa tuner radio (atau aplikasi) menyediakan kemampuan untuk menyimulasikan jeda streaming siaran dengan menyimpan konten dalam cache, lalu memutarnya kembali nanti. Dalam kasus tersebut, gunakan onPause.

Memutar dari tindakan mediaId dan URI dimaksudkan untuk menyetel ke stasiun yang diambil dari antarmuka MediaBrowser. mediaId adalah string arbitrer yang disediakan oleh aplikasi radio untuk menerapkan nilai unik (sehingga ID tertentu hanya mengarah ke satu item) dan stabil (sehingga item tertentu memiliki ID yang sama selama seluruh sesi) yang digunakan untuk mengidentifikasi stasiun tertentu. URI akan memiliki skema yang ditentukan dengan baik. Singkatnya, bentuk ProgramSelector yang di-URI-kan. Meskipun mempertahankan atribut keunikan, atribut ini tidak perlu stabil, meskipun dapat berubah saat stasiun berpindah ke frekuensi yang berbeda.

Secara desain, onPlayFromSearch tidak digunakan. Klien (aplikasi pendamping) bertanggung jawab untuk memilih hasil penelusuran dari hierarki MediaBrowser. Memindahkan tanggung jawab tersebut ke aplikasi radio akan meningkatkan kompleksitas, memerlukan kontrak formal tentang cara kueri string muncul, dan menghasilkan pengalaman pengguna yang tidak merata di berbagai platform hardware.

Catatan: Aplikasi radio tidak berisi informasi tambahan yang akan berguna untuk menelusuri nama stasiun yang tidak ditampilkan kepada klien melalui antarmuka MediaBrowser.

Melewati ke stasiun berikutnya atau sebelumnya bergantung pada konteks saat ini:

  • Saat aplikasi disetel ke stasiun dari daftar Favorit, aplikasi dapat berpindah ke stasiun berikutnya dari daftar Favorit.
  • Mendengarkan stasiun dari Daftar program dapat menyebabkan penyesuaian ke stasiun berikutnya yang tersedia, yang diurutkan menurut nomor saluran.
  • Mendengarkan saluran arbitrer dapat menyebabkan penyesuaian ke saluran fisik berikutnya, meskipun tidak ada sinyal siaran.

Aplikasi radio menangani tindakan ini.

Penanganan error

Tindakan TransportControls (Putar, Hentikan, dan Berikutnya) tidak memberikan masukan tentang apakah tindakan berhasil atau tidak. Satu-satunya cara untuk menunjukkan error adalah dengan menetapkan status MediaSession ke STATE_ERROR dengan pesan error.

Aplikasi radio harus menangani tindakan tersebut dan menjalankannya atau menetapkan status error. Jika perintah Play tidak langsung dieksekusi, status pemutaran harus diubah menjadi STATE_CONNECTING (jika penyesuaian langsung) atau STATE_SKIPPING_TO_PREVIOUS atau NEXT saat perintah dieksekusi.

Klien harus memantau PlaybackState dan memverifikasi bahwa sesi mengubah program saat ini menjadi program yang diminta atau dimasukkan ke dalam status error. STATE_CONNECTING tidak boleh melebihi 30 detik. Namun, penyesuaian langsung ke frekuensi AM/FM tertentu akan berperforma jauh lebih cepat.

Menambahkan dan menghapus favorit

MediaSession memiliki dukungan rating, yang dapat digunakan untuk mengontrol Favorit. onSetRating yang dipanggil dengan rating jenis RATING_HEART menambahkan atau menghapus stasiun yang saat ini disetel ke atau dari daftar Favorit.

Berbeda dengan preset lama, model ini mengasumsikan daftar Favorit yang tidak diurutkan dan tidak terbatas, saat setiap favorit tersimpan dialokasikan ke slot numerik (biasanya, 1 hingga 6). Akibatnya, sistem berbasis preset tidak akan kompatibel dengan operasi onSetRating.

Batasan MediaSession API adalah hanya stasiun yang saat ini disetel yang dapat ditambahkan atau dihapus. Misalnya, item harus dipilih terlebih dahulu sebelum dapat dihapus. Ini hanya batasan klien MediaBrowser, seperti aplikasi pendamping. Aplikasi radio tidak dibatasi dengan cara yang sama. Bagian ini bersifat opsional jika aplikasi tidak mendukung Favorit.

MediaBrowser

Untuk menyatakan frekuensi atau nama saluran fisik mana (saat menyetel ke saluran arbitrer yang sesuai untuk teknologi radio tertentu) yang valid untuk wilayah tertentu, semua saluran (frekuensi) yang valid dicantumkan untuk setiap band. Di wilayah Amerika Serikat, jumlah ini mencapai 101 saluran FM dari rentang 87,8 hingga 108,0 MHz (menggunakan spasi 0,2 MHz) dan 117 saluran AM dalam rentang 530 hingga 1700 kHz (menggunakan spasi 10 kHz). Karena menggunakan ruang saluran yang sama, radio HD tidak ditampilkan secara terpisah.

Daftar program radio yang saat ini tersedia bersifat datar karena tidak memungkinkan skema tampilan seperti pengelompokan menurut ensemble siaran audio langsung (DAB).

Entri di daftar Favorit mungkin tidak dapat disesuaikan. Misalnya, jika program tertentu berada di luar rentang. Aplikasi radio dapat mendeteksi atau tidak mendeteksi apakah entri dapat disetel sebelumnya. Jika demikian, entri mungkin tidak ditandai sebagai dapat diputar.

Untuk mengidentifikasi folder tingkat teratas, mekanisme yang sama dengan yang digunakan oleh Bluetooth akan diterapkan. Artinya, paket Tambahan objek MediaDescription berisi kolom khusus tuner seperti yang dilakukan Bluetooth dengan EXTRA_BT_FOLDER_TYPE. Dalam kasus radio siaran, hal ini akan menentukan kolom baru berikut di API publik:

  • EXTRA_BCRADIO_FOLDER_TYPE = "android.media.extra.EXTRA_BCRADIO_FOLDER_TYPE". Salah satu nilai berikut:
    • BCRADIO_FOLDER_TYPE_PROGRAMS = 1. Program yang saat ini tersedia.
    • BCRADIO_FOLDER_TYPE_FAVORITES = 2. Favorit.
    • BCRADIO_FOLDER_TYPE_BAND = 3. Semua saluran fisik untuk band tertentu.

    Anda tidak perlu menentukan kolom metadata kustom khusus radio, karena semua data yang relevan sesuai dengan skema MediaBrowser.MediaItem yang ada:

    • Nama program (RDS PS, nama layanan DAB). MediaDescription.getTitle.
    • Frekuensi FM. URI (lihat ProgramSelector) atau MediaDescription.getTitle (jika entri ada di folder BROADCASTRADIO_FOLDER_TYPE_BAND).
    • ID khusus radio (RDS PI, DAB SId). MediaDescription.getMediaUri diuraikan ke ProgramSelector.

    Biasanya, tidak perlu mengambil frekuensi FM untuk entri di program saat ini atau daftar Favorit (karena klien harus beroperasi pada ID media). Namun, jika kebutuhan tersebut muncul (misalnya, untuk tujuan tampilan), kebutuhan tersebut akan ada di URI dan dapat diuraikan ke ProgramSelector. Meskipun demikian, sebaiknya URI tidak digunakan untuk memilih item dalam sesi saat ini. Untuk mengetahui detailnya, lihat ProgramSelector.

    Untuk menghindari masalah performa atau terkait binder, layanan MediaBrowser harus mendukung penomoran halaman:

    Catatan: Secara default, penomoran halaman diterapkan secara default dalam varian onLoadChildren() tanpa penanganan opsi.

    Entri terkait dari semua jenis daftar (channel mentah, program yang ditemukan, dan favorit) mungkin memiliki mediaId yang berbeda (tergantung aplikasi radio; library dukungan akan memiliki mediaId yang berbeda). URI (dalam bentuk ProgramSelector) berbeda antara saluran mentah dan program yang ditemukan dalam sebagian besar kasus (kecuali untuk FM tanpa RDS), tetapi sebagian besar sama antara program yang ditemukan dan favorit (kecuali, misalnya, saat AF diperbarui).

    Dengan memiliki mediaId yang berbeda untuk entri dari berbagai jenis daftar, Anda dapat mengambil tindakan yang berbeda pada entri tersebut. Anda dapat menjelajahi daftar Favorit atau daftar Semua Program di onSkipToNext, bergantung pada folder MediaItem yang baru saja dipilih (lihat MediaSession).

    Tindakan penyesuaian khusus

    Daftar program memungkinkan pengguna menyetel ke stasiun tertentu, tetapi tidak mengizinkan pengguna membuat permintaan umum seperti "Tune to FM", yang dapat menyebabkan penyetelan ke stasiun yang baru saja didengarkan di band FM.

    Untuk mendukung tindakan tersebut, beberapa direktori tingkat teratas memiliki flag FLAG_PLAYABLE yang ditetapkan (beserta FLAG_BROWSABLE untuk folder).

    Tindakan Menyetel ke Cara menerbitkan
    Putar radio Saluran radio apa pun startService(ACTION_PLAY_BROADCASTRADIO)

    ATAU,

    playFromMediaId(MediaBrowser.getRoot())
    Putar FM Saluran FM apa pun Putar dari mediaId band FM.

    Penentuan program yang akan di-tune bergantung pada aplikasi. Biasanya, program yang baru-baru ini di-tune ke saluran dari daftar yang diberikan. Untuk mengetahui detail tentang ACTION_PLAY_BROADCASTRADIO, lihat Intent pemutaran umum.

    Penemuan dan koneksi layanan

    PackageManager dapat langsung menemukan MediaBrowserService yang menayangkan hierarki radio siaran. Untuk melakukannya, panggil resolveService dengan intent ACTION_PLAY_BROADCASTRADIO (lihat Intent pemutaran umum) dan tanda MATCH_SYSTEM_ONLY. Untuk menemukan semua layanan yang menayangkan radio (mungkin ada lebih dari satu; misalnya, AM/FM dan satelit terpisah), gunakan queryIntentServices.

    Layanan yang di-resolve juga menangani intent binding android.media.browse.MediaBrowserService. Hal ini diverifikasi dengan GTS.

    Untuk terhubung ke MediaBrowserService yang dipilih, buat instance MediaBrowser untuk komponen layanan dan connect tertentu. Setelah membuat koneksi, handle ke MediaSession dapat diperoleh melalui getSessionToken.

    Aplikasi Radio dapat membatasi paket klien yang diizinkan untuk terhubung dalam implementasi onGetRoot layanan mereka. Aplikasi harus mengizinkan aplikasi sistem terhubung tanpa pemberian akses. Untuk mengetahui detail tentang daftar yang diizinkan, lihat Menerima paket dan tanda tangan aplikasi Asisten.

    Jika aplikasi khusus sumber (misalnya, aplikasi radio) diinstal di perangkat tanpa dukungan sumber tersebut, aplikasi akan tetap mengiklankan dirinya sebagai menangani intent ACTION_PLAY_BROADCASTRADIO, tetapi hierarki MediaBrowser-nya tidak akan berisi tag khusus radio. Dengan demikian, klien yang ingin memeriksa apakah sumber tertentu tersedia di perangkat harus:

    1. Temukan layanan radio (panggil resolveService untuk ACTION_PLAY_BROADCASTRADIO).
    2. Buat MediaBrowser, lalu hubungkan ke sana.
    3. Tentukan keberadaan MediaItem dengan EXTRA_BCRADIO_FOLDER_TYPE tambahan.

    Catatan: Pada umumnya, klien harus memindai semua hierarki MediaBrowser yang tersedia untuk mendeteksi semua sumber yang tersedia untuk perangkat tertentu.

    Nama band

    Daftar band diwakili oleh kumpulan direktori tingkat teratas dengan tag jenis folder yang ditetapkan ke BCRADIO_FOLDER_TYPE_BAND. Judul MediaItem-nya adalah string yang dilokalkan yang mewakili nama band. Dalam sebagian besar kasus, terjemahan tersebut akan sama dengan terjemahan bahasa Inggris, tetapi klien tidak dapat mengandalkan asumsi tersebut.

    Untuk memberikan mekanisme yang stabil guna mencari band tertentu, tag tambahan ditambahkan untuk folder band, EXTRA_BCRADIO_BAND_NAME_EN. Ini adalah nama band yang tidak dilokalkan dan hanya dapat menggunakan salah satu nilai standar berikut:

    • AM
    • FM
    • DAB

    Jika band tidak ada dalam daftar ini, tag nama band tidak boleh ditetapkan. Namun, jika band ada dalam daftar, band tersebut harus memiliki tag yang ditetapkan. Radio HD tidak menghitung band terpisah karena menggunakan media dasar yang sama dengan AM/FM.

    Intent pemutaran umum

    Setiap aplikasi yang didedikasikan untuk memutar sumber tertentu (seperti radio atau CD) harus menangani intent play umum untuk mulai memutar beberapa konten yang mungkin dari status tidak aktif (misalnya, setelah booting). Cara memilih konten untuk diputar bergantung pada aplikasi, tetapi biasanya program radio atau trek CD yang baru diputar.Ada intent terpisah yang ditentukan untuk setiap sumber audio:

    • android.car.intent.action.PLAY_BROADCASTRADIO
    • android.car.intent.action.PLAY_AUDIOCD: CD-DA atau CD-Text
    • android.car.intent.action.PLAY_DATADISC: Disk data optik seperti CD/DVD, tetapi bukan CD-DA (mungkin CD Mode Campuran)
    • android.car.intent.action.PLAY_AUX: Tanpa menentukan port AUX
    • android.car.intent.action.PLAY_BLUETOOTH
    • android.car.intent.action.PLAY_USB: Tanpa menentukan perangkat USB mana
    • android.car.intent.action.PLAY_LOCAL: Penyimpanan media lokal (flash bawaan)

    Intent dipilih untuk digunakan untuk perintah pemutaran umum, karena intent menyelesaikan dua masalah sekaligus: perintah pemutaran umum itu sendiri dan penemuan layanan. Manfaat tambahan dari memiliki intent tersebut adalah kemungkinan untuk menjalankan tindakan sederhana tersebut tanpa membuka sesi MediaBrowser.

    Penemuan layanan sebenarnya adalah masalah yang lebih penting yang dipecahkan dengan intent ini. Dengan cara ini, prosedur penemuan layanan menjadi mudah dan tidak ambigu (lihat Penemuan dan koneksi layanan).

    Untuk mempermudah beberapa implementasi klien, ada cara alternatif untuk mengeluarkan perintah Play tersebut (yang juga harus diimplementasikan oleh aplikasi radio): mengeluarkan playFromMediaId dengan rootId node root (digunakan sebagai mediaId). Meskipun node root tidak dimaksudkan untuk diputar, rootId-nya adalah string arbitrer yang dapat dibuat agar dapat digunakan sebagai mediaId. Namun, klien tidak diwajibkan untuk memahami nuansa ini.

    ProgramSelector

    Meskipun mediaId cukup untuk memilih saluran dari MediaBrowserService, saluran tersebut akan terikat dengan sesi dan tidak konsisten di antara penyedia. Dalam beberapa kasus, klien mungkin memerlukan pointer absolut (seperti frekuensi absolut) untuk mempertahankannya di antara sesi dan perangkat.

    Di era siaran radio digital, frekuensi saja tidak cukup untuk menyetel ke stasiun tertentu. Oleh karena itu, gunakan ProgramSelector untuk menyetel ke saluran analog atau digital. ProgramSelector terdiri dari dua bagian:

    • ID utama. ID unik dan stabil untuk stasiun radio tertentu yang tidak berubah, tetapi mungkin tidak cukup untuk menyetel ke stasiun tersebut. Misalnya, kode PI RDS, yang dapat diterjemahkan ke tanda panggil di AS.
    • ID sekunder. ID tambahan yang berguna untuk menyetel ke stasiun tersebut (misalnya, frekuensi), mungkin termasuk ID dari teknologi radio lainnya. Misalnya, stasiun DAB mungkin memiliki penggantian siaran analog.

    Agar ProgramSelector sesuai dengan solusi berbasis MediaBrowser atau MediaSession, tentukan skema URI untuk melakukan serialisasi. Skema ditentukan sebagai berikut:

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

    Dalam contoh ini, bagian ID sekunder (setelah tanda tanya (?)) bersifat opsional dan dapat dihapus untuk memberikan ID yang stabil untuk digunakan sebagai mediaId. Contoh:

    • 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

    Bagian otoritas (AKA host) dari program menyediakan beberapa ruang untuk ekstensi skema pada masa mendatang. String jenis ID ditentukan dengan tepat sebagai namanya dalam definisi IdentifierType HAL 2.x dan format nilainya adalah angka desimal atau heksadesimal (dengan awalan 0x).

    Semua ID khusus vendor diwakili oleh awalan VENDOR_. Misalnya, VENDOR_0 untuk VENDOR_START dan VENDOR_1 untuk VENDOR_START ditambah 1. URI tersebut khusus untuk hardware radio tempat URI tersebut dibuat dan tidak dapat ditransfer antar-perangkat yang dibuat oleh OEM yang berbeda.

    URI ini harus ditetapkan ke setiap MediaItem di folder radio tingkat teratas. Selain itu, MediaSession harus mendukung playFromMediaId dan playFromUri. Namun, URI ini terutama ditujukan untuk ekstraksi metadata radio (seperti frekuensi FM) dan penyimpanan persisten. Tidak ada jaminan bahwa URI akan tersedia untuk semua item media (misalnya, jika jenis ID utama belum didukung oleh framework). Di sisi lain, ID Media selalu berfungsi. Klien tidak direkomendasikan untuk menggunakan URI guna memilih item dari sesi MediaBrowser saat ini. Sebagai gantinya, gunakan playFromMediaId. Meskipun demikian, hal ini tidak bersifat opsional untuk aplikasi penayangan dan URI yang tidak ada dicadangkan untuk kasus yang dibenarkan dengan baik.

    Desain awal menggunakan satu titik dua, bukan urutan :// setelah bagian skema. Namun, yang pertama tidak didukung oleh android.net.Uri untuk referensi URI hierarkis absolut.

    Jenis sumber lainnya

    Sumber audio lainnya dapat ditangani dengan cara yang sama. Misalnya, input tambahan dan pemutar Audio CD.

    Satu aplikasi dapat menayangkan beberapa jenis sumber. Dalam kasus tersebut, sebaiknya Anda membuat MediaBrowserService terpisah untuk setiap jenis sumber. Bahkan dalam penyiapan dengan beberapa sumber/MediaBrowserService yang ditayangkan, sebaiknya gunakan satu MediaSession dalam satu aplikasi.

    CD Audio

    Mirip dengan Audio CD karena aplikasi yang menayangkan disk tersebut akan mengekspos MediaBrowser dengan satu entri yang dapat dijelajahi (atau lebih, jika sistem memiliki pengubah CD), yang pada akhirnya akan berisi semua trek dari CD tertentu. Jika sistem tidak memiliki pengetahuan tentang trek di setiap CD (misalnya, saat semua disk dimasukkan ke dalam kartrid sekaligus dan tidak membaca semuanya), maka MediaItem untuk seluruh disk hanya akan berupa PLAYABLE, bukan BROWSABLE plus PLAYABLE. Jika tidak ada disk di slot tertentu, item tersebut tidak akan berupa PLAYABLE atau BROWSABLE (tetapi setiap slot harus selalu ada dalam hierarki).

     Struktur hierarki CD audio
    Gambar 3. Struktur hierarki CD Audio.

    Entri ini akan ditandai dengan cara yang sama seperti folder radio siaran; entri ini akan berisi kolom tambahan tambahan yang ditentukan di MediaDescription API:

    • EXTRA_CD_TRACK: Untuk setiap MediaItem di Audio CD, nomor trek berbasis 1.
    • EXTRA_CD_DISK: Nomor disk berbasis 1.

    Untuk sistem yang mengaktifkan CD-Text dan disk yang kompatibel, MediaItem tingkat atas akan memiliki judul disk. Demikian pula, MediaItems untuk trek akan memiliki judul trek.

    Input tambahan

    Aplikasi yang menayangkan input tambahan mengekspos hierarki MediaBrowser dengan satu entri (atau lebih, jika ada beberapa port) yang mewakili port AUX in. MediaSession masing-masing mengambil mediaId dan beralih ke sumber tersebut setelah mendapatkan permintaan playFromMediaId.

    Struktur hierarki AUX
    Gambar 4. Struktur hierarki AUX.

    Setiap entri MediaItem AUX akan memiliki kolom tambahan EXTRA_AUX_PORT_NAME yang ditetapkan ke nama port yang tidak dilokalkan tanpa frasa "AUX". Misalnya, "AUX 1" akan disetel ke "1", "AUX depan" ke "depan", dan "AUX" ke string kosong. Di lokalitas non-Inggris, tag nama akan tetap berupa string bahasa Inggris yang sama. Tidak seperti EXTRA_BCRADIO_BAND_NAME_EN, nilai ditentukan oleh OEM dan tidak dibatasi pada daftar yang telah ditentukan.

    Jika hardware dapat mendeteksi perangkat yang terhubung ke port AUX, hardware harus menandai MediaItem sebagai PLAYABLE, hanya jika input terhubung. Hardware harus tetap dihitung (tetapi bukan PLAYABLE) jika tidak ada yang terhubung ke port ini. Jika hardware tidak memiliki kemampuan tersebut, MediaItem harus selalu disetel ke PLAYABLE.

    Kolom tambahan

    Tentukan kolom berikut:

    • 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"

    Klien perlu meninjau MediaItems tingkat teratas untuk elemen yang memiliki kolom tambahan EXTRA_CD_DISK atau EXTRA_AUX_PORT_NAME yang ditetapkan.

    Contoh mendetail

    Contoh berikut membahas struktur hierarki MediaBrowser untuk jenis sumber yang merupakan bagian dari desain ini.

    MediaBrowserService radio siaran (menangani ACTION_PLAY_BROADCASTRADIO):

    • Stasiun (dapat dijelajahi)EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_PROGRAMS
      • URI BBC One (dapat diputar): broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=90500
      • URI ABC 88.1 (dapat diputar): broadcastradio://program/RDS_PI/5678?AMFM_FREQUENCY=88100
      • URI ABC 88.1 HD1 (dapat diputar): broadcastradio://program/HD_STATION_ID_EXT/158241DEADBEEF?AMFM_FREQUENCY=88100&RDS_PI=5678
      • URI ABC 88.1 HD2 (dapat diputar): broadcastradio://program/HD_STATION_ID_EXT/158242DEADBEFE
      • 90,5 FM (dapat diputar) - FM tanpa RDSURI: broadcastradio://program/AMFM_FREQUENCY/90500
      • URI 620 AM (dapat diputar): broadcastradio://program/AMFM_FREQUENCY/620
      • URI BBC One (dapat diputar): broadcastradio://program/DAB_SID_EXT/1E24102?RDS_PI=1234
    • Favorit (dapat dijelajahi, dapat diputar)EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_FAVORITES
      • URI BBC One (dapat diputar): broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=101300
      • URI BBC Two (tidak dapat diputar): broadcastradio://program/RDS_PI/1300?AMFM_FREQUENCY=102100
    • AM (dapat dijelajahi, dapat diputar): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="AM"
      • 530 AM (playable) URI: broadcastradio://program/AMFM_FREQUENCY/530
      • URI 540 AM (dapat diputar): broadcastradio://program/AMFM_FREQUENCY/540
      • URI 550 AM (dapat diputar): broadcastradio://program/AMFM_FREQUENCY/550
    • FM (dapat dijelajahi, dapat diputar): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="FM"
      • URI 87,7 FM (dapat diputar): broadcastradio://program/AMFM_FREQUENCY/87700
      • URI 87,9 FM (dapat diputar): broadcastradio://program/AMFM_FREQUENCY/87900
      • URI 88,1 FM (dapat diputar): broadcastradio://program/AMFM_FREQUENCY/88100
    • DAB (dapat diputar): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="DAB"

    MediaBrowserService CD Audio (menangani ACTION_PLAY_AUDIOCD):

    • Disk 1 (dapat diputar) EXTRA_CD_DISK=1
    • Disk 2 (dapat dijelajahi, dapat diputar) EXTRA_CD_DISK=2
      • Trek 1 (dapat diputar) EXTRA_CD_TRACK=1
      • Trek 2 (dapat diputar) EXTRA_CD_TRACK=2
    • CD musik saya (dapat dijelajahi, dapat diputar) EXTRA_CD_DISK=3
      • All By Myself (dapat dimainkan) EXTRA_CD_TRACK=1
      • Reise, Reise (dapat dimainkan) EXTRA_CD_TRACK=2
    • Slot kosong 4 (tidak dapat diputar) EXTRA_CD_DISK=4

    MediaBrowserService AUX (menangani ACTION_PLAY_AUX):

    • AUX depan (dapat diputar) EXTRA_AUX_PORT_NAME="front"
    • AUX belakang (dapat diputar) EXTRA_AUX_PORT_NAME="rear"