Radyoyu uygula

Bu sayfada radyonun donanım ve yazılım düzeyinde nasıl uygulanacağı açıklanmaktadır.

Sistem bileşenleri

Yayın radyo yığını aşağıdaki bileşenleri içerir.

Yayın Radyo mimarisi
Şekil 1. Yayın Radyosu mimarisi

Radyo referans uygulaması

Radyo kontrolünün nasıl uygulanacağına ilişkin ayrıntılar için bkz. Radyo kontrolü uygulaması .

Örnek bir Java radyo uygulaması ( packages/apps/Car/Radio ) referans uygulaması görevi görür. Uygulama hizmeti başlatıldığında Radyo Yöneticisinden bir Radyo Ayarlayıcı açmasını ister. Daha sonra uygulama, Radyo Tuner'a belirli bir radyo istasyonunu, frekansı ayarlama veya bir sonraki mevcut radyo istasyonunu arama gibi istekler gönderebilir. Uygulama, Radyodaki Radyo Yöneticisi ve Radyo Tuner'dan güncel program bilgileri, radyo programı listeleri, konfigürasyonlar ve satıcı tarafından tanımlanan parametreler gibi güncellemeleri alır. Referans Radyo uygulaması yalnızca AM ve FM radyoyu destekler. OEM'ler Radyo uygulamasını istedikleri gibi değiştirebilir veya değiştirebilir.

Radyo Yöneticisi

Uygulama, Radio Manager'dan bir ayarlayıcı açmasını talep ettiğinde, Radyo Yöneticisi ( frameworks/base/core/java/android/hardware/radio/RadioManager.java ) Yayın Radyo Hizmeti'nden bir Ayarlayıcı oturumu açmasını ister ve ardından oturumu bir oturumda sarar. Uygulamaya döndürülen Radyo Ayarlayıcı ( frameworks/base/core/java/android/hardware/radio/RadioTuner.java ). Radyo Tuner, radyo uygulamalarından çağrılabilecek ve Radyo Yayını Hizmetine istek gönderilebilecek API'leri (ayarlama, adımlama ve iptal etme gibi) tanımlar. Radyo Tuner'da tanımlanan geri arama yöntemleri ( RadioTuner.Callback ), Radyo Yayını Hizmetinden uygulamalara geçerli program bilgileri, program listeleri ve satıcı tarafından tanımlanan parametreler gibi yayın radyo HAL'sine ilişkin güncellemeleri gönderir.

Radyo Yayını Hizmeti

Yayın Radyo Hizmeti ( frameworks/base/services/core/java/com/android/server/broadcastradio ), Yayın Radyo HAL'ye yönelik istemci hizmetidir. Yayın Radyo Hizmeti, birden fazla Radyo Yöneticisini Yayın Radyo HAL'leriyle koordine eder. Yayın Radyo Hizmeti , HAL arayüz tanım dilini (HIDL) ve Android arayüz tanım dilini (AIDL) yayın radyo HAL'lerini destekler. Radyo Yayını Hizmeti, herhangi bir AIDL HAL hizmeti mevcut olduğunda AIDL HAL'e bağlanır; aksi takdirde hizmet HIDL HAL'e bağlanır. Yayın Radyo Hizmeti, mevcut her HAL örneği için (AM, FM ve DAB gibi) bir Radyo Modülü oluşturur.

Her Radyo Yöneticisi, Radyo Yayını Hizmetinden, radyo türüne bağlı olarak ilgili Radyo Modülünde bir ayarlayıcı oturumu oluşturmasını talep edebilir. Her ayarlayıcı oturumu, ilgili yayın radyo HAL örneğinde işlemleri gerçekleştirmek için ayarlama, adımlama ve iptal etme (HAL arayüzlerinde tanımlanan) gibi yöntemleri çağırabilir. Bir ayarlayıcı oturumu, bir HAL güncellemesinde HAL örneğinden geçerli program bilgisi, program listesi, yapılandırma işaretleri ve satıcı parametreleri gibi bir geri arama aldığında, güncellemeyle ilgili geri aramalar aynı Radyo Modülüne bağlı tüm Radyo Ayarlayıcılara gönderilir.

Radyo HAL yayını

Yayın radyosunun HIDL ve AIDL arayüzleri ve ikisi arasındaki farklar hakkında daha fazla bilgi edinmek için bkz . Radyo Yayını HAL arayüzü .

Yayın radyo donanımı soyutlama katmanı

Aşağıdaki bölümlerde radyo yayını uygulamak için donanım soyutlama katmanı (HAL) ile nasıl çalışılacağı açıklanmaktadır.

Yayın radyo HAL arayüzü

Yayın radyosu HAL, AM/FM ve DAB radyo gibi radyo yayınını uygulamak için donanım düzeyinde veri yapıları ve arayüzler sağlar.

HIDL 2.0 ve AIDL arayüzleri

Yayın radyosu HAL, aşağıdaki bölümlerde açıklanan arayüzleri kullanır.

Duyuru dinleyicisi

IAnnouncementListener , duyuruları almak üzere yayın radyosu HAL'e kaydedilebilen duyuru dinleyicisinin geri arama arayüzüdür. Arayüz aşağıdaki yöntemlere sahiptir:

IDuyuruDinleyici
Açıklama: Duyuru listesi değiştiğinde çağrılır.
HDL 2.0 oneway onListUpdated(vec<Announcement> announcements)
AIDL oneway void onListUpdated(in Announcement[] announcements)
Tutamağı kapat

ICloseHandle etkin bir arayüze ihtiyaç duymayan bir geri aramayı kaldırmak için kullanılan genel kapatma tanıtıcısıdır.

ICloseHandle
Açıklama: Kolu kapatın.
HDL 2.0 close()
AIDL void close()

Geri arama arayüzü

ITunerCallback , HAL istemci hizmetine güncellemeler göndermek için yayın radyosu HAL tarafından çağrılan geri arama arayüzüdür.

ITunerGeri arama
Açıklama: Bir ayarlama işlemi (ayarlama, arama (AIDL'de) veya tarama (HIDL'de) ve adım başarılı olduğunda) eşzamansız olarak başarısız olduğunda HAL tarafından çağrılır.
HDL 2.0 oneway onCurrentProgramInfoChanged(ProgramInfo info)
AIDL void onCurrentProgramInfoChanged(in ProgramInfo info)
Açıklama: Ayarlama, arama (AIDL'de) veya tarama (HIDL'de) veya adım başarılı olduğunda çağrılır.
HDL 2.0 oneway onTuneFailed(Result result, ProgramSelector selector)
AIDL void onTuneFailed(in Result result, in ProgramSelector selector)
Açıklama: Ayarlama, arama (AIDL'de) veya tarama (HIDL'de) veya adım başarılı olduğunda çağrılır.
HDL 2.0 oneway onCurrentProgramInfoChanged(ProgramInfo info)
AIDL void onCurrentProgramInfoChanged(in ProgramInfo info)
Açıklama: Program listesi güncellendiğinde çağrılır; her bir parçanın boyutu 500kiB ile sınırlı olmalıdır.
HDL 2.0 oneway onProgramListUpdated(ProgramListChunk chunk)
AIDL oneway onProgramListUpdated(ProgramListChunk chunk)
Açıklama: Anten bağlandığında veya bağlantısı kesildiğinde çağrılır.
HDL 2.0 oneway onAntennaStateChange(bool connected)
AIDL void onCurrentProgramInfoChanged(in ProgramInfo info)
Açıklama: Satıcıya özgü parametre değerleri HAL'de dahili olarak güncellendiğinde çağrılır (HAL istemcisi tarafından setParameters çağrıldıktan sonra çağrılmamalıdır).
HDL 2.0 oneway onParametersUpdated(vec<VendorKeyValue> parameters)
AIDL void onParametersUpdated(in VendorKeyValue[] parameters)
Açıklama: AIDL'de yeni. HAL'de yapılandırma bayrağı dahili olarak güncellendiğinde çağrılır (HAL istemcisi tarafından setConfigFlag çağrıldıktan sonra çağrılmamalıdır).
HDL 2.0 Uygulanamaz.
AIDL void onConfigFlagUpdated(in ConfigFlag flag, in boolean value)

Birincil yayın radyo HAL arayüzü

IBroadcastRadio HAL radyo yayını için birincil arayüzdür. HIDL 2.0 HAL'de, işlemleri çağırmak için tuner için ITunerSession arayüzünü kullanın. Ancak aynı anda en fazla bir ayarlayıcı etkindir (her yayın radyo HAL örneğinin yalnızca bir ayarlayıcı çipine sahip olması koşuluyla). ITunerSession , AIDL arayüzlerinden kaldırıldı ve arayüzleri IBroadcastRadio taşındı.

IYayınRadyo
Açıklama: Bir modülün ve yeteneklerinin açıklamasını alın.
HDL 2.0 getProperties() generates (Properties properties)
AIDL Properties getProperties()
Açıklama: Geçerli veya olası AM/FM bölge yapılandırmasını getirir.
HDL 2.0 getAmFmRegionConfig(bool full) generates (Result result, AmFmRegionConfig config)
AIDL AmFmRegionConfig getAmFmRegionConfig(bool full)
Açıklama: Geçerli DAB bölgesi yapılandırmasını getirir.
HDL 2.0 getDabRegionConfig() generates (Result result, vec<DabTableEntry> config)
AIDL DabTableEntry[] getDabRegionConfig()
Açıklama: Radyo modülü önbelleğinden bir görüntü alır. AIDL'de, ciltleyici işlem arabelleğindeki sabit sınır nedeniyle görüntü boyutunun 1 MB'tan az olması gerekir.
HDL 2.0 getImage(uint32_t id) generates (vec<uint8_t> image)
AIDL byte[] getImage(in int id)
Açıklama: Duyuru dinleyicisini kaydeder.
HDL 2.0 registerAnnouncementListener(vec<AnnouncementType> enabled,IAnnouncementListener listener) generates (Result result, ICloseHandle closeHandle)
AIDL ICloseHandle registerAnnouncementListener(in IAnnouncementListener listener, in AnnouncementType[] enabled)
Tanım:
  • HIDL HAL: Yeni bir tuner oturumu açıldığında eski oturumun sonlandırılması gerekir.
  • AIDL HAL: Ayarlayıcı oturumu mevcut olmadığından yalnızca ayarlayıcı geri aramasının ayarlanması gerekir. Varsa, eski geri aramanın ayarı kaldırılmalıdır.
HDL 2.0 openSession(ITunerCallback callback) şunu üretir (Result result, ITunerSession session)
AIDL void setTunerCallback(in ITunerCallback callback)
Tanım:
  • HIDL HAL: Ayarlayıcı oturumunun kapatılması başarısız olmamalıdır ve yalnızca bir kez gerçekleştirilmelidir.
  • AIDL HAL: Ayarlayıcı yoktur ve yalnızca ayarlayıcı geri aramasının kaldırılması gerekir.
HDL 2.0 close()
AIDL unsetTunerCallback()
Açıklama: Belirtilen bir programa ayarlar.
HDL 2.0 tune(ProgramSelector program) generates (Result result)
AIDL void tune(in ProgramSelector program)
Açıklama: Yayındaki bir sonraki geçerli programı arar. AIDL'de karışıklığı önlemek için scan , seek olarak yeniden adlandırıldı.
HDL 2.0 scan(bool directionUp, bool skipSubChannel) generates (Result result)
AIDL void seek(in boolean directionUp, in boolean skipSubChannel)
Açıklama: Herhangi bir program tarafından işgal edilmeyen bitişik kanala giden adımlar.
HDL 2.0 step(bool directionUp) generates (Result result)
AIDL void step(in boolean directionUp)
Açıklama: Bekleyen melodiyi, taramayı (HIDL'de) veya aramayı (AIDL'de) veya adım işlemlerini iptal eder.
HDL 2.0 cancel()
AIDL void cancel()
Açıklama: Program listesine bir filtre uygular ve onProgramListUpdated geri çağrısı üzerinden program listesi güncellemelerini göndermeye başlar.
HDL 2.0 startProgramListUpdates(ProgramFilter filter) generates (Result result)
AIDL void startProgramListUpdates(in ProgramFilter filter)
Açıklama: Program listesi güncellemelerinin gönderilmesini durdurur.
HDL 2.0 stopProgramListUpdates()
AIDL void stopProgramListUpdates()
Açıklama: Belirli bir yapılandırma bayrağının geçerli ayarını getirir.
HDL 2.0 isConfigFlagSet(ConfigFlag flag) generates (Result result, bool value)
AIDL boolean isConfigFlagSet(in ConfigFlag flag)
Açıklama: Verilen yapılandırma bayrağını ayarlar.
HDL 2.0 setConfigFlag(ConfigFlag flag, bool value) generates (Result result)
AIDL void setConfigFlag(in ConfigFlag flag, boolean value)
Açıklama: Satıcıya özel parametre değerlerini ayarlar.
HDL 2.0 setParameters(vec<VendorKeyValue> parameters)

üretir ,

(vec<VendorKeyValue> results)
AIDL VendorKeyValue[] setParameters(in VendorKeyValue[] parameters)
Açıklama: Satıcıya özel parametre değerlerini alır.
HDL 2.0 getParameters(vec<string> keys) generates (vec<VendorKeyValue> parameters)
AIDL VendorKeyValue[] getParameters(in String[] keys)

Arayüz açıklamaları

Eşzamansız davranış

Her bir ayarlama işlemi (örneğin, ayarlama, tarama (HIDL'de) veya arama (AIDL'de) ve adım) zaman alıcı olabileceğinden ve iş parçacığının uzun süre bloke edilmemesi gerektiğinden, işlemin zaman tüketen işlemleri planlaması gerekir. daha sonra meydana gelir ve hızlı bir şekilde bir durum veya sonuç döndürür. Ayrıntılı olarak, her işlem şunları yapmalıdır:

  • Bekleyen tüm ayarlama işlemlerini iptal edin.
  • Yöntem girişlerine ve ayarlayıcının durumuna göre işlemin gerçekleştirilip gerçekleştirilemeyeceğini kontrol edin.
  • Ayarlama görevini planlayın ve ardından Result (HIDL'de) veya status (AIDL'de) hemen geri gönderin. Result veya status OK ise, ayarlama görevi başarısız olduğunda (örneğin, zaman aşımı nedeniyle) veya tamamlandığında ayarlayıcı geri çağırma tuneFailed veya currentProgramInfoChanged çağrılmalıdır.

Benzer şekilde, startProgramListUpdates ayrıca zaman alan program listesini güncelleme görevini daha sonra gerçekleşecek ve hızlı bir şekilde durum veya sonuç döndürecek şekilde planlar. Yöntem önce bekleyen güncelleme isteklerini iptal eder, ardından güncelleme görevini planlar ve sonucu hızlı bir şekilde döndürür.

Yarış kondisyonu

Ayarlama işlemlerinin (örneğin ayarlama, tarama (HIDL'de) veya arama (AIDL'de) ve adım) eşzamansız davranışı nedeniyle, işlemin iptal edilmesi ile ayarlama işlemleri arasında bir yarış durumu mevcuttur. HAL bir ayarlama işlemini tamamladıktan sonra ve geri arama tamamlanmadan önce cancel çağrılırsa, iptal göz ardı edilebilir ve geri arama tamamlanmalı ve HAL istemcisi tarafından alınmalıdır.

Benzer şekilde, HAL bir program listesi güncellemesini tamamladıktan sonra ve onCurrentProgramInfoChanged geri çağırma tamamlanmadan önce stopProgramListUpdates çağrılırsa, stopProgramListUpdates göz ardı edilebilir ve geri aramanın tamamlanması gerekir.

Veri boyutu sınırı

Bağlayıcı işlem arabelleğinde sabit bir sınır olduğundan, potansiyel olarak büyük boyuttaki verileri geçiren bazı arayüz yöntemleri için veri sınırı, AIDL HAL'de açıklığa kavuşturulmuştur.

  • getImage döndürülen görüntünün 1 MB'tan küçük olmasını gerektirir.
  • onProgramListUpdate her chunk 500kiB'den az olmasını gerektirir. Daha büyük program listelerinin HAL uygulaması tarafından birden fazla parçaya bölünmesi ve birden fazla geri arama yoluyla gönderilmesi gerekir.

AIDL HAL veri yapılarındaki değişiklikler

Arayüzlerdeki değişikliklerin yanı sıra bu değişiklikler, AIDL'den yararlanan yayın radyosu AIDL HAL'de tanımlanan veri yapılarına da uygulanmıştır.

  • Constant numaralandırma AIDL'de kaldırılır ve IBroadcastRadio const int olarak tanımlanır. Bu arada ANTENNA_DISCONNECTED_TIMEOUT_MS , ANTENNA_STATE_CHANGE_TIMEOUT_MS olarak yeniden adlandırıldı. Yeni bir const int TUNER_TIMEOUT_MS eklendi. Tüm ayar, arama ve adım işlemlerinin bu süre içerisinde tamamlanması gerekir.
  • Enum RDS ve Deemphasis AIDL'de kaldırılır ve AmFmRegionConfig const int olarak tanımlanır. Buna uygun olarak, ProgramInfo hem fmDeemphasis hem de fmRds ilgili bayrakların bir bit hesaplama sonucu olan int olarak bildirilir. Bu arada D50 ve D75 sırasıyla DEEMPHASIS_D50 ve DEEMPHASIS_D75 olarak yeniden adlandırıldı.
  • Enum ProgramInfoFlags AIDL'de kaldırılır ve ProgramInfo FLAG_ öneki eklenerek const int olarak tanımlanır. Buna uygun olarak, ProgramInfo infoFlags bayrakların bir bit hesaplama sonucu olan int olarak bildirilir. TUNED ayrıca istasyonun ayarlanabileceği tanımını daha iyi tanımlamak için FLAG_TUNABLE olarak yeniden adlandırılmıştır.
  • AmFmBandRange , scan AIDL'de seek olarak yeniden adlandırıldığından, scanSpacing , seekSpacing olarak yeniden adlandırılmıştır.
  • AIDL'de birleşim kavramı ortaya çıktığı için HIDL HAL'de tanımlanan MetadataKey ve Metadata artık kullanılmamaktadır. AIDL HAL'de bir AIDL birliği Metadata tanımlanır. Daha önce MetadataKey bulunan her enum değeri artık Metadata , tanımlarına bağlı olarak string veya int türünde bir alandır.

Radyo kontrol uygulaması

Radyo kontrolü uygulaması, Medya ve sesli asistan uygulamalarının radyoyu kontrol etmesini sağlayan MediaSession ve MediaBrowse dayanmaktadır. Daha fazla bilgi için Developer.android.com adresinde Arabalar için medya uygulamaları oluşturma konusuna bakın.

packages/apps/Car/libs içindeki car-broadcastradio-support kitaplığında bir medya tarama ağacı uygulaması sağlanır. Bu kitaplık aynı zamanda URI'ye ve URI'den dönüştürülecek ProgramSelector uzantılarını da içerir. İlgili göz atma ağacını oluşturmak için radyo uygulamalarının bu kitaplığı kullanması önerilir.

Medya kaynağı değiştirici

Radyo ile medyada görüntülenen diğer uygulamalar arasında kusursuz bir geçiş sağlamak için, araç-medya-ortak kitaplığı, radyo uygulamasına entegre edilmesi gereken sınıfları içerir. MediaAppSelectorWidget radyo uygulaması için XML'e dahil edilebilir (referans medya ve radyo uygulamalarında kullanılan simge ve açılır menü):

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

Bu widget, değiştirilebilecek medya kaynaklarının listesini görüntüleyen AppSelectionFragment öğesini başlatır. Sağlananın dışında bir kullanıcı arayüzü isteniyorsa, değiştiricinin görüntülenmesi gerektiğinde AppSelectionFragment başlatmak için özel bir widget oluşturabilirsiniz.

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

packages/apps/Car/Radio içinde bulunan referans radyo uygulaması uygulamasında örnek bir uygulama sağlanmıştır.

Ayrıntılı kontrol özellikleri

MediaSession ( MediaSession.Callback aracılığıyla) arayüzü, o anda oynatılan radyo programı için kontrol mekanizmaları sağlar:

  • onPlay , onStop . Radyo çalmanın sesini kapatma (açma).
  • onPause . Zaman kaydırmalı duraklama (destekleniyorsa).
  • onPlayFromMediaId . Üst düzey bir klasördeki herhangi bir içeriği oynatın. Örneğin, "FM Çal" veya "Radyo Çal".
  • onPlayFromUri . Belirli bir frekansı çalın. Örneğin, "88.5 FM'i çal."
  • onSkipToNext , onSkipToPrevious . Sonraki veya önceki istasyona geçin.
  • onSetRating . Favorilere ekleyin veya Favorilerden kaldırın.

MediaBrowser, üç tür üst düzey dizin üzerinde ayarlanabilir bir MediaItem sunar:

  • ( İsteğe bağlı ) Programlar (istasyonlar). Bu mod genellikle çift ayarlı radyolar tarafından kullanıcının bulunduğu yerdeki tüm ayarlanabilir radyo istasyonlarını belirtmek için kullanılır.
  • Favoriler. Favoriler listesine eklenen radyo programlarından bazıları kullanılamayabilir (alım aralığı dışında).
  • Bant kanalları. Mevcut bölgedeki fiziksel olarak mümkün olan tüm kanallar (87.9, 88.1, 88.3, ​​88.5, 88.7, 88.9, 89.1 vb.). Her grubun ayrı bir üst düzey dizini vardır.
MediaBrowserService ağaç yapısı
Şekil 2. MediaBrowserService ağaç yapısı

Bu klasörlerin (AM/FM/Programlar) her birindeki her öğe, ayarlamak için MediaSession ile kullanılabilecek bir URI'ye sahip bir MediaItem'dir. Her üst düzey klasör (AM/FM/Programlar), MediaSession ile oynatmayı tetiklemek için kullanılabilen ve OEM'in takdirine bağlı olan, mediaID'ye sahip bir MediaItem'dir. Örneğin, "FM Çal", "AM Çal" ve "Radyo Çal", OEM radyo uygulamasına göndermek için bir mediaId kullanan, spesifik olmayan radyo sorgularıdır. Genel istek ve mediaId'den neyin çalınacağını belirlemek radyo uygulamasına kalmıştır.

Medya Oturumu

Bir yayın akışını duraklatma kavramı olmadığı için Oynat, Duraklat ve Durdur eylemleri radyo için her zaman geçerli değildir. Radyoda, Durdur eylemi akışın kapatılmasıyla ilişkilendirilirken Oynat, sessizliğin kaldırılmasıyla ilişkilendirilir.

Bazı radyo ayarlayıcıları (veya uygulamaları), içeriği önbelleğe alıp daha sonra oynatarak yayın akışı duraklatmasını simüle etme yeteneği sağlar. Bu gibi durumlarda onPause kullanın.

MediaId ve URI eylemlerinden oynatmanın amacı, MediaBrowser arayüzünden getirilen bir istasyonu ayarlamaktır. MediaId, belirli bir istasyonu tanımlamak için benzersiz (böylece belirli bir kimlik yalnızca bir öğeyi işaret eder) ve sabit (böylece belirli bir öğe tüm oturum boyunca aynı kimliğe sahiptir) bir değer empoze etmek için radyo uygulaması tarafından sağlanan rastgele bir dizedir. . URI iyi tanımlanmış bir şemaya sahip olacaktır. Kısacası, ProgramSelector'ın URI'li bir formu. Bu, teklik özelliğini korurken, istasyon farklı bir frekansa geçtiğinde değişebilmesine rağmen, kararlı olması gerekmez.

Tasarım gereği onPlayFromSearch kullanılmaz. MediaBrowser ağacından bir arama sonucu seçmek müşterinin (yardımcı uygulama) sorumluluğundadır. Bu sorumluluğu radyo uygulamasına taşımak karmaşıklığı artıracak, dize sorgularının nasıl görünmesi gerektiğine ilişkin resmi sözleşmeler gerektirecek ve farklı donanım platformlarında eşit olmayan bir kullanıcı deneyimine yol açacaktır.

Not: Radyo uygulaması, MediaBrowser arayüzü aracılığıyla istemciye gösterilmeyen bir istasyon adını aramak için yararlı olabilecek ek bilgiler içermez.

Sonraki veya önceki istasyona atlamak mevcut bağlama bağlıdır:

  • Bir uygulama Favoriler listesinden bir istasyona ayarlandığında uygulama, Favoriler listesinden bir sonraki istasyona geçebilir.
  • Program listesinden bir istasyonun dinlenmesi, kanal numarasına göre sıralanmış bir sonraki mevcut istasyonun ayarlanmasıyla sonuçlanabilir.
  • Rastgele bir kanalın dinlenmesi, yayın sinyali olmasa bile bir sonraki fiziksel kanala geçilmesiyle sonuçlanabilir.

Radyo uygulaması bu eylemleri gerçekleştirir.

Hata yönetimi

TransportControls eylemleri (Oynat, Durdur ve Sonraki), eylemin başarılı olup olmadığına ilişkin geri bildirim sağlamaz. Bir hatayı belirtmenin tek yolu MediaSession durumunu bir hata mesajıyla STATE_ERROR olarak ayarlamaktır.

Radyo uygulamasının bu eylemleri gerçekleştirmesi ve bunları yürütmesi veya bir hata durumu ayarlaması gerekir. Çalma komutunun yürütülmesi anında değilse, komut yürütülürken çalma durumu STATE_CONNECTING (doğrudan ayarlama durumunda) veya STATE_SKIPPING_TO_PREVIOUS veya NEXT olarak değiştirilmelidir.

İstemci PlaybackState izlemeli ve oturumun mevcut programı istenen programa değiştirdiğini veya hata durumuna girildiğini doğrulamalıdır. STATE_CONNECTING 30 saniyeyi geçmemelidir. Ancak belirli bir AM/FM frekansına doğrudan ayar yapılması çok daha hızlı performans göstermelidir.

Favorileri ekleme ve kaldırma

MediaSession, Sık Kullanılanları kontrol etmek için kullanılabilecek derecelendirme desteğine sahiptir. RATING_HEART türünde bir derecelendirmeyle çağrılan onSetRating , o anda ayarlanan istasyonu Favoriler listesine ekler veya bu listeden çıkarır.

Eski ön ayarların aksine, bu model, kaydedilen her favorinin sayısal bir yuvaya (tipik olarak 1'den 6'ya) tahsis edildiği sırasız ve sınırsız bir Favoriler listesini varsayar. Sonuç olarak, ön ayar tabanlı sistemler onSetRating işlemiyle uyumsuz olacaktır.

MediaSession API'nin sınırlaması, yalnızca o anda ayarlı olan istasyonun eklenebilmesi veya kaldırılabilmesidir. Örneğin, öğelerin kaldırılabilmesi için önce seçilmesi gerekir. Bu, eşlik eden bir uygulama gibi yalnızca MediaBrowser istemcisinin bir sınırlamasıdır. Radyo uygulaması da benzer şekilde kısıtlanmamıştır. Bir uygulama Sık Kullanılanları desteklemediğinde bu bölüm isteğe bağlıdır.

Medya Tarayıcı

Belirli bir bölge için hangi frekansların veya fiziksel kanal adlarının (belirli bir radyo teknolojisi için rastgele bir kanala ayarlama uygun olduğunda) geçerli olduğunu ifade etmek için, her bant için tüm geçerli kanallar (frekanslar) listelenir. ABD bölgesinde bu, 87,8 ila 108,0 MHz aralığında (0,2MHz aralık kullanarak) 101 FM kanalına ve 530 ila 1700 kHz aralığında (10kHz aralık kullanarak) 117 AM kanalına karşılık gelir. HD radyo aynı kanal alanını kullandığından ayrı olarak sunulmaz.

Şu anda mevcut olan radyo programlarının listesi, doğrudan ses yayını (DAB) grubuna göre gruplandırma gibi görüntüleme şemalarına izin vermemesi nedeniyle düzdür.

Favori listesindeki girişler ayarlanamayabilir. Örneğin belirli bir program aralık dışındaysa. Radyo uygulaması, girişin önceden ayarlanıp ayarlanamayacağını algılayabilir veya algılamayabilir. Bu durumda, girişi oynanabilir olarak işaretlemeyebilir.

Üst düzey klasörleri tanımlamak için Bluetooth tarafından kullanılan mekanizmanın aynısı uygulanır. Yani, MediaDescription nesnesinin bir Ekstra paketi, tıpkı Bluetooth'un EXTRA_BT_FOLDER_TYPE ile yaptığı gibi tunere özgü bir alan içerir. Radyo yayını durumunda bu, genel API'de aşağıdaki yeni alanların tanımlanmasına yol açar:

  • EXTRA_BCRADIO_FOLDER_TYPE = "android.media.extra.EXTRA_BCRADIO_FOLDER_TYPE" . Aşağıdaki değerlerden biri:
    • BCRADIO_FOLDER_TYPE_PROGRAMS = 1 . Şu anda mevcut programlar.
    • BCRADIO_FOLDER_TYPE_FAVORITES = 2 . Favoriler.
    • BCRADIO_FOLDER_TYPE_BAND = 3 . Belirli bir bant için tüm fiziksel kanallar.

    İlgili tüm veriler mevcut MediaBrowser.MediaItem şemasına uyduğu için radyoya özgü özel meta veri alanları tanımlamaya gerek yoktur:

    • Program adı (RDS PS, DAB hizmet adı). MediaDescription.getTitle .
    • FM frekansı. URI (bkz. ProgramSelector ) veya MediaDescription.getTitle (bir giriş BROADCASTRADIO_FOLDER_TYPE_BAND klasöründeyse).
    • Radyoya özgü tanımlayıcılar (RDS PI, DAB SId). MediaDescription.getMediaUri ProgramSelector'a ayrıştırıldı.

    Tipik olarak mevcut programdaki veya Favoriler listesindeki bir giriş için FM frekansını almaya gerek yoktur (istemcinin medya kimlikleri üzerinde çalışması gerektiği için). Ancak böyle bir ihtiyaç ortaya çıkarsa (örneğin görüntüleme amacıyla), URI'de bulunur ve ProgramSelector ayrıştırılabilir. Bununla birlikte, geçerli oturumdaki öğeleri seçmek için URI'nin kullanılması önerilmez. Ayrıntılar için bkz. ProgramSelector .

    Performans veya ciltleyiciyle ilgili sorunları önlemek için MediaBrowser hizmetinin sayfalandırmayı desteklemesi gerekir:

    Not: Varsayılan olarak sayfalandırma, onLoadChildren() değişkeninde seçenek yönetimi olmadan varsayılan olarak uygulanır.

    Tüm liste türlerindeki (ham kanallar, bulunan programlar ve favoriler) ilgili girişlerin farklı mediaId'leri olabilir (bu radyo uygulamasına bağlıdır; destek kütüphanesinde bunlar farklı olacaktır). URI'ler (ProgramSelector biçiminde), çoğu durumda ham kanallar ve bulunan programlar arasında farklılık gösterir (RDS'siz FM hariç), ancak bulunan programlar ve favoriler arasında çoğunlukla aynıdır (örneğin, AF'nin güncellendiği durumlar hariç).

    Farklı türdeki listelerdeki girişler için farklı mediaId'lere sahip olmak, bunlar üzerinde farklı eylemlerin gerçekleştirilmesini mümkün kılar. Son seçilen MediaItem klasörüne bağlı olarak onSkipToNext Favoriler listesinde veya Tüm Programlar listesinde gezinebilirsiniz (bkz. MediaSession ).

    Özel ayar eylemleri

    Program listesi, kullanıcıların belirli bir istasyonu ayarlamasına olanak tanır ancak kullanıcıların, FM bandında yakın zamanda dinlenen bir istasyonun ayarlanmasıyla sonuçlanabilecek "FM'ye Ayarla" gibi genel isteklerde bulunmasına izin vermez.

    Bu tür eylemleri desteklemek için bazı üst düzey dizinlerde FLAG_PLAYABLE bayrağı seti bulunur (klasörler için FLAG_BROWSABLE ile birlikte).

    Aksiyon Melodiler Nasıl verilir
    Radyo çal Herhangi bir radyo kanalı startService(ACTION_PLAY_BROADCASTRADIO)

    veya

    playFromMediaId(MediaBrowser. getRoot() )
    FM çal Herhangi bir FM kanalı FM bandının mediaId çalın.

    Hangi programın ayarlanacağının belirlenmesi uygulamaya bağlıdır. Bu genellikle verilen listeden en son ayarlanan kanaldır. ACTION_PLAY_BROADCASTRADIO ile ilgili ayrıntılar için bkz. Genel oynatma amaçları .

    Keşif ve servis bağlantısı

    PackageManager yayın radyo ağacını sunan MediaBrowserService'i doğrudan bulabilir. Bunu yapmak için, ACTION_PLAY_BROADCASTRADIO amacı (bkz. Genel oynatma amaçları ) ve MATCH_SYSTEM_ONLY bayrağıyla resolveService çağırın. Radyoya hizmet veren tüm hizmetleri bulmak için (birden fazla olabilir; örneğin, ayrı AM/FM ve uydu) queryIntentServices kullanın.

    Çözümlenen hizmet, android.media.browse.MediaBrowserService bağlama amacını da yönetir. Bu GTS ile doğrulanmıştır.

    Seçilen MediaBrowserService'e bağlanmak için belirli bir hizmet bileşenine yönelik MediaBrowser örneği oluşturun ve connect . Bağlantı kurulduktan sonra getSessionToken aracılığıyla MediaSession'a bir tanıtıcı elde edilebilir.

    Radyo uygulaması, hizmetlerinin onGetRoot uygulamasında bağlanmasına izin verilen istemci paketlerini kısıtlayabilir. Uygulama, sistem uygulamalarının beyaz listeye alınmadan bağlanmasına izin vermelidir. Beyaz listeye almayla ilgili ayrıntılar için bkz. Asistan uygulama paketini ve imzayı kabul etme .

    Kaynağa özgü uygulama (örneğin, bir radyo uygulaması) bu tür bir kaynak desteği olmayan bir cihaza kurulursa, kendisini yine de ACTION_PLAY_BROADCASTRADIO amacını işliyormuş gibi tanıtacaktır, ancak MediaBrowser ağacı radyoya özgü etiketler içermeyecektir. Bu nedenle, belirli bir kaynağın bir cihazda mevcut olup olmadığını kontrol etmek isteyen bir müşteri:

    1. Radyo hizmetini keşfedin ( ACTION_PLAY_BROADCASTRADIO için resolveService arayın).
    2. MediaBrowser oluşturun ve ardından ona bağlanın.
    3. EXTRA_BCRADIO_FOLDER_TYPE ekstra ile MediaItem varlığını belirleyin.

    Not: Çoğu durumda, istemcinin belirli bir cihaz için mevcut tüm kaynakları tespit etmek amacıyla mevcut tüm MediaBrowser ağaçlarını taraması gerekir.

    Grup isimleri

    Bant listesi, klasör türü etiketi BCRADIO_FOLDER_TYPE_BAND olarak ayarlanmış bir dizi üst düzey dizin tarafından temsil edilir. MediaItem başlıkları grup adlarını temsil eden yerelleştirilmiş dizelerdir. Çoğu durumda İngilizce çeviriyle aynı olacaktır ancak müşteri bu varsayıma güvenemez.

    Belirli bantları aramak için istikrarlı bir mekanizma sağlamak amacıyla, bant klasörleri için ekstra bir etiket eklenmiştir: EXTRA_BCRADIO_BAND_NAME_EN . Bu, grubun yerelleştirilmemiş bir adıdır ve önceden tanımlanmış şu değerlerden yalnızca birini alabilir:

    • AM
    • FM
    • DAB

    Eğer grup bu listede yoksa grup isim etiketi ayarlanmamalıdır. Ancak grup listede yer alıyorsa etiket setinin olması gerekir. HD radyo, AM/FM ile aynı temel ortamı kullandığından ayrı bantları numaralandırmaz.

    Genel oyun amaçları

    Belirli bir kaynağı (radyo veya CD gibi) oynatmaya adanmış her uygulamanın, bazı içerikleri muhtemelen etkin olmayan durumdan (örneğin, önyüklemeden sonra) oynatmaya başlaması için genel bir oynatma amacını karşılaması gerekir. Çalınacak içeriğin nasıl seçileceği uygulamaya bağlıdır, ancak bu genellikle yakın zamanda çalınan radyo programı veya CD parçasıdır. Her ses kaynağı için tanımlanmış ayrı bir amaç vardır:

    • android.car.intent.action.PLAY_BROADCASTRADIO
    • android.car.intent.action.PLAY_AUDIOCD : CD-DA veya CD Metni
    • android.car.intent.action.PLAY_DATADISC : CD/DVD gibi optik veri diski, ancak CD-DA değil (Karma Mod CD olabilir)
    • android.car.intent.action.PLAY_AUX : Hangi AUX bağlantı noktasını belirtmeden
    • android.car.intent.action.PLAY_BLUETOOTH
    • android.car.intent.action.PLAY_USB : Hangi USB cihazını belirtmeden
    • android.car.intent.action.PLAY_LOCAL : Yerel medya depolama (dahili flaş)

    Amaçlar genel oynatma komutu için kullanılmak üzere seçildi çünkü aynı anda iki sorunu çözüyorlar: genel oynatma komutunun kendisi ve hizmet keşfi. Böyle bir niyete sahip olmanın ek faydası, MediaBrowser oturumunu açmadan bu kadar basit bir eylemi gerçekleştirme olasılığı olacaktır.

    Hizmet keşfi aslında bu amaçlarla çözülen en önemli sorundur. Hizmet keşfi prosedürü bu şekilde kolay ve nettir (bkz. Keşif ve hizmet bağlantısı ).

    Bazı istemci uygulamalarını kolaylaştırmak için, bu tür Oynat komutunu vermenin alternatif bir yolu vardır (bunun radyo uygulaması tarafından da uygulanması gerekir): kök düğümün rootId'si ile playFromMediaId verilmesi (mediaId olarak kullanılır). Kök düğümün oynatılabilir olması amaçlanmasa da, rootId'si mediaId olarak tüketilebilecek isteğe bağlı bir dizedir. Ancak müşterilerin bu nüansı anlaması gerekli değildir.

    Program Seçici

    mediaId MediaBrowserService bir kanal seçmek için yeterli olsa da, bir oturuma bağlı hale gelir ve sağlayıcılar arasında tutarlı olmaz. Bazı durumlarda istemci, oturumlar ve cihazlar arasında bunu sürdürmek için mutlak bir işaretçiye (mutlak frekans gibi) ihtiyaç duyabilir.

    Dijital radyo yayınları çağında, belirli bir istasyonu ayarlamak için yalnızca bir frekans yeterli değildir. Bu nedenle, analog veya dijital bir kanala ayarlamak için ProgramSelector kullanın. ProgramSelector iki bölümden oluşur:

    • Birincil tanımlayıcı. Belirli bir radyo istasyonu için değişmeyen, ancak o istasyonu ayarlamak için yeterli olmayabilen benzersiz ve kararlı bir tanımlayıcı. Örneğin, ABD'deki çağrı işaretine çevrilebilecek RDS PI kodu.
    • İkincil tanımlayıcılar. Muhtemelen diğer radyo teknolojilerinden gelen tanımlayıcıları da içeren, o istasyonu ayarlamak için yararlı olan ek tanımlayıcılar (örneğin frekans). Örneğin, bir DAB istasyonunun analog yayın geri dönüşü olabilir.

    ProgramSelector MediaBrowser veya MediaSession tabanlı çözüme sığmasını sağlamak için onu serileştirmek üzere bir URI şeması tanımlayın. Şema şu şekilde tanımlanır:

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

    Bu örnekte, ikincil Tanımlayıcılar kısmı (soru işaretinden ( ? ) sonra) isteğe bağlıdır ve mediaId olarak kullanılacak kararlı bir tanımlayıcı sağlamak üzere kaldırılabilir. Örneğin:

    • 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

    program yetki kısmı (AKA ana bilgisayarı), gelecekte planın genişletilmesi için bir miktar alan sağlar. Tanımlayıcı türü dizeleri, IdentifierType HAL 2.x tanımında tam olarak adları olarak belirtilir ve değer biçimi, ondalık veya onaltılık ( 0x önekiyle) bir sayıdır.

    Satıcıya özel tüm tanımlayıcılar VENDOR_ önekiyle temsil edilir. Örneğin, VENDOR_START için VENDOR_0 ve VENDOR_START için VENDOR_1 artı 1. Bu tür URI'ler, oluşturuldukları radyo donanımına özeldir ve farklı OEM'ler tarafından üretilen cihazlar arasında aktarılamaz.

    Bu URI'lerin üst düzey radyo klasörleri altındaki her MediaItem'e atanması gerekir. Ayrıca MediaSession'ın hem playFromMediaId hem de playFromUri desteklemesi gerekir. Bununla birlikte, URI öncelikle radyo meta verilerinin çıkarılması (FM frekansı gibi) ve kalıcı depolama için tasarlanmıştır. URI'nin tüm medya öğeleri için mevcut olacağının garantisi yoktur (örneğin, birincil kimlik türü henüz çerçeve tarafından desteklenmediğinde). Öte yandan Media ID her zaman çalışır. İstemcilerin geçerli MediaBrowser oturumundaki öğeleri seçmek için URI kullanması önerilmez . Bunun yerine playFromMediaId kullanın. Bununla birlikte, hizmet veren uygulama için bu isteğe bağlı değildir ve eksik URI'ler, haklı gerekçelere sahip durumlar için ayrılmıştır.

    İlk tasarımda, şema kısmından sonra :// dizisi yerine tek bir iki nokta üst üste kullanıldı. Ancak birincisi, mutlak hiyerarşik URI referansları için android.net.Uri tarafından desteklenmez.

    Diğer kaynak türleri

    Diğer ses kaynakları da benzer şekilde ele alınabilir. Örneğin, yardımcı giriş ve Ses CD'si oynatıcı.

    Tek bir uygulama birden fazla kaynak türüne hizmet edebilir. Bu gibi durumlarda, her kaynak türü için ayrı bir MediaBrowserService oluşturmanız önerilir . Birden fazla sunulan kaynağın/MediaBrowserServices'in bulunduğu bir kurulumda bile, tek bir uygulama içinde tek bir MediaSession'ın olması önemle tavsiye edilir .

    Ses CD'si

    Ses CD'sine benzer, çünkü bu tür disklere hizmet veren uygulama MediaBrowser'ı tek bir göz atılabilir girişle (veya sistemde bir CD değiştirici varsa daha fazla) gösterir ve bu giriş de belirli bir CD'nin tüm parçalarını içerir. Sistem her CD'deki parçalar hakkında bilgiye sahip değilse (örneğin, tüm diskler aynı anda bir kartuşa takıldığında ve hepsini okumadığında), o zaman tüm disk için MediaItem yalnızca PLAYABLE olur, değil BROWSABLE artı PLAYABLE . Belirli bir yuvada disk yoksa, öğe ne PLAYABLE ne de BROWSABLE olur (ancak her yuva her zaman ağaçta mevcut olmalıdır).

    Ses CD'si ağaç yapısı
    Şekil 3. Ses CD'si ağaç yapısı

    Bu girişler radyo yayını klasörlerine benzer şekilde işaretlenecektir; MediaDescription API'sinde tanımlanan ek ekstra alanları içerirler:

    • EXTRA_CD_TRACK : Ses CD'sindeki her MediaItem için 1 tabanlı parça numarası.
    • EXTRA_CD_DISK : 1 tabanlı disk numarası.

    CD-Text özellikli sistem ve uyumlu disk için, üst düzey MediaItem diskin bir başlığına sahip olacaktır. Benzer şekilde, parçalar için MediaItems parçanın başlığına sahip olacaktır.

    Yardımcı giriş

    Yardımcı giriş sunan uygulama, AUX giriş bağlantı noktasını temsil eden tek bir girişe (veya birden fazla bağlantı noktası mevcut olduğunda daha fazlasına) sahip bir MediaBrowser ağacını ortaya çıkarır. İlgili MediaSession, mediaId'sini alır ve playFromMediaId isteğini aldıktan sonra bu kaynağa geçer.

    AUX ağaç yapısı
    Şekil 4. AUX ağaç yapısı

    Her AUX MediaItem girişinde, "AUX" ifadesi olmadan bağlantı noktasının yerelleştirilmemiş adına ayarlanmış ekstra bir EXTRA_AUX_PORT_NAME alanı bulunur. Örneğin, "AUX 1" "1" olarak, "AUX ön" "ön" olarak ve "AUX" boş bir dize olarak ayarlanmış olmalıdır. İngilizce olmayan yerel ayarlarda ad etiketi aynı İngilizce dizeyle kalır. EXTRA_BCRADIO_BAND_NAME_EN için olduğu gibi, değerler OEM tanımlıdır ve önceden tanımlanmış bir listeyle sınırlandırılmamıştır.

    Donanım AUX bağlantı noktasına bağlı aygıtları algılayabiliyorsa, donanım, yalnızca giriş bağlandığında MediaItem'i PLAYABLE olarak işaretlemelidir. Bu bağlantı noktasına hiçbir şey bağlanmadıysa, donanım hala numaralandırılmalı (ancak PLAYABLE ). Donanımın böyle bir özelliği yoksa, MediaTem her zaman PLAYABLE olarak ayarlanmalıdır.

    Ekstra Alanlar

    Aşağıdaki alanları tanımlayın:

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

    Müşterin, EXTRA_CD_DISK veya EXTRA_AUX_PORT_NAME ekstra alan setine sahip öğeler için üst düzey ortamları gözden geçirmesi gerekir.

    Ayrıntılı örnekler

    Aşağıdaki örnekler, bu tasarımın bir parçası olan kaynak türleri için Medibrowser ağacı yapısını ele almaktadır.

    Radio MediAbrowserService yayın ( ACTION_PLAY_BROADCASTRADIO kullanır):

    • İstasyonlar (taranabilir) EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_PROGRAMS
      • BBC One (oynanabilir) URI: broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=90500
      • ABC 88.1 (Oynanabilir) URI: broadcastradio://program/RDS_PI/5678?AMFM_FREQUENCY=88100
      • ABC 88.1 HD1 (Oynanabilir) URI: broadcastradio://program/HD_STATION_ID_EXT/158241DEADBEEF?AMFM_FREQUENCY=88100&RDS_PI=5678
      • ABC 88.1 HD2 (Oynanabilir) URI: broadcastradio://program/HD_STATION_ID_EXT/158242DEADBEFE
      • 90.5 FM (oynanabilir) - Rdsuri olmadan FM: broadcastradio://program/AMFM_FREQUENCY/90500
      • 620 AM (Oynanabilir) Uri: broadcastradio://program/AMFM_FREQUENCY/620
      • BBC One (oynanabilir) URI: broadcastradio://program/DAB_SID_EXT/1E24102?RDS_PI=1234
    • Sık Kullanılanlar (Taranabilir, Oynanabilir) EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_FAVORITES
      • BBC One (oynanabilir) URI: broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=101300
      • BBC Two (oynanamaz) URI: broadcastradio://program/RDS_PI/1300?AMFM_FREQUENCY=102100
    • AM (taranabilir, oynanabilir): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="AM"
      • 530 AM (Oynanabilir) Uri: broadcastradio://program/AMFM_FREQUENCY/530
      • 540 am (oynanabilir) URI: broadcastradio://program/AMFM_FREQUENCY/540
      • 550 am (oynanabilir) Uri: broadcastradio://program/AMFM_FREQUENCY/550
    • FM (taranabilir, oynanabilir): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="FM"
      • 87.7 FM (Oynanabilir) URI: broadcastradio://program/AMFM_FREQUENCY/87700
      • 87.9 FM (Oynanabilir) Uri: broadcastradio://program/AMFM_FREQUENCY/87900
      • 88.1 FM (Oynanabilir) URI: broadcastradio://program/AMFM_FREQUENCY/88100
    • Dab (oynanabilir): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="DAB"

    Audio CD MediAbrowserService ( ACTION_PLAY_AUDIOCD işleri):

    • Disk 1 (oynanabilir) EXTRA_CD_DISK=1
    • Disk 2 (göz atılabilir, oynanabilir) EXTRA_CD_DISK=2
      • Parça 1 (oynanabilir) EXTRA_CD_TRACK=1
      • Parça 2 (oynanabilir) EXTRA_CD_TRACK=2
    • Müzik CD'm (göz atılabilir, oynanabilir) EXTRA_CD_DISK=3
      • Hepsi tek başıma (oynanabilir) EXTRA_CD_TRACK=1
      • Reise, Reise (oynanabilir) EXTRA_CD_TRACK=2
    • Boş yuva 4 (oynatılamaz) EXTRA_CD_DISK=4

    Aux MediAbrowserService ( ACTION_PLAY_AUX işleri):

    • AUX Front (oynanabilir) EXTRA_AUX_PORT_NAME="front"
    • Aux arka (oynanabilir) EXTRA_AUX_PORT_NAME="rear"