Implementasi Radio

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

Implementasi pohon jelajah media disediakan di perpustakaan dukungan radio-car-broadcast dalam packages/apps/Car/libs . Pustaka ini juga berisi ekstensi ProgramSelector untuk dikonversi ke dan dari URI. Direkomendasikan agar implementasi radio menggunakan pustaka ini untuk membangun pohon penelusuran terkait.

Pengalih Sumber Media

Untuk memberikan transisi yang mulus antara radio dan aplikasi lain yang ditampilkan di media, perpustakaan umum-media-mobil berisi kelas-kelas yang harus diintegrasikan ke dalam aplikasi radio. MediaAppSelectorWidget dapat disertakan dalam XML untuk aplikasi radio (ikon dan tarik-turun 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 diinginkan UI selain yang disediakan, Anda dapat membuat widget khusus 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 Rinci

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

  • onPlay , onStop . (Aktifkan) pemutaran radio tanpa suara.
  • onPause . Jeda dengan pergeseran waktu (jika didukung).
  • onPlayFromMediaId . Putar konten apa pun dari folder tingkat atas. Misalnya, "Putar FM" atau "Putar Radio".
  • onPlayFromUri . Mainkan frekuensi tertentu. Misalnya, "Mainkan 88,5 FM".
  • onSkipToNext , onSkipToPrevious . Tune ke stasiun berikutnya atau sebelumnya.
  • onSetRating . Tambahkan atau hapus ke atau dari Favorit.

MediaBrowser memperlihatkan MediaItem yang dapat disetel melalui tiga jenis direktori tingkat atas:

  • ( Opsional ) Program (stasiun). Mode ini biasanya digunakan oleh radio penyetel ganda untuk menunjukkan semua stasiun radio yang dapat disetel yang tersedia di lokasi pengguna.
  • Favorit. Program radio ditambahkan ke daftar Favorit, beberapa mungkin tidak tersedia (di luar jangkauan penerimaan).
  • saluran pita. Semua saluran yang memungkinkan secara fisik 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 pohon MediaBrowserService
Gambar 1. Struktur pohon MediaBrowserService

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

MediaSesi

Mengingat tidak ada konsep menjeda aliran siaran, tindakan Putar, Jeda, dan Hentikan tidak selalu berlaku untuk radio. Dengan radio, tindakan Hentikan dikaitkan dengan mematikan aliran sementara Putar dikaitkan dengan menghapus sunyi.

Beberapa penyetel radio (atau aplikasi) menyediakan kemampuan untuk menyimulasikan jeda aliran siaran dengan menyimpan konten dalam cache, lalu memutarnya kembali nanti. Dalam kasus seperti itu, gunakan onPause .

Pemutaran 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 memaksakan nilai unik (sehingga ID yang diberikan hanya menunjuk ke satu item) dan stabil (sehingga item tertentu memiliki ID yang sama melalui seluruh sesi) yang dapat digunakan untuk mengidentifikasi stasiun tertentu . URI akan menjadi skema yang terdefinisi dengan baik. Singkatnya, bentuk ProgramSelector berukuran URI. Sementara ini mempertahankan atribut uniquity, itu tidak perlu stabil, meskipun dapat berubah ketika stasiun bergerak ke frekuensi yang berbeda.

Secara desain, onPlayFromSearch tidak digunakan. Adalah tanggung jawab klien (aplikasi pendamping) untuk memilih hasil pencarian dari pohon MediaBrowser. Memindahkan tanggung jawab tersebut ke aplikasi radio akan meningkatkan kerumitan, memerlukan kontrak formal tentang bagaimana kueri string akan muncul, dan menghasilkan pengalaman pengguna yang tidak merata pada platform perangkat keras yang berbeda.

Catatan: Aplikasi radio tidak berisi informasi tambahan yang berguna untuk mencari nama stasiun yang tidak diekspos ke klien melalui antarmuka MediaBrowser.

Melompat ke stasiun berikutnya atau sebelumnya tergantung pada konteks saat ini:

  • Saat aplikasi disetel ke stasiun dari daftar Favorit, aplikasi dapat pindah ke stasiun berikutnya dari daftar Favorit.
  • Mendengarkan stasiun dari daftar Program dapat mengakibatkan penyetelan ke stasiun berikutnya yang tersedia, diurutkan menurut nomor saluran.
  • Mendengarkan saluran sewenang-wenang dapat mengakibatkan penyetelan ke saluran fisik berikutnya, bahkan ketika tidak ada sinyal siaran.

Aplikasi radio menangani tindakan ini.

Penanganan Kesalahan

Tindakan TransportControls (Mainkan, Berhenti, dan Berikutnya) tidak memberikan umpan balik apakah tindakan berhasil atau tidak. Satu-satunya cara untuk menunjukkan kesalahan adalah dengan menyetel status MediaSession ke STATE_ERROR dengan pesan kesalahan.

Aplikasi radio harus menangani tindakan tersebut dan menjalankannya atau menyetel status kesalahan. Jika menjalankan perintah Putar tidak segera, status pemutaran harus diubah ke STATE_CONNECTING (dalam hal penyetelan langsung) atau STATE_SKIPPING_TO_PREVIOUS / NEXT saat perintah sedang dijalankan.

Klien harus menonton PlaybackState dan memverifikasi bahwa sesi tersebut mengubah program saat ini menjadi apa yang diminta atau dimasukkan ke dalam status kesalahan. STATE_CONNECTING tidak boleh lebih dari 30 detik. Namun nada langsung ke frekuensi AM/FM yang diberikan akan bekerja lebih cepat.

Menambah dan Menghapus Favorit

MediaSession memiliki dukungan peringkat, yang dapat digunakan untuk mengontrol Favorit. onSetRating dipanggil dengan peringkat tipe RATING_HEART menambah atau menghapus stasiun yang sedang disetel ke atau dari daftar Favorit.

Berlawanan dengan prasetel lama, model ini mengasumsikan daftar Favorit yang tidak berurutan dan tidak terbatas, ketika setiap favorit yang disimpan 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 juga tidak dibatasi. Bagian ini opsional jika aplikasi tidak mendukung Favorit.

Peramban Media

Untuk menyatakan frekuensi atau nama saluran fisik mana (ketika menyetel saluran sembarang yang cocok untuk teknologi radio tertentu) yang valid untuk wilayah tertentu, semua saluran (frekuensi) yang valid dicantumkan untuk setiap pita. Di wilayah AS, ini berjumlah 101 saluran FM dari kisaran 87,8 hingga 108,0 MHz (menggunakan jarak 0,2MHz) dan saluran 117 AM dalam kisaran 530 hingga 1700 kHz (menggunakan jarak 10kHz). Karena radio HD menggunakan ruang saluran yang sama, maka tidak disajikan secara terpisah.

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

Entri pada daftar Favorit mungkin tidak dapat disetel. Misalnya jika program yang diberikan di luar jangkauan. Aplikasi radio mungkin atau mungkin tidak mendeteksi apakah entri dapat disetel sebelumnya. Jika demikian, itu mungkin tidak menandai entri sebagai dapat dimainkan.

Untuk mengidentifikasi folder tingkat atas, mekanisme yang sama yang digunakan oleh Bluetooth diterapkan. Artinya, bundel Ekstra dari objek MediaDescription berisi bidang khusus tuner seperti halnya Bluetooth dengan EXTRA_BT_FOLDER_TYPE . Dalam kasus radio siaran, ini mengarah pada penentuan bidang baru berikut di API publik:

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

    Tidak perlu menentukan bidang metadata khusus khusus radio, karena semua data yang relevan cocok 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 ).
    • Pengidentifikasi khusus radio (RDS PI, DAB SId). MediaDescription.getMediaUri diuraikan ke ProgramSelector.

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

    Untuk menghindari masalah terkait kinerja atau pengikat, layanan MediaBrowser harus mendukung pagination:

    Catatan: Secara default, pagination diimplementasikan secara default dalam varian onLoadChildren() tanpa penanganan opsi.

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

    Memiliki mediaId yang berbeda untuk entri dari berbagai jenis daftar memungkinkan untuk mengambil tindakan yang berbeda pada mereka. Anda dapat menelusuri daftar Favorit atau daftar Semua Program di onSkipToNext , tergantung pada folder MediaItem yang baru saja dipilih (lihat MediaSession ).

    Tindakan nada khusus

    Daftar program memungkinkan pengguna untuk menyetel ke stasiun tertentu, tetapi tidak mengizinkan pengguna untuk membuat permintaan umum seperti "menyetel ke FM", yang dapat mengakibatkan penyetelan ke stasiun yang baru saja didengarkan pada pita FM.

    Untuk mendukung tindakan tersebut, beberapa direktori tingkat atas memiliki set flag FLAG_PLAYABLE (bersama dengan FLAG_BROWSABLE untuk folder).

    Tindakan Lagu untuk Bagaimana cara mengeluarkan
    Putar radio Setiap saluran radio startService(ACTION_PLAY_BROADCASTRADIO)
    atau playFromMediaId(MediaBrowser. getRoot() )
    Mainkan FM Semua saluran FM Putar dari mediaId band FM

    Penentuan program mana yang akan disetel tergantung pada aplikasi. Ini biasanya saluran yang paling baru disetel dari daftar yang diberikan. Untuk detail tentang ACTION_PLAY_BROADCASTRADIO , lihat Maksud pemutaran umum .

    Penemuan dan koneksi layanan

    PackageManager dapat langsung menemukan MediaBrowserService yang menyajikan pohon radio siaran. Untuk melakukannya, panggil resolveService dengan intent ACTION_PLAY_BROADCASTRADIO (lihat General play intents ) dan flag MATCH_SYSTEM_ONLY . Untuk menemukan semua layanan yang melayani radio (mungkin ada lebih dari satu, misalnya AM/FM dan satelit terpisah), gunakan queryIntentServices .

    Layanan yang diselesaikan akan menangani maksud pengikatan android.media.browse.MediaBrowserService juga. Ini diverifikasi dengan GTS.

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

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

    Jika aplikasi khusus sumber (misalnya, aplikasi radio) dipasang pada perangkat tanpa dukungan sumber tersebut, aplikasi tersebut akan tetap mengiklankan dirinya sebagai menangani maksud ACTION_PLAY_BROADCASTRADIO , tetapi pohon MediaBrowser-nya tidak akan berisi tag khusus radio. Jadi, klien yang ingin memeriksa apakah sumber tertentu tersedia di perangkat, harus:

    1. Temukan layanan radio (panggil resolveService untuk ACTION_PLAY_BROADCASTRADIO ).
    2. Buat MediaBrowser untuk itu dan kemudian sambungkan ke sana.
    3. Tentukan keberadaan MediaItem dengan ekstra EXTRA_BCRADIO_FOLDER_TYPE .

    Catatan: Dalam kebanyakan kasus, klien harus memindai semua pohon MediaBrowser yang tersedia untuk mendeteksi semua sumber yang tersedia untuk perangkat tertentu.

    Nama band

    Daftar pita diwakili oleh satu set direktori tingkat atas dengan tag tipe folder yang disetel ke BCRADIO_FOLDER_TYPE_BAND . Judul MediaItem mereka adalah string lokal yang mewakili nama band. Dalam kebanyakan kasus itu akan sama dengan terjemahan bahasa Inggris, tetapi klien tidak dapat bergantung pada asumsi itu.

    Untuk menyediakan mekanisme yang stabil untuk mencari pita tertentu, tag tambahan ditambahkan untuk folder pita: EXTRA_BCRADIO_BAND_NAME_EN . Ini adalah nama band yang tidak dilokalkan dan hanya dapat mengambil salah satu dari nilai yang telah ditentukan ini:

    • AM
    • FM
    • DAB
    • SXM

    Jika band tidak ada dalam daftar ini, tag nama band tidak boleh disetel. Namun, jika band ada dalam daftar, itu harus memiliki set tag. Radio HD tidak memiliki pita terpisah yang disebutkan karena menggunakan media dasar yang sama seperti AM/FM.

    Maksud bermain umum

    Setiap aplikasi yang didedikasikan untuk memutar sumber tertentu (seperti radio atau CD) harus menangani maksud pemutaran umum, untuk mulai memutar beberapa konten yang mungkin dari status tidak aktif (misalnya, setelah boot). Terserah aplikasi bagaimana memilih konten untuk diputar, tetapi biasanya program radio atau trek CD yang baru saja diputar.
    Ada maksud terpisah yang ditentukan untuk setiap sumber audio:

    • android.car.intent.action.PLAY_BROADCASTRADIO
    • android.car.intent.action.PLAY_AUDIOCD : CD-DA atau CD-Teks
    • 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 mana
    • 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 internal)

    Maksud dipilih untuk digunakan untuk perintah putar umum, karena mereka memecahkan dua masalah sekaligus: perintah putar umum itu sendiri dan penemuan layanan. Manfaat tambahan dari niat seperti itu adalah kemungkinan untuk melakukan tindakan sederhana seperti itu tanpa membuka sesi MediaBrowser.

    Penemuan layanan sebenarnya adalah masalah yang lebih penting yang diselesaikan dengan maksud ini. Prosedur untuk penemuan layanan mudah dan tegas dengan cara ini (lihat Penemuan dan koneksi layanan ).

    Untuk mempermudah implementasi beberapa klien, ada cara alternatif untuk mengeluarkan perintah Play (yang juga harus diimplementasikan oleh aplikasi radio): mengeluarkan playFromMediaId dengan rootId dari node root (digunakan sebagai mediaId). Sementara simpul akar tidak dimaksudkan untuk dimainkan, rootId-nya adalah string arbitrer yang dapat dibuat untuk dikonsumsi sebagai mediaId. Namun, klien tidak diharuskan untuk memahami nuansa ini.

    Pemilih Program

    Sementara mediaId cukup untuk memilih saluran dari MediaBrowserService, itu menjadi terikat pada sesi dan tidak konsisten antar penyedia. Dalam beberapa kasus, klien mungkin memerlukan penunjuk absolut (seperti frekuensi absolut) untuk mempertahankannya di antara sesi dan perangkat.

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

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

    Untuk mengaktifkan ProgramSelector agar sesuai dengan solusi berbasis MediaBrowser/MediaSession, tentukan skema URI untuk membuat serial. Skema didefinisikan sebagai berikut:

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

    Dalam contoh ini, bagian Pengidentifikasi sekunder (setelah tanda tanya ( ? )) bersifat opsional dan dapat dihapus untuk memberikan pengenal yang stabil untuk digunakan sebagai mediaId . Sebagai 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 (host AKA) dari program menyediakan ruang untuk perluasan skema di masa depan. String tipe pengenal ditentukan secara tepat sebagai namanya dalam definisi HAL 2.x dari IdentifierType dan format nilainya adalah angka desimal atau heksadesimal (dengan awalan 0x ).

    Semua pengenal khusus vendor diwakili oleh awalan VENDOR_ . Misalnya, VENDOR_0 untuk VENDOR_START dan VENDOR_1 untuk VENDOR_START + 1 . URI tersebut khusus untuk perangkat keras radio tempat mereka dibuat dan tidak dapat ditransfer antar perangkat yang dibuat oleh OEM yang berbeda.

    URI ini harus ditetapkan ke setiap MediaItem di bawah folder radio tingkat atas. Selain itu, MediaSession harus mendukung playFromMediaId dan playFromUri . Namun, URI terutama ditujukan untuk ekstraksi metadata radio (seperti frekuensi FM) dan penyimpanan persisten. Tidak ada jaminan bahwa URI akan tersedia untuk semua item media (misalnya, saat jenis ID utama belum didukung oleh kerangka kerja). Di sisi lain, ID Media selalu berfungsi. Klien tidak disarankan menggunakan URI untuk memilih item dari sesi MediaBrowser saat ini. Sebagai gantinya, gunakan playFromMediaId . Karena itu, ini bukan opsional untuk aplikasi penyajian dan URI yang hilang dicadangkan untuk kasus yang dibenarkan dengan baik.

    Desain awal menggunakan titik dua tunggal alih-alih :// 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 CD Audio.

    Satu aplikasi dapat melayani beberapa jenis sumber. Dalam kasus seperti itu, Anda disarankan untuk membuat MediaBrowserService terpisah untuk setiap jenis sumber. Bahkan dalam pengaturan dengan beberapa sumber/MediaBrowserServices yang dilayani, sangat disarankan untuk memiliki satu MediaSession dalam satu aplikasi.

    CD audio

    Mirip dengan Audio CD dimana aplikasi yang melayani disk tersebut akan mengekspos MediaBrowser dengan satu entri yang dapat dijelajahi (atau lebih, jika sistem memiliki CD changer), yang pada gilirannya akan berisi semua trek dari CD yang diberikan. Jika sistem tidak memiliki pengetahuan tentang trek pada setiap CD (misalnya, ketika semua disk dimasukkan ke dalam kartrid sekaligus dan tidak membaca semuanya), maka MediaItem untuk seluruh disk hanya PLAYABLE , bukan BROWSABLE+PLAYABLE . Jika tidak ada disk dalam slot yang diberikan, item tersebut tidak akan PLAYABLE atau BROWSABLE (tetapi setiap slot harus selalu ada di pohon).

    Struktur pohon CD audio
    Gambar 2. Struktur pohon CD Audio

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

    • EXTRA_CD_TRACK : untuk setiap MediaItem pada Audio CD, nomor trek berbasis 1.
    • EXTRA_CD_DISK : 1 nomor disk berbasis.

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

    masukan tambahan

    Aplikasi yang melayani input tambahan memperlihatkan pohon MediaBrowser dengan satu entri (atau lebih, ketika ada beberapa port) yang mewakili AUX di port. MediaSession masing-masing mengambil mediaId-nya dan beralih ke sumber itu setelah mendapatkan permintaan playFromMediaId .

    Struktur pohon AUX
    Gambar 3. Struktur pohon AUX

    Setiap entri AUX MediaItem akan memiliki bidang ekstra EXTRA_AUX_PORT_NAME yang disetel 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 lokal non-Inggris, tag nama akan tetap menjadi string bahasa Inggris yang sama. Tidak seperti untuk EXTRA_BCRADIO_BAND_NAME_EN , nilainya ditentukan oleh OEM dan tidak dibatasi ke daftar yang telah ditentukan sebelumnya.

    Jika perangkat keras dapat mendeteksi perangkat yang terhubung ke port AUX, perangkat keras harus menandai MediaItem sebagai PLAYABLE , hanya jika input terhubung. Perangkat keras masih harus dihitung (tetapi tidak PLAYABLE ) jika tidak ada yang terhubung ke port ini. Jika perangkat keras tidak memiliki kemampuan seperti itu, MediaItem harus selalu disetel ke PLAYABLE .

    Bidang ekstra

    Oleh karena itu, kunci tambahan berikut harus ditentukan:

    • 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 atas untuk elemen yang memiliki kumpulan bidang ekstra EXTRA_CD_DISK atau EXTRA_AUX_PORT_NAME .

    Contoh rinci

    Contoh berikut membahas struktur pohon MediaBrowser untuk tipe sumber yang merupakan bagian dari desain ini.

    Siaran radio MediaBrowserService (menangani ACTION_PLAY_BROADCASTRADIO ):

    • Stasiun (dapat dijelajahi)
      EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_PROGRAMS
      • BBC One (dapat dimainkan)
        URI: broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=90500
      • ABC 88.1 (dapat dimainkan)
        URI: broadcastradio://program/RDS_PI/5678?AMFM_FREQUENCY=88100
      • ABC 88.1 HD1 (dapat dimainkan)
        URI: broadcastradio://program/HD_STATION_ID_EXT/158241DEADBEEF?AMFM_FREQUENCY=88100&RDS_PI=5678
      • ABC 88.1 HD2 (dapat dimainkan)
        URI: broadcastradio://program/HD_STATION_ID_EXT/158242DEADBEFE
      • 90.5 FM (dapat dimainkan) – FM tanpa RDS
        URI: broadcastradio://program/AMFM_FREQUENCY/90500
      • 620 pagi (dapat dimainkan)
        URI: broadcastradio://program/AMFM_FREQUENCY/620
      • BBC One (dapat dimainkan)
        URI: broadcastradio://program/DAB_SID_EXT/1E24102?RDS_PI=1234
    • Favorit (dapat dijelajahi, dimainkan)
      EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_FAVORITES
      • BBC One (dapat dimainkan)
        URI: broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=101300
      • BBC Dua (tidak dapat dimainkan)
        URI: broadcastradio://program/RDS_PI/1300?AMFM_FREQUENCY=102100
    • AM (dapat dijelajahi, dapat dimainkan)
      EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BAND
      EXTRA_BCRADIO_BAND_NAME_EN="AM"
      • 530 pagi (dapat dimainkan)
        URI: broadcastradio://program/AMFM_FREQUENCY/530
      • 540 pagi (dapat dimainkan)
        URI: broadcastradio://program/AMFM_FREQUENCY/540
      • 550 pagi (dapat dimainkan)
        URI: broadcastradio://program/AMFM_FREQUENCY/550
    • FM (dapat dijelajahi, dimainkan)
      EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BAND
      EXTRA_BCRADIO_BAND_NAME_EN="FM"
      • 87.7 FM (dapat dimainkan)
        URI: broadcastradio://program/AMFM_FREQUENCY/87700
      • 87.9 FM (dapat dimainkan)
        URI: broadcastradio://program/AMFM_FREQUENCY/87900
      • 88.1 FM (dapat dimainkan)
        URI: broadcastradio://program/AMFM_FREQUENCY/88100
    • DAB (dapat dimainkan)
      EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BAND
      EXTRA_BCRADIO_BAND_NAME_EN="DAB"

    Audio CD MediaBrowserService (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 dimainkan)
        EXTRA_CD_TRACK=1
      • Trek 2 (dapat dimainkan)
        EXTRA_CD_TRACK=2
    • CD musik saya (dapat dijelajahi, dimainkan)
      EXTRA_CD_DISK=3
      • Semua Sendiri (dapat dimainkan)
        EXTRA_CD_TRACK=1
      • Reise, Reise (dapat dimainkan)
        EXTRA_CD_TRACK=2
    • Slot 4 kosong (tidak dapat dimainkan)
      EXTRA_CD_DISK=4

    AUX MediaBrowserService (menangani ACTION_PLAY_AUX ):

    • AUX depan (dapat dimainkan)
      EXTRA_AUX_PORT_NAME="front"
    • Belakang AUX (dapat dimainkan)
      EXTRA_AUX_PORT_NAME="rear"