Ilgas debates par to, vai dot maziem bērniem piekļuvi planšetdatoriem un viedtālruņiem, notiek. Daži apgalvo, ka tas ir kaitīgi viņu acīm vai psihei, savukārt citi saka, ka vecākiem pašiem vajadzētu spēlēties un lasīt kopā ar saviem bērniem, nevis mēģināt viņus aizsargāt ar sīkrīkiem. Zīmīgi, ka šos komentārus bieži vien izsaka cilvēki, kuriem pašiem nav savu bērnu. Un viņi nezina, kāda svētlaime rodas, kad bērns vismaz uz pusstundu apklust, pārstāj visu apkārt iznīcināt un mierīgi guļ uz dīvāna, skatoties multfilmas. Vēl viens arguments ir tāds, ka bērni ir ļoti jutīgi pret vecāku rīcību, un, ja vecāki pastāvīgi ir pielipuši pie saviem tālruņiem, ir ļoti grūti viņiem izskaidrot, kāpēc vecākiem ir atļauts darīt lietas, bet viņiem – nē.

Vispār jau mani var mest ar sapuvušiem tomātiem, bet mans dēls, kuram tagad ir pāris dienas pirms trim gadiem, laiku pa laikam guļ uz dīvāna ar planšetdatoru un skatās multfilmas vietnē YouTube.
Diemžēl es ātri sapratu, ka bērnu YouTube ir vienkārši ELLĪGI ATKRIETUMI. Pat Habrs par to jau ir rakstījis. Bērnu kanāli ir bezdibenīgas izgāztuves, kas piepildītas ar aci satraucošiem video, piemēram, "simts Kinder Surprise olu attaisīšana", "stulbas atskaņas ar draņķīgu 3D grafiku skaļas mūzikas pavadījumā" un "sacīkstes ar automašīnām Beam NG, klausoties stulbos komentārus". Nez kāpēc tas viss ir neticami pievilcīgs maziem bērniem, kuri steidzas klikšķināt uz šādiem video, tiklīdz redz tos ieteiktus. Un YouTube neļauj pārvaldīt ieteikumus. Pat tad, kad iedodu savam dēlam planšetdatoru ar "parastām" multfilmām, pāris minūšu laikā es redzu, kā viņš atkal atrod tās sasodītās šokolādes olas tikai ar diviem klikšķiem uz ieteikumiem un atkal sāk tām atkarīgi kļūt.
Pietiek ir pietiekami, es nolēmu. Tāpēc es sāku veidot savu YouTube lietotni, kas ļauj atlasīt kanālu sarakstu un rāda tikai šo kanālu videoklipus. Kā es to paveicu, ir aprakstīts tālāk.
Lūk, viens piemērs draņķīgiem video, pret kuriem mēs cīnīsimies. Slikti veidota, bezjēdzīga 3D animācija ar muļķīgu mūziku un 142 miljoni skatījumu. Nez kāpēc šādi video vienkārši zombizē bērnus; viņi ir gatavi tos skatīties atkal un atkal.

Svaru salīdzināšanai - kur Kriss Hedfīlds dzied ar ģitāru SKS, ir skatīts tikai 40 miljonus reižu. ar īstu bezsvara stāvokli (bez kabeļiem vai hroma atslēgas, tikai godīgs bezsvara stāvoklis uz speciālas lidmašīnas) — tikai 12 miljoni, desmit reizes mazāk.
Starp citu, reklāmdevēji pakalpojumā YouTube , jo reklāmu rādīšana tajos ir budžeta izšķiešana. Bērni skatās reklāmas, dažreiz pat noklikšķina, bet neko nepērk, un miljoniem skatījumu ātri vien iztukšo budžetu.
Problēmas paziņojums
Uzreiz teikšu, ka nebiju iecerējis izveidot bērniem necaurredzamu lietotni. Šādi mēģinājumi jau ir bijuši, tostarp šeit, Habr platformā — viņi visu izgriež, lai bērni nevarētu iziet no lietotnes, neko iegādāties, atvērt pārlūkprogrammu utt. Ir arī iespējas ar aparatūras bloķēšanu, atspējotām pieslēgvietām, pielāgotiem Android apvalkiem un citiem sarežģījumiem (piemēram, (2012. gadā projekts, šķiet, joprojām ir dzīvs). Taču tas viss ir saprotams vecākiem bērniem, kuri jau pēta savu sīkrīku iespējas. Bērniem vecumā no 2 līdz 3 gadiem nav nepieciešama īpaša aizsardzība; viņi lieliski skatās video un laiku pa laikam noklikšķina uz citu video sīktēliem. Galvenais, lai šie video būtu pareizie, nevis jebkuri YouTube ieteiktie video (kas piedāvās nebeidzamas šokolādes olas un mazuļa pirkstiņus).
No tā radās prasību saraksts:
- Pielāgojams kanālu saraksts
- Aizsargājot to no izmaiņām (galvenokārt no nejaušām, jo viltīgiem pieaugušiem bērniem jau ir daudz veidu, kā uzzināt vecāku paroles)
- Pati lietotne ir līdzīga pakalpojumam YouTube, kreisajā pusē tiek atskaņots video, bet labajā pusē ir priekšskatījumu kolonna, uz kuras var noklikšķināt.
- Galvenais lietošanas gadījums ir nejauša noklikšķināšana uz video; bērnam īsti nerūp, ko tieši skatīties.
Lietojumprogrammas darbība sastāv no divām galvenajām daļām: kanālu meklēšanas un iestatīšanas, izmantojot un pēc tam video atskaņošanu. Pašlaik esmu atradis divas video atskaņošanas iespējas vietējā lietotnē:
YouTube Android Spēlētāja API
Šis ir oficiālais veids, kā atskaņot videoklipus Android lietotnē. Lai tas darbotos, lietotāja ierīcē jau ir jābūt instalētai oficiālajai YouTube lietotnei, kas ietver pakalpojumu, ko var izmantot citas lietotnes. Tātad, Player API ir neliela bibliotēka, kas mijiedarbojas ar atsevišķi instalētu lietotni.
Sākumā es to izmēģināju, bet pēc kāda laika lietošanas es sapratu, ka tam ir kritiska problēma. Nav iespējams pareizi pielāgot atskaņotāja izskatu, tostarp kontrolēt pogas (vienīgā iespēja ir pilnībā visu paslēpt, bet tad jūs pazaudējat pilnekrāna pogu). Un atskaņotāja vadības panelī ir nepatīkama poga "Pārslēgties uz YouTube", kas atver oficiālo lietotni (kas ir obligāta ierīcē), kurai vairs nav nekādas filtrēšanas. Bērni viegli (nejauši vai ne) noklikšķina uz tās, pārslēdzoties uz nefiltrēto lietotni, un dažu minūšu laikā es atkal dzirdu "mazuļa pirkstiņš, mazuļa pirkstiņš, kur tu esi?" un redzu dažas acis asarojošas atkritumu animācijas ekrānā.
Vairāk atkritumu, ko bērni var atrast tikai ar dažiem klikšķiem. Vairāk nekā 900 miljoni skatījumu!

Tāpēc es atteicos no oficiālā atskaņotāja un atradu aizvietotāju šādas bibliotēkas veidā.
Android-YouTube-Player
Šķiet, ka bibliotēka ir WebView ietvars, kas kontrolē tīmekļa atskaņotāju, izmantojot JavaScript API. Tās priekšrocības ietver iespēju pilnībā pielāgot saskarni.
Spēlētāja inicializācija ir nedaudz mulsinoša, it īpaši pēc pārslēgšanās no oficiālās bibliotēkas:
- Mēs iegūstam savu skatījumu uz klasi com.pierfrancescosoffritti.androidyoutubeplayer.player.YouTubePlayerView
- Mēs to saucam par inicializāciju(), nododot klausītāju
- Klausītājs izsauc metodi onInitSuccess (@Nonnull final YouTubePlayer youTubePlayer), kas saņem atskaņotāja objekta instanci. Šis ir vienīgais veids, kā to iegūt. Līdz šim brīdim inicializācijas process bija identisks oficiālā klienta inicializācijas procesam.
- Mēs izsaucam spēlētāja metodi addListener(), nododot tai vēl vienu klausītāju (vairāk klausītāju klausītāju dievam!).
- Šī klausītāja metode onReady() tiek izsaukta — tikai pēc šī brīža var ielādēt un parādīt video un izmantot atskaņotāju. Ja nejauši mēģināsiet kaut ko ielādēt onInitSuccess, bibliotēka sāks mest dīvainas kļūdas.
Atskaņotāja dzīves ciklu (apturēt atskaņošanu, izmantojot onPause() un tamlīdzīgi) var pārvaldīt manuāli vai arī reģistrēt savu skatu kā dzīves cikla novērotāju (kam jūsu aktivitātei ir jāpaplašina AppCompatActivity). Šajā gadījumā bibliotēka visu ikdienas darbu veiks jūsu vietā.
Vēl viens dīvains bibliotēkas aspekts ir pilnekrāna režīma atbalsta trūkums uzreiz pēc noklusējuma. Pēc noklusējuma atskaņotājā ir pieejama atbilstoša poga, taču tā neko nedara. Būtībā pilnekrāna režīms ir jāiespējo manuāli — jāpaslēpj grafiskais lietotāja interfeiss, jāpalielina atskaņotāja logs un pēc tam jāatjauno. Tas var būt diezgan sarežģīti, ja atskaņotājam ir sarežģīta saskarne. Manējā bija tikai video saraksts, ko var viegli paslēpt manuāli.
Bibliotēkas paraugos ir iekļauta FullScreenHelper klase, no kuras var iegūt nepieciešamo kodu. Tās lietojums izskatās apmēram šādi:
youTubePlayerView.addFullScreenListener(new YouTubePlayerFullScreenListener() {
private final View rootLayout = findViewById(R.id.rootLayout);
@Override
public void onYouTubePlayerEnterFullScreen() {
fullScreenHelper.enterFullScreen();
rootLayout.setPadding(0, 0, 0, 0);
}
@Override
public void onYouTubePlayerExitFullScreen() {
fullScreenHelper.exitFullScreen();
rootLayout.setPadding(8, 8, 8, 8);
youTubePlayerView.getLayoutParams().height = LinearLayout.LayoutParams.MATCH_PARENT;
}
});FullScreenHelper paslēpj nevajadzīgus saskarnes elementus un iestata attēlošanas karodziņus. Man arī nācās pielāgot apmaļu iestatījumus (konstantes kodā ir ļaunas, es zinu), un nez kāpēc augstums tika atiestatīts, izejot no pilnekrāna režīma, ja vien es to manuāli nepielāgoju.
Kopumā šai bibliotēkai ir daudz trūkumu, taču tos visus atsver galvenā priekšrocība — iespēja pielāgot atskaņotāja saskarni. Man pietika paslēpt pogu “Rādīt pakalpojumā YouTube”, vienlaikus saglabājot pilnekrāna režīmu:
youTubePlayerView.getPlayerUIController().showFullscreenButton(true);
youTubePlayerView.getPlayerUIController().showYouTubeButton(false);Kopumā jūs varat kontrolēt visas pogas, parādīt pašreizējo laiku, pievienot savus skatus utt. - rezultātā pielāgošanas iespēju ziņā šī bibliotēka tālu atstāj savu oficiālo konkurentu.
Pēc atskaņotāja iestatīšanas jaunais video tiek ielādēts šādi: youtubePlayer.loadVideo(url, startTime);
Videoklipu sarakstu iegūšana, darbs ar YouTube Data API
Jums joprojām ir jāiegūst video URL no kaut kurienes. Par laimi, YouTube ir bagātīga API, kas ļauj veikt visu veidu meklēšanas vaicājumus un iegūt informāciju par kanālu. Lai sāktu to lietot, jums ir nepieciešams savā izstrādātāja konsolē un iegūstiet atslēgu.
Lai lietojumprogramma darbotos, mums ir nepieciešamas divas funkcijas: kanālu meklēšana un videoklipu saraksta iegūšana dotajam kanālam. Meklēšana izskatās apmēram šādi: mēs vēlamies meklēt kanālus un atskaņošanas sarakstus pēc vaicājuma "Peppa Pig". Mūs interesē ID (lai vēlāk varētu lejupielādēt kanāla videoklipu sarakstu pēc tā ID) un fragments, kas satur pamatinformāciju par entītiju: nosaukumu, priekšskatījuma attēlu un aprakstu.
YouTube.Search.List searchListByKeywordRequest = youTube.search().list("snippet,id");
searchListByKeywordRequest.setMaxResults(10L);
searchListByKeywordRequest.setQ("Peppa Pig");
searchListByKeywordRequest.setType("channel,playlist");
searchListByKeywordRequest.setKey("<api key>");
SearchListResponse response = searchListByKeywordRequest.execute();Ir svarīgi pareizi norādīt objekta daļu sarakstu (šajā gadījumā fragmentu un ID), ko vēlamies izgūt. YouTube API izmanto diezgan sarežģītu pieprasījumu ierobežošanas sistēmu: pēc noklusējuma dienas kvota ir viens miljons vienību, bet viens pieprasījums var patērēt daudzas vienības. Rakstīšanas pieprasījumi (video augšupielāde vai atskaņošanas sarakstu maiņa) patērē visvairāk, bet arī lasīšanas pieprasījumi var patērēt ievērojamu daudzumu. Lasīšanas pieprasījumi patērē vienu kvotas vienību uz vienību, kā arī divas vienības katram datu fragmentam. Piemēram, iepriekš minētais pieprasījums patērē 5 vienības (vienu pašam pieprasījumam un divas gan fragmentam, gan ID fragmentiem). Pilns pieprasījums visiem kanāla datiem, kurā ir seši fragmenti, patērētu 13 vienības. Videoklipiem ir pieejami 10 fragmenti, tāpēc pilns pieprasījums patērētu 21 kvotas vienību. Tāpēc ir lietderīgi pieprasīt tikai to, kas jums nepieciešams.
Pieprasījums iegūt kanāla videoklipu sarakstu izskatās šādi:
YouTube.Search.List request = youTube.search().list("snippet,id");
request.setChannelId("<channel id>");
request.setType("video");
request.setMaxResults(50L);
request.setKey("<api key>");
SearchListResponse response = request.execute();Veids, kā atbilde tiek sadalīta lapās, ir nedaudz neskaidrs. Tā vietā, lai skaidri norādītu lapas numuru un rezultātu skaitu, atbildē var būt ietverts parametrs nextPageToken. Ja tas ir klāt, tas nozīmē, ka vēl ir gaidāmas lapas. Šis parametrs ir jāievieto pieprasījuma objektā un pieprasījums ir jāizpilda vēlreiz.
if (response.getNextPageToken() != null) {
request.setPageToken(response.getNextPageToken());
response = request.execute();
}Kopumā API ir labi dokumentēts, ar gataviem koda paraugiem daudzās valodās, parauga vaicājumiem palaišanai pārlūkprogrammā utt.
Lietotāja pieredze
Pēc pirmās versijas gatavības sākās testēšana. Vispirms uz manas ģimenes, pēc tam izlaidu to pakalpojumā Google Play un sāku apkopot lietotāju atsauksmes. Dažas nianses kļuva skaidras uzreiz:
- Papildus kanāliem mums bija nepieciešami arī atskaņošanas saraksti. Jo viens kanāls bieži vien apvienoja pienācīgus video ar pilnīgu drazu. Piemēram, Teremok TV ir pienācīgas multfilmas par princesēm un visādas uzkrītošas multfilmas (piemēram, "Pīp" vai "Dr. Mašinkova"), kas padarīja visa kanāla pievienošanu nevēlamu.
- Un tad ir atsevišķi videoklipi. Piemēram, ir kanāli, kas piedāvā tādas kolekcijas kā "visas multfilmas sērijas vienā videoklipā", un atkal jūs vēlaties atlasīt atsevišķus videoklipus, nevis visu kanālu.
- Man vajadzēja atgriezties pie iepriekšējā video. Jo bērna histērija, kurš nejauši noklikšķina uz nākamā video un nevar atgriezties pie tikko noskatītā, nav joka lieta.
- Tagad es saprotu, ka man arī vajag meklēšanas funkciju. Jo "es gribu multfilmu par automašīnām un spoku", un lietotnē vēl nav meklēšanas funkcijas, tāpēc es varētu ilgi meklēt, cerot, ka nejaušā meklētājprogramma beidzot atradīs to sasodīto multfilmu.
- Es jau iepriekš rakstīju par skata pogas atspējošanu pakalpojumā YouTube.
- Es arī vēlētos pievienot piesprausto režīmu — sākot ar Android 5, to var iestatīt tā, lai lietotnes minimizācijai būtu jānospiež un jātur vairākas pogas vienlaikus.
Ja kādam patika šī ideja, Bezmaksas versijā var pievienot tikai trīs kanālus. Sazinieties ar mani privāti, un es jums došu atslēgu, lai to atbloķētu. Ikviens, kurš vēlas atbalstīt izstrādi, var iegādāties atbloķēšanas kodu pašā lietotnē. Tikmēr es lēnām pilnveidoju jaunas funkcijas, pamatojoties uz pieprasījumiem, un esmu priecīgs, ka tagad varu būt pārliecināts par sava dēla skatītā satura kvalitāti.
Un nē, viņš nepavada visu dienu pie planšetdatora; drīzāk viņš dod priekšroku pastaigām un aktīvām spēlēm, spēlējot paslēpes, zīmējot uz visa (no tapetēm līdz rotaļlietām), un vakaros viņam patīk klausīties pasakas. Planšetdators un multfilmas ir tikai viens no daudzajiem veidiem, kā izklaidēt bērnu, taču tie ir arī vieni no grūtāk pārvaldāmajiem. Tieši ar to mana lietotne ir vērsta.
DUPDaudzi cilvēki lūdza atslēgas, tāpēc es, iespējams, nejauši tās sajaucu un nosūtīju vienu un to pašu atslēgu vairākiem cilvēkiem. Tāpēc, ja saņemat ziņojumu, ka atslēgas derīguma termiņš ir beidzies vai to nevar atrast, paziņojiet man, un es jums nosūtīšu jaunu. Atslēga jāievada Play tirgus sadaļā "Reklāmas kodi".
UPD2Kā jau mani brīdināja komentāros, Google ir slēdzis manu lietotni un manu izstrādātāja kontu. Spriežot pēc Habr rakstītā, sūdzēties vai mēģināt saprast, kas ar Google nav kārtībā, ir pilnīgi bezjēdzīgi.
UPD3Es atvienoju lietotni no Google API. Tagad varat lejupielādēt APK šeit: Noslauki seju, Google!
Avots: www.habr.com
