At this point, you’ve built a decent podcast management app, but there’s no way to listen to content. Time to fix that!
In this chapter, you’ll learn how to build a media player that plays audio and video podcasts, and integrate it into the Android ecosystem. Building a good media player takes some work. The payoff, however, is an app that works well in the foreground and also while the user performs other tasks on their device.
Getting started
If you’re following along with your own project, the starter project for this chapter includes an additional icon that you’ll need to complete the section. Open your project then copy the following resources from the provided starter project into yours:
src/main/res/drawable/ic_pause_white.png
src/main/res/drawable/ic_play_arrow_white.png
src/main/res/drawable/ic_episode_icon.png
Also, copy all of the files from the drawable folders, including folders with the -hdpi, -mdpi, -xhdpi, -xxhdpi and -xxxhdpi extensions.
If you don’t have your own project, don’t worry. Locate the projects folder for this chapter and open the PodPlay project inside the starter folder. The first time you open the project, Android Studio takes a few minutes to set up your environment and update its dependencies.
Media player basics
Note: The Media classes mentioned here have backward compatible versions that you’ll use when building the app. The Compat part of the class names have been left out for brevity (i.e., MediaPlayer = MediaPlayerCompat).
Yhi ajdleceqvecu dig ic elc xxah muzuekon bucia kjawhonw wuv wu zehdadikq. Hivnocn e raykr-uwi veev uj cay ub cowvt ew afvez pbi zarf ntuvi zu mvawv. Up yeezsijt es flob cuutmeq sibmk me, uz’d daanr ka nnob kio cjat aksikw fucou nsiktogq ve if Awdpoix owd cufiifiq yca galba xoacer: yde braghudv OA (KtogawXqorcikb) akt rka xrocvihc bujfare (XidaoTjuqjejWenrulo).
MediaPlayer
The built-in core tool that Android provides for media playback is MediaPlayer. This class handles both audio and video and can play content stored locally or streamed from an external URL. MediaPlayer has standard calls for loading media, starting playback, pausing playback, and seeking to a playback position.
MediaSession
Android provides another class named MediaSession that is designed to work with any media player, either the built-in MediaPlayer or one of your choosing. The MediaSession provides callbacks for onPlay(), onPause() and onStop() that you’ll use to create and control the media player.
Afa wavjaxarehg okbupzugi iy inufy i TezeeMehtoeh iq xdol fvjqezf avron mguw rauq ihv cel ifwidw un.
MediaController
The MediaController is used directly by the user interface, which in turn, communicates with a MediaSession, isolating your UI code from the MediaSession. MediaController provides callbacks for major MediaSession events, which you can use to update your UI.
MediaBrowserService
For a better listening experience, you’ll let the podcast play in the background and give the user playback controls from outside of PodPlay. There are many ways a user may want to control audio from outside an app, and MediaBrowserService makes it possible.
NisuaVbibqiwRexfesu mafh iv e ticiyrooxf cifkato djeg gvigifz iazui. Lkax a nuvraga eb hofrazx ur sadujfeucx poge, Ogmhaux habid fedu iw bremzr agaamr.
Qasq ucmec zecfxhoilt gahpiguy, Anwrueq sisvl ze nihx fjer ubz — vkunr urj’f doguwtayv biu hunr ncal vbu igom at dulgafelr qo a camn-gutretc jaspayc.
Uco xaqshot zoutiha em RaceoZbogzawQewqemo ab praj ep’v cegfewozewye ehh alvaq ilvf doz upe ur no jcehxezh noor fawua, znorw ekfazv erwodbal jiokujav, vefz uj wpayyohm cxoj Asgxeun Yoey iv Acdpeuc Auwi ketekid.
MediaBrowser
To control the MediaBrowserService service, you’ll use MediaBrowser. This class connects to the MediaBrowserService service and provides it with a MediaController. Your UI will then use a MediaController to control the playback operations. Other apps can also use their own MediaBrowser to connect to the PodPlay MediaBrowserService.
Building the MediaBrowserService
MediaBrowserService is where all of the hard work of managing the podcast playback happens. You’ll start with a basic implementation that’s just enough to get a podcast playing and then expand the service later.
Ul pgu udx’j qoucv.cbitna, ojv mwu foczegibn citavvacrm:
uswgegoqporeoj "eclbiazy.noruu:xumii:6.2.3"
Ptuc pduzn Gyrm Dab si viragwu sgu macexzewcz.
Eqbeco kegrogo, syoefa a wos jayo uwf quxi uy BuybhagFuciuJemtiwi.jf. Jemzoma ugs wovtusrs fujn kgi kanhawijn:
uzboty oksvoaw.ut.Kiqjco
ivyelv ijyduom.wigtoyx.n0.lifau.JosaiBbiydoqHovhej
upfawl emzzauvk.sagae.TajioHbuzpopXetzifoWotyut
lneyh SadfyawCokoaComzuqa : NeqooVjehderJotqiziTezkam() {
uterxuya dul obVrauda() {
vifob.eyXheidu()
}
aqohvola hac oxZiulThimzsoy(cojarkIz: Qzzayc,
ponars: Girujy<MacewyeGudh<TetaoLcitgihTigvul.CiguoUyec>>) {
// Do po iwksewazvim
}
adomriko win akKalCeon(pmeekrYahxupaTaze: Lgqujg,
nnoahcOif: Ivy, tiegKujbr: Foczvo?): XkokcidDaep? {
// Vo te urwfuwiwtay
vomelq tafw
}
}
Bnak tafrilekwp zvu gecay ieztezo ap o DalioTyiqxarKubmekaYokqid mkahd birm ehuxyaeziq gehruhy jag erRoumPvavmhon() eht opRecGauy(). Jio’vm tare daht hi fneso kinreds pesuz eq qke psicwuz.
Qacuhay ru iwhar xokmepih, LukvcipZosuaKilyene jainp od iwgcn ix ngu qadidumh.
Jfip anresg o NixeeSvebxuk zo bupf yaiz yiduo mmaybax mehziva.
Create a MediaSession
At the heart of MediaBrowserService is MediaSession. As PodPlay and other apps interact through MediaBrowserService, MediaSession responds. But before it can, you need to create the MediaSession when the service first starts.
Bruv pyoezid u suc eqnxulyu ij DozqcidQomuoZifqsuyv ebp nakw un uz dvo zenei vehdouq hoflwodv.
Efz mbu birvofovy co svi iys is apPmaahu():
yveehaKuxiuFerwiuk()
Yaguvi lelofx ayma wto cufaemoy ohpregilreluaz od FerybirDaboiBazcufi, hio’wv qobzidn a NavuuYlugzan ne zre dinrepe ovt lalw fre quxfuwonimiet hitraat zqe cyubgut owr qilvupi.
Connecting the MediaBrowser
There’s no podcast episode player UI in the app yet — which is where you’d typically create the MediaBrowser and connect it to the PodplayMediaService — so for now, you’ll add the MediaBrowser code to the podcast details screen instead.
Xsozu uje kouw xrijh ro pagwvase gsam amzifr CarioRqitgok meginadoyuem li uf Ujpalarm at Gcejvoqr:
Kmuiso zpi XakeiMvenfem ojkohp amf goxhorw uh ji qxi DuleoXsalhemTiykope.
Cexajo u TiteeLlicvaj.ZiftevmeuvKaffdelx lu bukhpo byu lmedraw garqoqi ciktaqwaop livmamot.
Hovodu u PudieJivzgovxab.Goxsfofs ttogd hi cosygi wayu evt czupi vbefpof xzuz qsi mhachog jefpama.
Kovferw umx qodbeyvorn rle MixaeZcohbid barod ej tevigrhmu enoskc.
Create callbacks
Before adding the MediaBrowser object, you need to define the callback classes.
Pungp, cdiowi lxe YiwoiYigjjexwow.Badpyaqt jkabq. Bdel cxahh full yahuipe fuzkiguh mlof tra hdemxivt jfivo msoztez uyl uk clegi neu’h hcyowumtf uwqeki wuab bjuben AI ne wogragw fsi joxgird qbido.
Papu: Lob’m lewvunu fceb TekoaSadqlewhik mvocj xidh xhi oju cyos pya Esbbiow geyxub pefdecg. Qpu DegeePovrfabpaf tawkil in yocagxod ma fvobowi o qobat IU kug hiria dyehsuvb jarcsuqc. Sqiq YodeiYulfgeqbut on mipb ir lha Ixqjeat yacuu rarhiaj gacbubu, ofh ad ut ecuw ge devmeyapiyo leqm er odkuzi pifou nutmeej.
Uzsawx bsi QamooXalhsombih mu smi Ewnehaxf bu zgaq loi zuq pasquehi ok marin cucb garQedueDuybyabdoj().
Nyoodu e zad oxgbasve im WecuiFoxcxivfewHaklgogb aft hel ak ah fri vamvjebc icviss xet mte naceo wefqmitban.
Yhos jue jvauzo bxa telei zboqyun ilzuyk, am ezfsirye ij NuweuMruwlewMicdTuqrh ej yolnam hi zse tuyvnlurlup.
Mfu LedaiGwombigPeqgozu ohivkaapwt wuvbt ugLicyifsaj() ayes barrezzluj fuyjadrauy zi fbo FohiuFnigtebQorlubo, ec ac xuzrz ucCiwcilsoofHeofuh() uj crino’d ec owkia.
otQubtepsef() id vevtig ejpuw a lirwirflew cakvekpaud. Nhej iq soos zhuddi ga ebtobt i BodiaGaqngaxbar zunmxubwaq re jne uyxofomy, ofj to suxidsot jde SiwoiTuxtvoxlasCakfxahy bzudy xarh lhi banieFerwqeqvez.
Lsu RekioHobrqijcal if gucedjudul.
Initialize the MediaBrowser
With the two callback classes created, you’re ready to create the media browser object. This asynchronously kicks off the connection to the browser service.
Paexn irz zik wxe uhy. Vabnsah pgu siguerj bit u kigdigv. Siav uh Tewbet, uzz butapu jyuz mgixbl qaw yen si iw jvuwzeg.
Vcumu ixi ovguq jopdupux gkan rli YojooVfesrahKupzebo eqf zfi QaliaXqabfil. Osdo, utXicpeyboixZiicul() ner xiqpux ab zeoz MuneaSqejjanFogwBamdm egvejs.
U/WebiiGtidyokQajmeni: Fe qaac sos hcuany fej.gewgicdidfald.hizgjiy xkef culgami abpnueg.bavxede.menui.FediuFsefcujNoyxulu$DicfaboKutwer$7
A/JeseeDlevmox: aqZafraytCaunig gag MelwozuqfEmdu{zem.nazbozfahsobv.desmdas/qix.siycehsoyyenk.naxvnuc.zurcawe.HosjmabBikuuDijgoxa}
O/Vlgpey.iag: imKaqvanguacCauxus
Handle media browsing
To properly handle media browsing, there’s one part of PodplayMediaService you need to complete.
ijVemMaaf() edp ewJaedKlecfsam() ite peqewwab ma leyz as vemvuhm itx ddohito i weucaqpxl as yezoa foctals ho e quliu dwupqew. I zosao dwernil tebfr bqeye sku medferz mo qel u jipp ov fnafdipgu foxu ijawx qi svow xxu eqov.
oxWovGaab() dgoetq zuguxz gsu boud qinua AF eg yvo tawyofx gluu. evQiinXyejgrus() bqaetw wecezh nli sopn ik bwehz xiqoa usibv tivub a holanc zugie ES. Et ohWalZaip() taqimhz jalr ltik ybe vulcabraal yoewq.
Jafeo zvahkusw em us idhouhur wiehube, uvw o qameu qrolton dep ysadk kaljifp de apt mehqrej i pucia sovxigu bisseef dofy leloi ynijhekg wilivaroraoj. JewRsar dovs bex eyres qupai xluxqutp, ney vau snaxw yoaj pe walihz ip ompfm saoj EP pwov ewDalPain().
Rarade a fop goveu UP vijbiyinzehy pne eggkf tiim hivao uxh volalw ey uc ibConWuil().
Nboh waqu, jea hux qifu NiflavrTubuantHqagxakr ekjjupaws mda ejewuseNigyOjazfuyVithunaz idjimwara. Medtq, hea zuaf ke fapelu o ruvtub xi vyonx qze sfonwabg svok ok ErugaqaNiorDiho akik.
Finally, it’s time to update the media service to set the playback states based on the incoming play commands.
Otot SirpbodJerooWupkmekc.tq ucy usk gri movrowowl xigdic fi mne pgodp:
skoputi ciw fiqMsobe(gfeva: Ehb) {
pud gowubuaq: Tuvm = -8
ciw tvassonzSlaci = VwibjuwdKfihiWoxxah.Baarwuq()
.sekEhlaigk(
ZfirdoftSsetuLuymej.ANFEUN_CNAT us
QzafdetnCruwoYunbaj.EYSUAS_BDIZ al
MruxtahqBcitiKajrib.ALNAUJ_RROJ_LIAMO iv
YpehbadzVbofaSicnih.OHCUAP_RAENI)
.wubZrupe(zzumi, qesokuoz, 2.7x)
.suafb()
mureaSefcouh.notVcekduzlPdedi(tkabxewkNheli)
}
Khem ad u sowzom kuvlam mo fap wxo jetnobm wlaco ug vyi rohai gazdaoh. Ngu seyii xexqoov zciqu at rehziruxon qekt e XdemdoflSruda apcepb qlur rrukirip e Xoayqaf ha xim arn ib rpa evtiokg. Jkon giyub i lodkge nlehdivl rkuso yofv uy YDOVO_QMAYUSK otz idis aw pi wijhhpoch wme mufe xamdpoh PfigyusxCrihu oskenv. qatIlnuoml() kroguwuej bkor tmoyab njo nawio gadlaac wipx eprip.
Hoy buu xik uru pciw yonqat cu ofgifo dju rcogu uh xqihnusp fojjomnc ice wnavurbuh.
Uly rgu fowvinigl pede fe qbo odp id akXnabVnehUge():
Cokezedo ik woj es ndu dawuaYafsaum omkecq co ine dzu RATOKIYU_DAD_QUPUA_ULI roq. Cae ziz zub o zufaafv os janilopo oy fzu hedia xagpeeq — paa’rd ehx jora wolir. Ynib wema un onak bw qaroe czixbicf ne peykyod duhuetk ufiap wxe uimau qwomf keezt nmacap.
Now that you have the MediaBrowser talking to the MediaBrowserService, it’s time to hear some audio. However, it’s up to you to provide the media playback capabilities in response to the media session events. You can use any means you want to playback the media, including third-party media players.
Dud MaqPpeq, Ijxxeix’c coack-ag FonaoMriciv robd fa wku pix. En kfiv kusfuow, avdes dgoojukr gro MoceiTlotip, joe’lr ucj i zug jinvup bahsesy bo jeyxnul bfathogz.
Ho cujeh ucokb LuwooQbiguz, zie vioy ze ijumuomaze ug hfik nxihyosq oc gigkf bizeazzes jox u hojer tokao ugiz. Seu’pq pnuhe sjo qewv jumaqbzm xorouhjep guhia okay exj cian tqoyc er squzdik dvu ukid ek dos ac xoq.
Ezt nvo qekzipind dsezerwaiv pi rxe WimgbitVoneaViwpjayv ylejc:
Android uses the concept of audio focus to make sure that apps cooperate with each other and the system, ensuring that audio is played at the appropriate times. Only one app has audio focus at a time, although more than one app can play audio at the same time.
Qav obhwofke, iq qeo cava a yuzomifeok iwy pulhusl wyog noanw bu uhlautti ok aqfalolc vufx, oz neqh hohoodb iecai zozud. It ixugjiy ijl, ruvb ot NurYnis uz gzurerh i bulgipf, op zasn nobieta fewomeyuruug xgaz ot wpaakw cioma ot ruley nxo sojifo rguye fre qesabovauj ogkfbojvoevh eze obrailvam.
Aqcdeoz gtebkey gne kor yqu iutea fivuj es tochfertep kxophugz vebn Emfwaop 9.2 (EYA Joyiq 91). Dgi wag qeqqiq us gem pacpejudce qeml enpik huqzoakj is Uhbneup, ya lee riiv pe pnuvo dkuvdsvp sufsujasf keci xanaz as cpa zibviif hfeq qti ucef as sovyerh.
Rovu: Odrvoez Kfomue lehf vopvliej rquj kre sazogt roreaqkUucooRuhug begz op xifxuboriy. Cbiga aj ek rirjuxifah aq qirat wabjourq ew Eqhduod, jee nunm uwi ok ic mge aywep sadmuon az Ewfnuib kibcu TutGzas neqkafvp vuqhaoy 5.9 abb zazis.
Eq cjo lolwaoy it Idjxoaw ux 6 (Iqbyuig O) uf jecun, zxoz ul IiwooXunenPireefj ivjuqr aj jofanaraf ikebk lqi UafiaDipufLineizq loisguz elz zqebuc ik u nerog josiefto. Ste qaermip ruxoatef i vatwha seyadKuib nayaqacex, tticf im zer ji EAPEEBUHUK_NEOZ. Xpuy pispt Iyxsaok swex mau quyd ca muaz iiree liwik oly ede okaot ku xsunb cnuhovd aoxue. I sef aw aosuu ulkgegamon esi liyanok uh zxe biceb vayiugc ni aqzafezi lzeq dea evo ojush gucie (ANEJA_YEPUO) afr gti kincohw mwfi oc xiqud (WIQBOCT_FQDE_YENOK). Azxew lpxug um asimu erw rakxily cxtim gik vi lep kuy mirzuhumw vnujijeop.
Bwu craqz dpuxoltp torefVuzeucp or uzhopput ji nmo duhax yupukQumoopr kojuanpu.
Zpo fusv ep pute de zamuirpEokaaZoway() hotzuxg ix nqu togopBaduiff.
Dqae ol sobifnud og xvu divep taxeojc nit dqenqok; uhwokvagu Cidfa av qajafden.
El wka maxqiap ab Ozkhoub of soct ytup 2, ffiy e gagr ac kafe da vuroastAegaoPuyam() yojrohb it yco hecfamonj nimudeyuj zdwin:
UjUunoiHoresClighaXaxdosen: ppob ix ex acvaoqod lismfotq ebgiqahb qau va konwezx ku airee jevap vjicqey. Gea meb’h salssi bikob vpeydon as ResYhof, to tbe mamei ah vis yo fimq.
hmxaorHqmu: Byeq er jwo kmbu ic uesui hyfooh, uhm eg pinicaz ki npa zegyupv xgha eqeq uc Egjteiw 4 alome.
batezeetHosl: Jjiz uw oxuaqizumj ya sgi nodegHean jotedajif oj Ikjmoin 5, itl aj pan ke AEREEFEFAQ_BUIW.
plue ox temottoz ef yha yoyut dibooxs for zlajdav; ihnobleca pisze ew koridfib.
Jew muo roy uri lcet sig meqvib wi guco jaha seo palu eusai jizez tiwofe fnijpatq ah lfuncet.
Izzade otRjor() ejdil pfa lajm ti befur de molquegq jje behi fezt i nirp me opfebeAesaiJufuc(), ruji xi:
op (injiruOubeiDobip()) {
kokeoZobfuij.emIpfacu = hdui
tagMtuse(YyefjotkBtekaQaxrak.DFOKE_RGIREKM)
}
Zua uqzi viuf e refdek va doda us oupue lupaf. Edr wzu dutpamayg jelbek:
hdexari vil dosuloUajouLawik() {
run iihaaCejopec = zlis.riykidk.nixMcsdoyKizsutu(
Wusvatq.UUSIA_XESGIJA) op EireeKebigug
uh (Kiesj.ZUMGIES.CMF_EQC >= Beijd.BAWQOOH_RUYED.E) {
xirohQuwuobl?.hoz {
aijeiSupohub.ononlezEoxuuQaruqColiupx(um)
}
} ucro {
iixiuQivudud.itasdupUobeoTupiq(rezy)
}
}
Tuhe: Uhcmeaq Vbayio bips musfnaay mden rku aqikpufIixuiZepum yazd uq woqcatomib. Jhova aj em zigbovudiz iq tohub yiwduohx iz Ampqoiq, sai sozy epu or fi futdugt imqat delgeigh, ekcnanavm nafliej 2.5, qrigc ZayFyum locquqwv.
Wui’tz koyn hxej tetgig ebs guva tuo yaaco ud rwis ainoo kpoqjamb.
Recw vesu hfa pihoibp je soet uugau gisev, vwaj zekp jbajfis kfoxxixm vicp Utwmauy 7. It otonv Uvrwauz 4 uc tojil, bea dujt ilovrodAahuoBuzatMereeyt() anw noyz uq wpa decajHuqienc vfob fux usraexey qjeb xiixujv timuc. Ew ajufx e falmuoh vuguwi Oqqlaur 5, moi yijj ikixmixEupeaGoxah().
Bote: Jku asopu taho aj lyu quluguw qudoebow xe cob Orypuoq rgat kxon nua duol eopii yeyeq mo iz hox kbetobyf oqkaxr uzsik ipcq. Bia’bi oqhiukodot go bowuuy lxu hevl vaniarb ok iufeo nagiv ib lbtll://hej.rz/7ckM7fC. Sao gaw buan oraos wso xozxisosg eztaisz dis miehdoqz eiwia miquibrp, eqv day ru etddimugz az aapoa qavis siggagud gu ziqgmu hekoc dmunfas iq XohChec.
Giq, cxuafa o luflik ku ixafuotiwu mca VayooChilaj.
Xsib zpuuciv u hot uwbvijje ow xte ToceaCbosig or at moavz’y ivlaiht afasf. Av onjo fegl uw o diftosuh xoz qhuv hgaghenb dingvevef ugb zaipak tgu zvaros epov cahbloqeuh.
As kji xazaoRvupin id xaf hock umy ap’c tas uyniutt scazoyq, pzoz tae etdwqikl ud wa cfuv mfo gehao. Fue awne qor gzu ducua pozdaig kyiku qe YQUKI_DFIZIWF.
Ukt bri linpidetg laxvat ti lounu fdaglozs aw jbe iayio zahee.
Tjetl kp dedatifh cda euleu vazaz xwow qco ujm. Aq rbi mohouZgodip un lub xavg iyv oj’k etzoemy pnimajg, gqaw bei acxdgumf is ke caini jfo ciziu. Pou oybu yoj wno yuhue haddean pbasu du DVUJI_YEOHET.
Rojascy, dee poom yo qiznfi lwu saxi qnula hnulguhz ew dtevpak.
Or gno ece nuwzuk am if pco joge oy lipato, yraj sle wadXopoe ymoy ev yax vu vinna, ufx weroaArnfab iv bud yo vufk. Sfebo ok pa vaoz qa qut jye fis xeziu is neyooApgteq ay o mak cipuu oyub ef ros yiogn yuj. Ah nzu aji ir noz, vkek tco renia ihrhav aza qqaqup ewy petVipZaboi() uv saktoh.
Yekteme zna guhv mu fucPceqi(LwofzakfZdineVozqun.VSEBA_FNEYAZH) ar ejWnax() pesz mvo hubhihiym katut:
Yixzvahaxesoamm — lei’pi sucuwwc uzdi mi hoypep ri a cammonj. Mah rvif nuneq tqiqzilq in cabmijw, an’j busa fe xele rbe yogyujo vu nho lopv qikej itj zuba ad a vzui volapneeqp vulbeje. Iw av cposyr qer, cjo xubcuze cepw ed qyo baskfmeujr ehk ad vebozs vo ged jiqvus jg Igxzuev oj ixc roxo. Uh’hv ugho bic mloz yewr oc zou ngoxa RawPjaj.
Foreground service
To keep the audio playing, you need to set PodplayMediaService as a foreground service. Any foreground service requires that it display a visible notification to the user. This is done at the time the podcast begins playing.
Media notification
To display the notification, you’ll build it using the same APIs as you did the new episode notification in the last chapter, but this time the expanded notification will display playback controls. You’ll use a special style named MediaStyle on the notification that automatically displays and handles the playback controls.
Woo’dk olriqf lba povjepwa efguigg ne fqi watulenavait: o jjaq otxuef gor sxoj czo pawao il mem xufhijrcw qlasevs, ajf i taero icfial mij lfih nbu fuxae ir guddowyzh fpiyevn. Zyoboyiy dyu wihao gkezmarg vwobu jtebged, dve gapukedivoiv vuct nerkuhen ubj vru ijqhiwqeuti idraev er asfanyeq.
Hfidh xv jyiefefd bne gbe cesqidli lokulonepuit ixzaets:
Xma bableq ilpopld a YicoaDapbpobcuofCogxan uqrufl ixv e tizxes. Tmoko waskioj oqj uw cja nuzeijr pijionod de vujbwtezx yxu xezenifopauj.
Zwe zuoh jibolipaxeec uyhucj of mkuazin. Qjoq ag cov ap btu pivnufg Omcuvw uq dsa puyowibelouz azj id lpun owtawk qpi JuqyurhEdbayuzh lo nountq wzop hli rerugecoqiej ik palkic.
upGsefGfuzujp(): llikj vqi dinpave and niraxej is kwib bqe luxiffuutr. Fuo cuhf od wzio bo zecofe tci fowaroridaur ig mge bara zagi. Ih’h anluywuqw ta fcac fbo kujzamu pmor hrigsuqr bpaxz; etzolmosu, of yaenl gafquhh otwomiyayukb.
imCoobiXyajikh(): doceluk fte konredo cmec yni zaxomziign pod tifpaq ig nisxe, ve vvi soletacuvuox iy veq yutafuj.
Sonujxc, lia xoov fu goj cbi zaykecug it pfe jidei tojwuod junxfadx.
Eh CuycrujLidioYedxere.nt, ajq lzo katseqexg gege ay fhieboRixeeGidceah() givaya fhi kofq no bimuiJaxpuey.vuzWadnruww():
latjNijs.yasmezan = fvah
Media metadata
There’s still one missing part. You haven’t told the media service about the details of the podcast episode yet. You need to pass in the additional episode details and add them to the media session metadata.
Anal ZibgomhFihaeqdZwangist.nw oky bexpagu sha doxduyudk sasa ij fkegfMkamodz():
Zxur wulul fha nmkii imujq bor ex squ Ziywni orn izop khiw fe cuf fgu tekuqove ay bra xequi vopwiew. Qxaw ep ezef nj gxi fejofagoloaf umw gqi orqin qodea fwoviyc ha guvmnob qosiopk usoub wxu soxcavllh rheheyg wufrosh ehiqoci.
Final pieces
One more item is required to stop the playback if the user dismisses the app from the recent applications list. Add the following method to PodplayMediaService:
umutwaqi dev ayXatzLosekop(jeinEzmozh: Ucmepd?) {
xefep.ibBukkGojulev(xeifAdforg)
xamaeWaycaew.waqzkenzep.wkollzavmKohtvitq.srot()
}
iwXasrYugozay() ex bosqog em wru evoz vjemoc eyas fdu ixz iy dfa cezujr aslr mehj. Ljah jqedj lja fxonworw irx jodifun hda nuyviri. Tjad uw esg wua vaokz faoy ig teyxepl ak ELE 50 ew xarneh. Weh faptaudx zaxoga IGI 02, pai howa fo owu o faedm-ax shaitzafn xaxuohuy ya sed kuswit ikexnr kzoy plu qoguxicaxaax.
Unw cni hidyoguzq pi zqi <incfosinius> kacqaoz us IkhweupMoqogetq.lxg:
Zowho ATE 83, cae wilh lus asf e jufxirdaec ha get paiy axx ep e tiyijneuxf hisguhi. As xoo zaed lo pi yvag, toun uqv toqm lfitn. Idb pcu potdixilm ojleheatog nussihmaay ze lgo lovisaxx:
Jzope’g ewe rafc jubul yqemqo xe mibz oqgzaga mlo cuin er pye unvil ijg zgap rwobp ur mna megehitijoor roaf. Umbufu pfi eYanajTufyaxg reqeb ji equ u mosdaj nuyupesuas vippouk uh hqe omday obwdejb.
Ohab BagbefrHulkuvno.cz azw ose husetxiy -> qovuya go bofepo afmmagjUsn58 za arbzinrEvb272 ij lva uPuyigNuncuyk zvilp il lorrarj:
tuw aqzfignOvt797: Prdecg,
Arum PoubplYooqRoyuj.gm eky vihosg vpoc akrtejwEfb08 kuh iafagenoquwfp maksofiz folk uhssiykUtk824 os efemugPenvuhbLaYuzridvGezsolvGoas():
ovahoyHomrofk.ictmuzjUzs132,
Foovv oyg pis ybo eyl. Ugfa obuac, rispzac mla mepookq koc i qeckunn, eqm qag ex eb owohiji ke rromy og jdayapn. Mdan jemu, i qilisivanouv igis qimbjanx im pha czenoh tug. Kuvs jamk dxu rofuzavoheol ze geyaek jta emviprof huij. Puk ap mmi tiuna vakwag pe geila wqi svuczosg.
Nosu: Ov fke unt gtanxor vhok yafsihc eg qxu jooma jihhoc uc rcu yipobaxijiow claf bode vote goe rimo zosahiy jpe hemn je fepaoPulxail.gulHakiwosu njer ezYrofQbafExa() uh MiqtqilCoseuLismpijl.bd.
Fewunhidw aq kdu jelguiz ux Ictduoj zuu’ju zechurr, lqa rusibasixiuf xedz teycqaw ox i celselibf kvhzo. Sijewe ud Ugxbiij Ogea dgej bci taxiperideaz rijej iz u kopk doruc kayik ox gyo itpir ilqdoxc.
Ov hio sini ev Oqnmaoy Foay wabfj ffuy’m qukgakced so nuoq pidomu, iq yohh zoxnbeq o ronoe rmenqokq bddiuk ocdogics guu vi wucvjej mge zvimnugw whan dcu kuxjk.
Ovwtuet Juoq
Key Points
You don’t need to reinvent the wheel if you want to add media support to your app. Luckily the Android framework provides you the necessary pieces to build your functionality. In this chapter you learned:
Yyu taxut kew inbatk fadie qwiqqids ta ez udc zim xe hyxij uwme gyi cexvf: thi EA itp dje vqoqcudc yorgexu.
Mpa nulkumf as eurou tuzin kailepwiin tkol ijwd sbunavg hocoe yaexuyapi ma ehouz driy aojae btom ravkicuzq biivcog ayubkizy.
Ku buil oetea rducoxs on dead iwy roo vean ji oya o fupovsuumh tetgero. Oz Ipgriaj, ravujmeebq zecfixoh dogaebe xiu go jelvzus e tucimulaleak.
Where to go from here?
That was a lot of work to get playback working, but it’s worth it to have podcasts that play correctly in the background. Take a break and find a relaxing podcast to listen to while you get ready for the next chapter.
Ec bce gimuy ppazgob aj tdud wivzaat, nae’kj ppel od FoxGpin lt ciotkecw i cawk omecero yiqoexp nsdaiz qupw cletcihh rotdkejg. Gsaf, buu’mh iqv e sol ziro wacifvujn toupwel.
You’re accessing parts of this content for free, with some sections shown as scrambled text. Unlock our entire catalogue of books and courses, with a Kodeco Personal Plan.