Metacautare Streaming Live Pentru Dispozitive Mobile

Introducere

Android este peste tot, pe telefoane, tablete, Televizoare și set-top box-uri ce rulează Google TV. În curând, Android va fi în mașini, în sisteme de divertisment la bord pe avioane, și chiar în roboți.

Teama generală de dispozitive Android o reprezintă ecranele mici și tastaturile de dimensiuni mici. Android este asociat în mare parte cu smartphone-uri. Pentru dezvoltatori, acesta are atât avantaje cât și dezavantaje. Acesta descrie componentele principale într-o aplicație Android și caracteristicile Android care pot fi exploatate atunci când dezvoltăm aplicații.

Dezvoltarea de aplicații pentru dispositive ce rulează Android reprezintă o provocare din punct de vedere al modului cum interacționează utilizatorii cu acestea. Persoanele cu telefoane mobile au tendința de a se irita foarte repede atunci când aceste telefoane nu funcționează. Sursa acestor stări se poate afla în unul sau mai multe motive. Cele mai importante ar fi:

Suprasolicitarea procesorului, astfel încât apelurile nu pot fi efectuate sau primite.

Animațiile și tranzițiile ce prezintă stagnări sau sacadări atunci când se fac diverse operații pe telefon, pentru că programul nu funcționează corect cu restul sistemului de operare al telefonului.

Căderea sistemului de operare al telefonului din cauza utilizării excesive și fără optimizări ale memoriei.

Dezvoltarea de programe pentru un telefon este o experiență total diferită față de dezvoltarea aplicațiilor desktop, site-uri web, sau procese de server back-end. Instrumentele arată diferit, cadrele se comportă diferit, și există numeroase limitări cu privire la funcționalitățile programelor.

Android vine în ajutorul dezvoltatorilor cu două unelte cheie:

un limbaj de programare frecvent utilizat (Java), cu posibilitatea folosirii de biblioteci în mod obișnuit și suport prin instrumente de dezvoltare precum Eclipse.

un cadru destul de rigid care nu permite interacțiunea aplicației cu alte aplicații în mod malițios și mai ales cu funcționarea telefonului în sine.

Dezvoltarea de aplicații Android se desfășoară după concepte relativ similare cu cele ale aplicațiilor de altă natură, diferența constând în faptul că sunt împachetate diferit pentru o mai bună fiabilitate și stabilitate a telefonului. Structura este compusă din:

Activități: piatra de temelie a interfaței cu utilizatorul este activitatea . Poate fi comparată cu o fereastră sau o căsuță de dialog într-o aplicație desktop. Android este conceput pentru a pune la dispoziție mai multe tipuri de activități utilizate în mod comun. Astfel pot fi dezvoltate aplicații ce funcționează asemănător cu o aplicație într-un browser web.

Servicii: Activitățile sunt de scurtă durată și pot fi oprite în orice moment. Serviciile, pe de altă parte, sunt concepute pentru rămâne în stare de funcționare, dacă este necesar, independent de orice activitate, înrudite cu noțiunea de thread-uri daemon pe alte sisteme de operare. Se poate folosi un serviciu pentru a reda muzică în timp ce utilizatorul efectuează alte operații în aplicație sau navighează dintr-o activitate în alta.

Furnizorii de conținut: Furnizorii de conținut oferă un nivel de abstractizare pentru orice date stocate pe dispozitiv, care este accesibil prin multiple aplicații. Modelul de dezvoltare android încurajează crearea de date proprii pentru fiecare aplicație, contrar folosirii acelorași date pe aplicații diferite. Un furnizor de conținut poate fi de mai multe feluri și poate opera date extrase dintr-un serviciu web, date locale sau informații dintr-o bază de date SQLite.

Intenții: Intențiile sunt mesaje de sistem care se execută în jurul valorii de interior a aplicației dispozitivului și notifică diverse evenimente( de exemplu , a fost introdus un card SD ), la datele de intrare (de exemplu , un Serviciu de mesaje scurte [ SMS ] mesaj sosit ), la evenimente de aplicație ( de exemplu , activitatea a fost lansata din meniul principal al dispozitivului ). Intențiile sunt la fel ca mesajele sau evenimentele de pe alte sisteme de operare. Nu numai că se poate răspunde la o intenție, dar se pot crea și intenții proprii care să aibă diverse funcționalități, de la a lansa alte activități sau pentru a anunța când apar situații specifice (de exemplu, apropierea la un anumit numar de metri de o locație).

Din punct de vederea al capabilităților dispozitivului pe care se dezvoltă o aplicație android, dezvoltatorul are acces la următoarele resurse:

De stocare: accesul la fișiere precum pictograme, fișiere de help, fișiere de proprietăți, baze de date. De asemenea se poate realiza accesul la date de pe un card SD.

De rețea: dispozitivele Android , în general, au acces la Internet, printr-un mediu de comunicare sau altul. Se poate dezvolta un widget de browser, se pot integra view-uri web sau se pot efectua cereri web.

Multimedia: dispozitivele Android au capacitatea de a reda și înregistra audio și video. În timp ce specificul poate varia de la un dispozitiv la altul, se poate totuși interoga aparatul pentru a afla capacitățile sale și apoi să se utilizeze capacitățile multimedia ale acestuia după caz: redare muzică, înregistrarea audio, fotografiere, etc.

Servicii de localizare: dispozitivele Android au adesea acces la furnizori de locație, cum ar fi GPS și de triangulație de celule. La rândul său, poate afișa hărți în funcție de locație, sau poate profita de urmărirea mișcărilor unui dispozitiv în cazul în care acesta a fost pierdut sau furat.

Servicii Telefon: Deoarece dispozitivele Android sunt de obicei telefoane, se poate crea soft care inițiză apeluri, trimite sau primește mesaje SMS.

PARTEA I

Istoric

Android este un sistem de operare mobil care se bazează pe o versiune modificatã de Linux. Acesta a fost inițial dezvoltat de compania cu același nume, Android Inc. fondată în 2003 de Andy Rubin, Rich Miner, Nick Sears și Chris White. Ca parte a strategiei de a intra în sfera mobile, Google a achiziționat Android Inc. în 2005 și a preluat activitatea de dezvoltare (precum și de echipa de dezvoltare).

Google dorea ca Android să fie open source. Prin urmare, codul sursă Android a fost lansat sub licentă Apache, ceea ce înseamnă că oricine vrea să folosească Android poate face acest lucru prin descărcarea codului sursă complet Android. Mai mult decât atât, furnizori (de obicei, producătorii de hardware) pot adăuga propriile lor extensii de proprietate pentru Android și personaliza Android in scopul de a diferenția produsele lor de cele ale altor producători.

Acest model de dezvoltare simplu face Android foarte atractiv și a stârnit interesul multor furnizori. Acest lucru a fost valabil mai ales pentru companiile afectate de fenomenul Apple iPhone, un produs de mare succes care a revoluționat industira dispozitivelor smartphone. Astfel de companii precum Motorola și Sony Ericsson, care de mai mulți ani au dezvoltat sisteme de operare mobile proprii, când a fost lansat iPhone-ul, au fost nevoiți să găsească noi modalități de revitalizare a produselor lor. Acești producători au gasit Android ca soluție și continuă să proiecteze hardware-ul lor dar să folosească Android ca sistem de operare.

Android a trecut printr-un număr mare de actualizări de la prima sa lansare. Tabelul 1 prezintă diferite versiuni de Android și numele lor de cod:

Tabel 1 – Versiunile Android

Google Play

Google Play, fostul Android Market, este o platformă de distribuție digitală pentru aplicații pe sistemul de operare Android și magazin on-line, operat de Google. Serviciul permite utilizatorilor să navigheze și să descărce aplicații dezvoltate cu SDK-ul Android și publicate prin intermediul Google, precum și muzică, reviste, cărți, filme și programe de televiziune. Utilizatorii pot achiziționa, de asemenea, hardware, cum ar fi Chromebook, dispozitive mobile marca Nexus, Chromecasts, și accesorii, prin intermediul Google Play.

Aplicațiile sunt disponibile prin intermediul Google Play, fie cu titlu gratuit sau contra cost. Acestea pot fi descărcate direct de la un dispozitiv Android sau Google TV prin aplicația Play Store, sau prin alegerea unui dispozitiv adăugat direct de pe site-ul web Google Play. Multe aplicații pot fi direcționate către utilizatori specifici, bazate pe un anumit atribut hardware al dispozitivului lor, cum ar fi un senzor de mișcare (pentru jocuri dependente de accelerometru), sau un aparat de fotografiat (pentru apeluri video on-line).

La data de 06 martie 2012, odata cu fuziunea de Muzică Android Market și Google, serviciul a fost redenumit Google Play pentru a coincide cu strategia de rebrănduire Google de distribuție digitală. Serviciile care operează sub banner-ul Google Play sunt: Google Play Music , Google Play Books, Google Play standul de ziare, Google Play Movies & TV și Google Jocuri. În iulie 2013, magazinul Google Play a ajuns oficial la peste 1 milion de aplicații publicate și peste 50 de miliarde de descărcări.

Imagine 1 – Google Play

Android SDK

Pentru a dezvolta aplicații pe Android, programatorii au posibilitatea să utilizeze un Mac, un PC Windows sau o mașină de Linux. Toate instrumentele necesare sunt gratuite și pot fi descărcate de pe Web. Pentru această lucrare, a fost folosit un calculator Windows 7 și un telefon cu Android versiunea 4.2.2 Jelly Bean.

Prima și cea mai importantă piesă de software de care aveți nevoie pentru a descărca este, desigur, Android SDK. Android SDK-ul conține un program de debug, biblioteci, un emulator, documentație, monstre de cod și tutoriale. SDK-ul Android poate fi descărcat de la adresa: http://developer.android.com/sdk/index.html .

Imagine 2 – Pagina de descărcare a SDK – ului Android

Mai nou Google pune la dispoziție un pachet numit ADT Bundle pentru a începe dezvoltarea imediat de la descărcarea pachetului de dezvoltare. Acesta include componentele esențiale Android SDK și o versiune de Eclipse IDE cu built-in ADT (Android Instrumente de dezvoltare) pentru a simplifica dezvoltarea de aplicații Android.

Cu un singur download, ADT Bundle include tot ce ai nevoie pentru a începe dezvoltarea de aplicații:

Eclipse + plugin ADT

Instrumentele SDK-ului Android

Platforma Android

Cele mai recente unelete ale platformei Android

Cea mai recentă imagine de sistem Android emulator

În prezent se află în dezvoltare un nou mediu de dezvoltare pentru Android, numit Android Studio. Este bazat pe IntelliJ IDEA și este disponibil sub formă de preview până în momentul lansării oficiale.

Imagine 3 – Android Studio

Setarea mediului de dezvoltare

Pantru a seta mediul de dezvoltare e nevoie de:

Un calculator Mac/Windows/Linux

Java JDK 5 sau JDK 6

Android SDK

Eclipse IDE

Android Development Tools (ADT)

ADT Eclipse

ADT Eclipse face acum parte din ADT Bundle, care poate fi descărcat de la adresa: http://developer.android.com/sdk/index.html#download, de unde se bifează acordul de licență și se alege tipul sistemului de operare (32 bit sau 64 bit).

Imagine 4 – Descarcarea ADT Bundle

După descărcarea arhivei cu uneltele de dezvoltare se dezarhiveaza acesta într-o locație și se va vedea ca are în componență următoarele:

Eclipse cu plugin-ul ADT

SDK

SDK Manager

Pentru a începe dezvoltarea se pornește eclipse.exe din folderul eclipse. La prima rulare va cere setarea folderului de workspace, folderul unde se vor crea proiectele.

Crearea unui proiect android in ADT Eclipse

Pentru a crea primul proiect în ADT se selectează File → New → Android Application Project.

Imagine 5 – Creare unui nou proiect Android

Va apărea apoi o fereastră de dialog de unde se setează proprietățile de bază ale proiectului: numele aplicației, numele proiectului, pachetul de bază pentru clase și versiunea de SDK folosită.

Imagine 6 – Setarea unui nou proiect în ADT

Următoarea fereastră de dialog permite setarea unei iconițe pentru aplicație. Se pot crea iconițe specifice tipului de aplicație sau se poate seta iconița default android:.

Imagine 7 – Setarea unei iconițe pentru aplicație

La pasul următor se selectează tipul activității: Blank Activity, Fullscreen Activity sau Master/Detail Flow. Apoi se creează o activitate principală și se continuă. ADT va crea un proiect și va încărca toate componentele și configurările necesare.

Imagine 8– alegerea tipului activității principale

Interfața de dezvoltare ADT se va schimba ca în imaginea următoare și va afișa activitatea principală:

Imagine 9 – ADT – proiect creat cu succes

Crearea unui AVD (Android Virtual Device)

Pentru a putea rula aplicația android creată trebuie setat un AVD (Android Virtual Device). Un AVD se poate crea direct din eclipse fără a fi nevoie sa iesim sau să schimbăm aplicația pentru aceasta. Din bara de instrumente se accesează butonul de management al dispozitivelor virtuale.

Imagine 10 – Bara de instrumente

Va apărea apoi o fereastră în care putem crea și edita dispozitive virtuale.

Imagine 11 – Managerul vizual de dispozitive virtuale android

Pentru a crea un AVD se apasă butonul New și va apărea o fereastră de dialog de unde se poate configura un dispozitiv virtual în funcție de cerintele dispozitivului real pe care se va instala aplicația. Se pot seta următoarele proprietăți:

Numele dispozitivului

Dispozitivul real vizat

Versiunea de android

Tipul de procesor

Tipul de interfață/tema android

Opțiuni de memorie

Spațiul de stocare alocat

Dacă folosește sau nu SD card

Imagine 12 – Setarea unui dispozitiv virtual Android

După crearea dispozitivului virtual aplicația se poate rula cu ușurință pe acesta.

Imagine 13 – Aplicatia pe AVD

Execuția pe un dispozitiv real

În procesul de dezvoltare al unei aplicații mobile, este important să se testeze întotdeauna pe un dispozitiv real, înainte de a fi lansată pentru utilizatori. Pentru aceasta trebuie configurat mediul de dezvoltare și dispozitivul Android pentru testare și depanare de pe dispozitiv.

Se poate utiliza orice dispozitiv Android ca și mediu de funcționare, depanare, și testare a aplicațiilor. Instrumentele incluse în SDK facilitează sarcina de a instala și rula o aplicație pe dispozitiv de fiecare dată când se face compilarea. Se poate instala aplicația pe dispozitiv direct din Eclipse sau din linia de comandă cu ADB.

Pentru a rula și depana pe un dispozitiv android real trebuie efectuați următorii pași:

Trebuie declarată aplicatia "debuggable" în fișierul Android Manifest. În eclipse această operație se face automat.

În AndroidManifest.xml se adaugă android:debuggable="true" în cadrul elementului <application>.

Se activează “Depanare USB” de pe dispozitivul fizic. Această operație se face din Settings > Developer options.

Imagine 14 – Activare “Depanare USB”

Se setează sistemul pentru a detecta dispozitivul. În sistemul de operare Windows trebuie instalat driver-ul dispozitivului în funcție de producătorul acestuia și de model.

Pentru a verifica setarea dispozitivului fizic se execută din eclipse aplicația în mod normal și se va afișa un dialog de unde se poate selecta dispozitivul pe care va rula aceasta.

Dezvoltarea aplicațiilor pe Android

Componentele de aplicație sunt elementele esențiale ale unui program Android. Aceste componente sunt cuplate cu fișierul AndroidManifest.xml care descrie fiecare componentă din punct de vedere a cererii și modul în care acestea interacționează. Există următoarele patru componente principale care pot fi folosite într-o aplicație Android:

Activitățile – indică felul cum funcționează aplicația la interacțiunea utilizatorului cu interfața grafică a telefonului.

Serviciile – se ocupă de prelucrarea de fundal asociată cu o aplicație.

Receptoare de difuzare – se ocupă de comunicarea între sistemul de operare Android și aplicații.

Furnizorii de conținut – se ocupă de date și gestionarea bazelor de date.

O activitate reprezintă un singur ecran cu o interfață de utilizator. De exemplu, o aplicație de e-mail ar putea avea o activitate care afișează o listă de e-mail-uri noi, o altă activitate pentru a compune un e-mail, precum și o altă activitate pentru a citi e-mail-uri. Dacă o aplicație are mai mult de o activitate, atunci una dintre ele trebuie să fie marcată ca activitate de afișat atunci când este lansată aplicația. Pentru a implementa o activitate trebuie extinsă clasa Activity.

Un serviciu este o componentă care se execută în fundal, pentru a efectua operațiuni de lungă durată. De exemplu, un serviciu ar putea reda muzică în fundal în timp ce utilizatorul este într-o altă aplicație, sau ar putea aduce date din rețea fără a bloca interacțiunea utilizatorului cu o activitate. Implementarea unui serviciu trebuie sa extindă clasa Service.

Un receptor de difuzare are pur și simplu rol de a răspunde și de a difuza mesaje de la alte aplicații sau de sistem. De exemplu, aplicațiile pot iniția, de asemenea, difuzări de mesaje către alte aplicații să știe că unele date au fost descărcate în dispozitiv și sunt disponibile pentru a fi utilizate. Un receptor de difuzare este implementat ca o subclasă a clasei BroadcastReceiver și fiecare mesaj este transmis ca un obiect intenție.

O componentă furnizor de conținut furnizează date de la o aplicație la alta într-un mod la cerere. Astfel de cereri sunt tratate în metodele clasei ContentResolver. Datele pot fi stocate în sistemul de fișiere, în baze de date sau în altă parte în întregime. Un furnizor de conținut este implementat ca o subclasă a clasei ContentProvider și trebuie să implementeze un set standard de API-uri care permit altor aplicații să efectueze tranzacții.

Resursele Android

Pentru a menține ușor o aplicație trebuie întotdeauna ca resursele să fie externalizate. Totodată acest lucru permite setarea de resurse alternative pentru configurații diferite precum limbaje diferite, dimensiuni de ecran diferite, deoarece dispozitivele android sunt disponibile într-o gamă largă de configurații. Pentru a avea compatibilitate cu diverse configurații, resursele trebuie organizate în directorul res/, folosind diverse sub-directoare ce grupează resursele după tip și configurație.

Resurse String

O resursă string furnizează șiruri de text pentru aplicație cu un stil text opțional și formatare. Există trei tipuri de resurse care pot furniza aplicația cu șiruri de caractere:

– String: resursa XML ce furnizează un singur string.

– String Array: o resursă ce furnizează un șir de string-uri.

– Quantity Strings (Plurals): o resursă XML ce conține string-uri diferite.

Resursele string sunt localizate în: res/values/filename.xml. Numele fișierului este arbitrar. Atributul name din elementul <string> va fi folosit ca id de resursă. Tipul resursă compilat conține un pointer către un String în memorie. O resursă string este referită prin R.string.string_name în java și @string/string_name în XML.

Sintaxa:

Elementul <resources> este obligatoriu și reprezintă nodul rădăcină.

Elementul <string> reprezintă un string, ce poate include tag-uri de stilizare. De precizat este că ar trebui făcut escape la apostroafe și ghilimele. Ca și id de resursă se folosește atributul name.

Pentru un șir de string-uri se folosește următoarea sintaxă:

Resurse de Layout

Un layout definește structura vizuală a unei interfețe de aplicație. Un layout poate fi declarat în două feluri:

declararea elementelor de UI în XML. Android pune la dispoziție un vocabular XML foarte simplu și intuitiv pentru clasele de View și subclasele acestora, cum ar fi cele pentru widget-uri și alte layout-uri.

instanțierea elementelor de layout la runtime. Aplicația poate crea obiecte View și ViewGroup programatic.

Platforma Android oferă flexibilitate în a utiliza oricare din cele două variante sau amandouă pentru a declara și manipula interfața unei aplicații. De exemplu, se pot declara layout-urile de bază în XML, inclusiv elementele de afișat cu proprietățile setate și apoi să se modifice starea acestora la runtime.

Avantajul declarării interfețelor utilizator în XML este acela ca se poate separa partea de prezentare a aplicației de cea a codului care controlează componentele de UI. Aceste descrieri pe bază de XML sunt externe codului aplicației și pot fi modificate fără a fi nevoie sa se recompileze codul sursă. De exemplu se pot crea layout-uri pentru orientări diferite ale ecranului, dimensiuni de ecran diferite și limbaje diferite. De asemenea, declararea layout-ului în XML permite vizualizarea mai ușoară a structurii de interfață și identificarea facilă a problemelor.

Exemplu:

Resurse de culori

La fel ca și pentru resursele String se pot folosi identificatori de referință pentru a referi indirect culori. Astfel, Android poate localiza culori și aplica teme de interfață. Odată definite culori în fișiere de resurse acestea pot fi accesate în codul java prin intermediul id-urilor. Așa cum resursele String sunt disponibile prin intermediul R.string culorile sunt disponibile prin domeniul R.color.

Android definește un set de culori în fișierele de resurse proprii. Aceste id-uri, după extensie, sunt accesibile prin intermediului namespace-ului android.R.color.

Exemplul următor demonstrează cum se definește o resursă de culori:

Pentru a obține o resursă de culori în interiorul codului java se procedează în felul următor:

De asemenea se pot folosi resurse de culori în definirea componenteleor de interfață pe baza de XML.

Resurse de dimensiuni

Pixeli, inci și puncte sunt exemple de dimensiuni care pot juca un rol în layout-urile XML sau codul Java. Aceste resurse de dimensiuni pot fi folosite pentru a configura interfața de UI fără a modifica codul sursă.

Exemplul următor arată cum se definesc resursele de dimensiuni:

Dimensiunile pot fi specificate în oricare din următoarele dimensiuni:

px: pixeli

in: inci

mm: milimetri

pt: puncte

dp: pixeli independenți de densitate cu baza în 160 dpi(pixel density per inch)

sp: pixeli independenți de redimensionare

În java, pentru a accesa resurse de dimensiuni trebuie mai întâi accesată instanța obiectului Resources.

In XML, se foloseste dimen drept cheie de referință pentru dimensiune.

Resurse imagini

Android generează automat id-uri de resursă pentru fișierele puse în subdirectorul /res/drawable. Imaginile suportate sunt de tipul .gif, .jpg si .png. Fiecărui fișier imagine din acest director i se generează un id unic pe baza numelui. Astfel, dacă numele fișierului este imagine_fundal.jpg, atunci id-ul generat va fi R.drawable.imagine_fundal.

În definițiile de layout XML resursele imagine sunt disponibile prin indicativul @drwawable.

Programatic se poate obține o resursă drawable și apoi se poate asocia unui obiect de UI. De exemplu setarea unei imagini de fundal pentru un buton.

Furnizorii de conținut

Pentru a abstractiza datele în servicii, Android folosește un concept numit furnizor de conținut. Ideea de furnizor de conținut este de fapt un wrapper în jurul datelor. O bază de date SQLite aflată pe un dispozitiv android este un exemplu de sursă de date ce poate fi încapsulată într-un furnizor de conținut.

Sarcinile unui furnizor de conținut reprezintă mai mult un mecanism de încapsulare decât un mecanism de acces la date. Pentru a avea acces la date trebuie folosit un mecanism de acces la date precum SQLite sau acces la rețea pentru a obține datele propriu-zise. Așadar, abstractizarea de tip furnizor de conținut este obligatorie numai dacă e nevoie de împărțirea datelor între aplicații sau pe suport extern.

Pentru date accesate intern se poate folosi orice mecanism de acces sau stocare precum:

preferințe: un set de perechi cheie-valoare care pot persista pentru a stoca preferințe de aplicație.

fișiere: fișiere interne ale aplicațiilor, care pot fi stocate pe medii externe detașabile.

SQLite: bază de date SQLite, care este privată pachetului care o crează.

rețea: un mecanism care permite extragerea și stocarea datelor de pe internet cu ajutorul protocolului HTTP.

Implementarea unui furnizor de conținut

Pentru a implementa un furnizor de conținut trebuie extinsă clasa android.content.ContentProvider și implementate urmatoarele metode cheie: query, insert, update, delete, getType.

Pașii ce trebuie efectuați pentru crearea unui furnizor de conținut sunt următorii:

Planificarea bazei de date, URI, nume coloane, creare clase metadate ce definesc constantele pentru toate elementele metadatelor.

Extinderea clasei abstracte ContentProvider.

Implementarea metodelor: query, insert, update, delete, și getType.

Înregistrarea furnizorului de conținut în fișierul de manifest.

Exemplu:

Intenții

Android a introdus conceptul de intenții pentru a invoca componente precum activități, servicii, receptoare de transmisie și furnizori de conținut.

Deși o intenție este usor înțeleasă ca un mecanism de invocare a componentelor, Android înglobează mai multe idei în acest concept. Intențiile pot fi folosite să invoce aplicații externe, componente interne sau externe aplicației, afișare de evenimente sau alarme. La cel mai simplu nivel, o intenție este o acțiune pe care aplicația o poate solicita sistemului Android.

Exemplu implementare:

Odată invocată, o activitate are acces la intenția care a invocat-o. Următorul exemplu arată cum se poate accesa intenția dintr-o activitatea invocată.

Android pune la dispozitie următorul set de aplicații ce pot fi invocate prin intermediul intențiilor:

o aplicație browser

aplicație care apelează un numar de telefon

aplicație care afișează o tastatură de formare număr de telefon prin care utilizatorul să efectueze apeluri.

o aplicație de hărți care afișează harta lumii la o anumită latitudine și longitudine.

o aplicație de hărti care poate afișa Google Street View

Componente de interfață

Dezvoltarea interfeței de UI în android este relativ ușoară datorită unui set limitat de controale gata de utilizare.

SDK-ul Android vine cu toate controalele disponibile ce pot fi utilizate ușor pentru construirea interfeței unei aplicații. Asemenea altor SDK-uri, android oferă controale de tip text, liste, tabele, etc. În plus, Android pune la dispoziție o serie de controale specifice dispozitivelor mobile. La baza controalelor comune stau două clase: android.view.View și android.view.ViewGroup. Clasa View reprezintă un obiect cu scop general. Toate controalele comune ale platformei android extind în final clasa View.

ViewGroup este de asemenea un view, dar mai conține alte două componente View. Aceasta este clasă de bază pentru o listă de clase de layout. Android, ca și în Swing, utilizează conceptul de layout pentru a gestiona modul în care sunt așezate controalele în view-ul container.

Există câteva abordări de construire a unei interfețe utilizator în Android. Se poate construi un UI în întregime din cod java, se poate defini din XML sau printr-o combinație a celor două variante, java și XML.

Controale de tip text

Controalele text sunt în general primul tip de controale cu care interacționează un dezvoltator în Android. Android are un set complet de controale text: TextView, EditText, AutoCompleteTextView, și MultiCompleteTextView.

Specificația XML a unui control TextView are în componență o serie de atribute precum: id, width, height, value. Controlul de TextView are capacitatea de a afișa textul dar nu permite editarea acestuia. Acest lucru duce la ideea că TextView este asemenea unei simple etichete, dar acesta are mai multe proprietăți decât o etichetă. Poate conține un url sau o adresă de email și să le afișeze corespunzator. De semenea lansarea unui view de web sau email este posibila prin intermediul unui TextView.

Un control EditText este o subclasă a lui TextView. Așa cum sugerează numele EditText permite editarea textului în cadrul său. Clasa EditText are funcționalitățile de bază ale unui control de editare text, care suportă autocorecție a textului introdus, posibilitatea de a începe cuvintele cu literă mare, configurare să suporte doar parole sau numere de telefon.

Una din funcționalitățile interesante ale controlului EditText este faptul că se poate asocia un text indiciu. Acesta este afișat decolorat și dispare atunci cand utilizatorul începe să tasteze. Scopul indiceului este de a informa utilizatorul ce fel de informație trebuie să introducă.

Imagine 15 – EditText

Controlul AutoCompleteTextView este un TextView cu funcționalitate de auto-completare. Cu alte cuvinte, atunci când utilizatorul tastează în controlul de TextView, acesta afișează sugestii pentru a fi selectate. Următorul exemplu arată cum se poate configura un AutoCompleteTextView.

Un control MultiAutoCompleteTextView poate fi folosit să afișeze sugestii atunci când utilizatorul tastează. Acest control se utilizează asemănător cu AutoCompleteTextView diferența constând în faptul că se poate specifica în cadrul controlului când să facă o nouă sugestie astfel încât să afișeze la începutul propoziției sau după ce intâlnește virgula.

Controale de tip buton

Butoanele sunt comune în orice aplicație și Android nu face nici o excepție în privința lor. Android oferă butoane standard cât și cateva butoane particulare. Butoanele întalnite în Android sunt: butoanele de baza simple, butoane imagine și butoanele de comutare.

Imagine 16 – Exemple de buton

Controale de tip și dată

Controalele de timp și dată sunt comune în multe pachete de widget-uri. Android oferă câteva controale de dată și timp: DatePicker, TimePicker, DigitalClock, și AnalogClock.

Imagine 17 – TimePicker si DatePicker

Control de tip hartă

Controlul de hărți în android este MapView. Acest control poate fi instanțiat fie din XML sau din cod java, însa activitatea care îl folosește trebuie să extindă MapActivity, care folosește cereri multi-thread pentru a încărca hărțile.

Adaptoare și List View

Controalele de tip listă sunt folosite pentru a afișa colecții de date. Pentru a separa modelul de date de partea de afișare, Android folosește controale de tip listă și adaptoare. Controalele de tip listă sunt clase ce extind AdapterView și includ ListView, GridView, Spinner, și Gallery.

Imagine 18 – Ierarhia de clase AdapterView

Controlul AdapterView, la rândul lui, extinde ViewGroup, ceea ce înseamnă că ListView și celelalte controale din aceeași categorie sunt controale de tip container. Cu alte cuvinte, contralele de tip listă conțin colecții de obiecte View. Scopul unui adaptor este de a gestiona datele unui AdapterView pentru a furniza componentele din interiorul lui.

Controlul de tip ListView afișează o listă de elemente vertical. Dacă nu sunt elemente de afișat lista va fi goală, iar dacă numărul elementelor se intinde peste limita de înălțime a ecranului există posibilitatea de a face scroll pentru a vedea restul de obiecte. În general pentru a utiliza o componentă ListView activitatea părinte trebuie să extindă ListActivity. ListActivity conține un ListView, în care se pot seta datele prin apelul metodei setListAdapter(). Elementele unei liste pot efectua acțiuni la un eveniment de click sau selecție.

Imagine 19 – Exemplu de ListView in android

Galerie

Controlul galerie este un control orizontal care are focus întotdeauna în centrul listei. Acest control funcționează ca și galerie foto în modul touch și poate fi instanțiat fie din XML sau cod java. In XML se configureaza astfel:

Un control galerie este de obicei folosit pentru a afișa imagini, deci un adaptor implementat în acest scop va fi specializat pentru imagini.

Imagine 20 – Funcționarea unui control galerie

Stiluri și teme

Un stil este o colecție de proprietăți care specifică felul cum arată o interfață de aplicație.

Un stil poate să specifice proprietăți precum înalțime, margine, culoare, dimensiune font, culoare de fundal și multe altele. Stilurile sunt definite în resurse XML care se află separat de XML-ul ce specifică layout-ul.

În Android, stilurile au o filosofie similară cu CSS-ul de la design web, care permite separarea desing-ului de conținut.

De exemplu, prin intermediul stilurilor se poate modifica definirea layout-ului urmator:

, care poate fi transformat in:

În acest exemplu, toate atributele legate de stil au fost scoase și mutate într-o definire de stil separată, numită CodeFont, care a fost apoi aplicată cu atributul style. Definirea acestui stil se face în felul următor:

Tipuri de layout

Android oferă o colecție de clase View ce acționează ca niște containere. Aceste clase container sunt cunoscute sub denumirea de layout sau manageri de layout, și fiecare implementează o strategie specifică de gestiune a dimensiunii și poziției elementelor.

De exemplu, clasa LinearLayout afișează elementele orizontal sau vertical, unul dupa altul. Toate tipurile de layout derivă din clasa View, ceea ce înseamnă că se pot îngloba layout-uri în alte componente de tip layout.

În SDK-ul de android există următoarele tipuri de layout:

LinearLayout – Organizează elementele copii fie orizontal fie vertical.

TableLayout – Organizează elementele copii sub formă de tabel.

RelativeLayout – Organizează elementele copii relativ unu la altul sau la componenta parinte.

FrameLayout – Permit organizarea liberă a controalelor în interiorul layout-ului.

GridLayout – Aranjeaza elementele copii sub formă de grid.

LinearLayout este cel mai simplu tip de layout, care organizează elementele din interior unu după altul în direcție orizontală sau verticală pe baza proprietății de orientare setată. Exemplu următor arată cum se definește un LinearLayout orizontal:

Imagine 21 – Exemplu de Linear Layout

RelativeLayout este un grup de vizualizare ce afișează elementele copii pe poziții relative. Poziția fiecărui view poate fi specificată fie relativ la alte elemente, sau pe poziții relative la zona containerului părinte.

Imagine 22 – Exemplu de Relative Layout

Meniuri

SDK-ul Android oferă suport pentru meniuri. Suportă meniuri normale, submeniuri, meniuri de context, meniuri secundare, și meniuri alternative. De la Android 3.0 a fost adaugat action bar, care se integrează foarte bine cu elemente de meniu. Incepand cu Android 4.0 au fost introduse meniurile pop-up, care pot fi invocate oricând în cadrul unui eveniment.

Pentru toate tipurile de meniu, Android pune la dispoziție un format standard XML pentru definirea meniurilor. Următorul exemplu arată cum se definește un meniu:

Un meniu de context oferă acțiuni care afectează elemente specifice din interfața grafică. Se poate asocia un meniu de context aproape oricărui tip de componentă dar cel mai des este utilizat pentru elemente ListView sau GridView.

Exista două feluri de a afișa meniuri de context:

meniu de context plutitor. Meniul apare ca o listă plutitoare când utilizatorul ține apăsat pe componenta ce declara suport pentru meniu contextual. Utilizatorul poate efectua acțiuni pe un singur element la un momentdat.

meniu de context în modul acțiune. Acest mod este o implementare de sistem a clasei ActionMode, care afșează o bară de meniu contextuală în partea de sus a ecranului, cu elemente de acționat, care afectează elementele selectate. Când este folosit acest mod, utilizatorul poate efectua o acțiune asupra mai multor elemente deodată (dacă aplicația permite).

Imagine 23 – Exemplu de meniu contextual

Dialoguri

Un dialog este o mică fereastră care apare atunci cand utilizatorul trebuie să ia o decizie sau să introducă informații adiționale. Dialogul nu umple tot ecranul și de obicei este folosit modal pentru a cere utilizatorului să facă o acțiune înainte de a continua.

Imagine 24 – Exemple de dialog

Dialog este clasa de bază pentru dialoguri, dar nu se recomandă niciodată instanțierea ei directă. Se recomandă, în schimb, folosirea subclaselor AlertDialog și DatePickerDialog sau TimePickerDialog. Aceste trei clase definesc stilul și structura pentru un dialog, dar este ideal folosirea clasei DialogFragment pentru a defini containerul unui dialog. Clasa DialogFragment furnizează toate controalele necesare pentru crearea și gestionarea afișării dialogurilor, în locul apelurilor către metode din obiectul Dialog.

Folosirea clasei DialogFragment pentru dialoguri asigură folosirea corecta a ciclului de evenimente ca de exemplu atunci când utilizatorul apasă butonul "Înapoi" sau rotește ecranul. Clasa DialogFragment permite de asemenea reutilizarea interfeței de dialog ca și componentă integrată într-un UI mai complex, asemena clasei Fragment.

Clasa AlertDialog facilitează crearea unei game variate de design-uri de dialog. Aceasta se compune din trei regiuni:

Titlu. Opțional, se recomandă folosirea lui numai atunci când zona de conținut are un mesaj detaliat, o listă sau un layout custom. Dacă dialogul are un conținut format dintr-un mesaj simplu sau o întrebare, atunci nu mai este necesară utilizarea unui titlu.

Zona de conținut. Aceasta poate afișa un mesaj, o listă sau un layout personalizat.

Butoane. Nu ar trebui să existe mai mult de trei butoane într-un dialog.

Imagine 25 – Regiunile de afișare ale unui dialog

Următorul exemplu arata cum se poate crea un AlertDialog simplu:

ActionBar

Bara de acțiuni este o funcționalitate ce identifică locația și furnizează acțiuni și moduri de navigare. Folosirea barei de acțiuni oferă utilizatorilor o interfață familiară între aplicații pe care sistemul le adapteaza pentru configurații de ecran diferite.

Imagine 26 – Exemplu de ActionBar cu iconița aplicației (1), elemente de actiuni (1), actiuni desfașurator (3)

Bara de acțiuni are câteva funcții cheie:

Asigură spațiu dedicat pentru a oferi aplicației identitate și indică locația utilizatorului în cadrul aplicației.

Face ca acțiunile importante să iese în evidența și astfel funcțiile aplicației mai ușor de prevăzut.

Suportă navigare consistentăși schimbarea interfețelor de vizualizare în cadrul aplicației.

Pentru adaugarea unui ActionBar în aplicație trebuie:

– să se creeze o activitate ce extinde ActionBarActivity.

– să se utilizeze sau să se extinda una din temele Theme.AppCompat. De exemplu

<activity android:theme="@style/Theme.AppCompat.Light" … >

Apoi activitatea va include și bara de activități când aplicația rulează pe o versiune de android 2.1(API Level 7) sau mai recentă.

Servicii

Platforma android furnizează un set software complet. Acest lucru înseamnă că vine cu un sistem de operare și pachet de aplicații funcționale. Pe langa acestea, are și un SDK ce poate fi folosit pentru a scrie aplicații. In afară de funcționalitatea ce presupune acțiuni în urma interacțiunii directe cu utilizatorul, mai există și servicii care se execută pe fundal. Acestea sunt servicii HTTP, task-uri de fundal, comunicații între procese.

Aplicațiile Android sunt, în general, aplicații mici dar cu foarte multe funcționalități. Una din căile prin care dispozitivele mici scot multe funcționalități vine de la posibilitatea de a extrage informații din diverse surse. De exemplu, majoritatea telefoanelor Android vin cu o aplicație de hărți, care oferă o funcționalitate sofisticată. Se stie totuși că aplicația este integrată cu API-ul Google Maps și alte servicii, care furnizează mare parte din facilități.

Cu toate astea este foarte probabil ca aplicațiile implementate să extragă informație din API-urile altor aplicații. O strategie de integrare des întalnită este cea prin folosirea de cereri HTTP. De exemplu, o aplicație se poate conecta la un servlet care furnizează date. Acest lucru este posibil prin intermediul unei variații de Apache HttpClient, cu care Android este dotat. Patternul general pentru a folosi HttpClient este:

Se creează un HttpClient (ori se cere o referință existentă).

Se instanțiază o nouă metoda HTTP, precum PostMethod sau GetMethod.

Se setează parametrii/valorile HTTP.

Se execută cererea HTTP folosind obiectul HttpClient.

Se procesează raspunsul HTTP primit.

Modelul de implementare a unui client HTTP în android este prezentat în exemplul următor:

Efectuarea unei cereri HTTP POST este asemănătoare cu cea HTTP GET.

HTTP POST este mult mai puternic decât pare. Cu HTTP POST se pot transmite valori simple în parametri sau parametri complecși precum fișiere. De asemenea, suportăși formatul cunoscut ca multipart POST, în care se pot transmite paramatri simpli de tip cheie-valoare împreuna cu fișiere oarecare, dar cu anumite considerente, și anume, este necesară adăugarea de proiecte adiționale open source. Acestea sunt Apache Commons IO, Mime4j și HttpMime.

API-uri Media

Android suportă redarea de conținut audio și video prin intermediul pachetului android.media. La baza pachetului android.media este clasa android.media.MediaPlayer, care este responsabilă de redarea conținutului audio și video. Conținutul pentru această clasă poate veni din surse variate: Web via URL, fișier .apk, fișier ca și resursă sau asset, card SD.

Clasa MediaPlayer este capabilă de a decoda câteva formate diferite de conținut media, inclusiv 3GPP(.3gp), MP3(.mp3), MIDI(.mid), Ogg Vorbis (.ogg), PCM/WAVE (.wav), MPEG-4 (.mp4), RTSP, HTTP/HTTPS live streaming, și liste de redare M3U cu anumite excepții. Tabelul actualizat cu formatele audio și video suportate se găsește la adresa: http://developer.android.com/guide/appendix/media-formats.html.

Pentru a reda un stream live accesibil via HTTP, exemplul următor demonstrează modul de implementare simplu:

Folosirea clasei MediaPlayer, ca în exemplul de mai sus, este foarte simplă. Cu toate acestea, este important de sesizat că sunt cateva aspecte de luat în seama pentru funcționarea corectă a unui player media într-o aplicație android. În primul rand apelul către funcția prepare() poate dura mult să se execute deoarece poate implica descărcarea și decodarea datelor media, lucru care poate face aplicația să nu raspundă până la terminarea execuției metodei. E important de ținut minte că orice operație care durează mai mult de o zecime de secundă va da impresia utilizatorului de aplicație care ruleaza încet.

Pentru a evita acest inconvenient, trebuie instanțiat un MediaPlayer într-un fir de execuție separat și să se notifice firul de execuție principal cand s-a terminat operația de inițializare. Pentru a nu mai obliga programatorul să implementeze separat acest fir de execuție, Android pune la dispoziție o altă metodă care se ocupa de acest lucru în mod convenabil, și anume metoda prepareAsync(). Aceasta medotă începe să pregatească player-ul media pe fundal și se întoarce imediat în thread-ul principal. Când operația de preparare se termină, este apelată metoda onPrepared() a unui ascultător de evenimente numit MediaPlayer.OnPreparedListener și setat prin metoda setOnPreparedListener().

Un alt aspect al clasei MediaPlayer este acela că trebuie tinut seama că acesta este bazat pe stare. Acest lucru înseamnă că MediaPlayer are o stare internă de care trebuie ținut cont pentru ca anumite operații sa fie valide atunci când player-ul se afla în stări specifice.

Dacă se execută o operație atunci când player-ul este într-o stare invalidă, sistemul va arunca excepții și aplicația nu se va comporta corespunzator.

Diagrama de mai jos arată stările clasei MediaPlayer, și clarifică ce metode schimbă player-ul dintr-o stare în alta:

Imagine 27 – Diagrama de stare a clasei MediaPlayer (http://developer.android.com/reference/android/media/MediaPlayer.html)

Un player media consumă resurse considerabile. Ca atare, trebuie întotdeauna să se ia măsuri pentru a nu ține o instanță de MediaPlayer mai mult decât e nevoie. Când nu mai e nevoie de el trebuie apelată metoda release() pentru a elibera corect resursele alocate.

De exemplu, dacă se instanțiază un MediaPlayer într-o activitate și apoi primește un apel către metoda onStop(), trebuie imediat apelată și metoda release() pentru ca nu mai are sens să fie păstrate resursele alocate din moment ce activitatea de android nu mai interacționează cu ele. La repornirea activității este desigur nevoie de reinstanțierea unui obiect MediaPlayer, dar eliberarea celui anterior corect evită posibilitatea instanțierii a doua playere media simultan, care pot duce la îngreunarea aplicației.

Pentru a nu opri player-ul media, și pentru a continua redarea pe fundal chiar și când aplicația nu este afișată pe ecran, trebuie pornită instanța de MediaPlayer într-un serviciu și controlată de acolo. Acest lucru necesită totuși o atenție deosebită pentru că atât utilizatorul cât și sitemul au anumite așteptări legat de prioritatea serviciilor de pe fundal și interacțiunea cu restul sistemului, pentru a nu rezulta într-o experienta de utilizare slabă.

În primul rând, asemenea unei activități, toată execuția într-un serviciu este facută pe un singur fir de execuție în mod implicit.

Dacă se execută o activitate și un serviciu din aceeași aplicație, acestea utilizează același fir de execuție(firul principal) în mod implicit. De aceea serviciile trebuie să proceseze intențiile primite rapid și să nu efectueze procesări prea mari. Dacă totuși un serviciu lucrează la un task ce necesită mult timp atunci acest task trebuie executat asincron fie din alt fir de execuție implementat special, fie prin folosirea funcționalităților framework-ului, deja existente, pentru procesare asincronă.

Următorul exemplu arată modul de implementare a unui serviciu pentru un player media:

PARTEA a II – a

Radio App

Imagine 28 – Radio App – activitatea principala

Prezentare generală

Radio App este o aplicatie mobile, dezvoltată folosind SDK-ul Android, ce folosește o mare parte din abilitățile principale ale unui sistem Android: elemente de interfață, servicii, baze de date SQLite, cereri HTTP GET, MediaPlayer.

Radio App folosește un task asincron pentru a efectua cereri HTTP către site-urile web ale fiecărui post de radio și parsare a răspunsului pentru extragerea melodiei curente și a unei liste cu ultimele melodii pentru site-urile care afișează și această informație adițională. Acest task se execută pe fundal, de fiecare dată la cererea utilizatorului pentru un post de radio specific. Pentru optimizare, nu se fac cereri succesive deodată pentru fiecare radio, o cerere HTTP efectuându-se numai la selecția din lista de posturi radio.

O altă funcționalitate utilă o constituie posibilitatea de a stoca într-o bază de date SQLite melodia curenta ca si melodie favorită, putând apoi fi vizualizată prin accesarea secțiunii “Melodii favorite”. De asemenea pentru o listă de melodii se poate crea un playlist favorit.

La vizualizarea melodiilor favorite există posibilitatea de a efectua căutare pe youtube a melodiei favorite printr-un singur click din lista de melodii.

Vizualizarea melodiei curente pentru un post de radio vine cu posibilitatea de a reda live de pe postul de radio respectiv prin intermediul unui player integrat in componenta de cautare/vizualizare.

Mod de funcționare

Activitatea principală Radio App afișează lista de posturi radio.

Imagine 29 – Activitatea principală Radio App

Din activitatea principala există posibilitatea efectuării mai multor acțiuni:

Accesarea din meniul situat în ActionBar a melodiilor favorite sau a listelor favorite

Imagine 30 – Accesare melodii favorite si liste favorite

Afișarea listelor favoritecu navigare către melodiile din listă

Imagine 31 – Liste favorite

Afișarea melodiilor favorite cu acces direct către cautare pe Youtube a oricarei melodii din listă

Imagine 32–Melodii favorite, vizualizare în Youtube

La selectarea unui element din lista de posturi radio se afișeaza o nouă activitate ce afișează melodia curentă și lista de melodii anterioare. Tot îm această activitate este integrat un player audio ce redă stream live de pe postul de radio online.

Tot în interfața de afișare melodii pentru posturi de radio sunt disponibile și meniurile pentru adăugare melodie curentă la favorite, adăugare listă curentă la favorite, accesare melodii și liste favorite. O melodie de pe un post de radio poate fi adăugată numai o dată.

Imagine 33 – Activitatea afișare melodie curentă, melodii anterioare, pentru un post de radio.

Imagine 34 –Meniul de acțiuni.

Structura proiectului

Proiectul este strucurat în secțiuni bine definite, fiecare cu rol specific în aplicație. Așadar, modulele de bază ale structurii sunt: modelul de date (pentru lista de posturi radio, melodiile favorite si listele favorite), clasele pentru interacțiunea cu baza de date, structura tabelelor bazei de date, task-uri, clase utilitare, activitățile de interfață și elementele de UI.

Structura de clase

Codul sursă al aplicației este structurat în șase pachete, fiecare având clase specializate pentru un anume tip de operații.

Pachetul principal este ro.ucv.inf.radioapp, și conține toate activitățile ce sunt lansate în procesul de execuție și utilizare a aplicației.

Imagine 35 – Lista de clase din pachetul ro.ucv.inf.radioapp

Clasele din componența pachetului ro.ucv.inf.radioappsunt AboutActivity, FavoriteListsRadioActivity, FavoriteSongsActivity, MainActivity, RadioDetailsActivity, ViewInYoutubeActivity.

Toate aceste clase extind android.support.v7.app.ActionBarActivity.

Clasa AboutActivity afișează informații despre aplicație. FavoriteListsRadioActivity și FavoriteSongsActivity sunt folosite pentru afișarea listelor favorite si melodiile favorite. MainActivity este activitatea principală, care este afișată la pornirea aplicației. Aceasta afișează lista de posturi radio și permite accesarea detaliilor pentru fiecare post.

RadioDetailsActivityeste accesibilă prin selecția din lista de posturi radio. Aceasta afișează melodia curentă, și unde e posibil lista cu ultimele melodii. De asemenea are integrat un player ce reda live de pe stream-ul online.

ViewInYoutubeActivityafișează o componentă web, și efectuează o căutare pe Youtube după melodie. Această activitate este lansată din lista de melodii favorite.

Pachetul ro.ucv.inf.radioapp.bean conține clase pentru modelul de date al informațiilor afișate în componentele de tip listă.

Imagine 36 – lista de clase din pachetul ro.ucv.inf.radioapp.bean

Imagine 37 – Structura claselor din pachetul ro.ucv.inf.radioapp.bean

Clasele din acest pachet conțin câmpuri de tip String, și metode de tip get și set pentru accesarea valorilor setate la încărcarea informațiilor din baza de date SQLite.

Pachetul ro.ucv.inf.radioapp.database conține clase utilitare pentru operațiile efectuare într-o bază de date SQLite.

Imagine 38 – lista de clase din pachetul ro.ucv.inf.radioapp.database

Imagine 39 – DBUtil și ManagerDbHelper

Clasa DBUtil are în componență metode pentru salvarea listelor și melodiilor favorite în baza de date SQLite. Acestea sunt:

addSongToFavourites(SQLiteDatabase db, String song, String radioName) – metodă ce adaugă o melodie la favorite.

addListToFavourites(SQLiteDatabase db, List<String> songs, String radioName) – metoda ce adaugă o listă de melodii ca listă favorită.

checkIfExists(SQLiteDatabase db, String song, String radioName) – întoarce true daca o melodie cu același nume pentru un post de radio există deja adăugată la favorite, și false, în caz contrar.

ManagerDbHelperextinde clasa SQLiteOpenHelper, care este o clasă ajutătoare pentru operațiile cu baze de date. Aceasta gestionează crearea, upgradarea și actualizarea unei baze de date SQLite.ManagerDbHelpervine cu funcționalități adiționale, și anume crearea bazei de date, a tabelelor pentru melodii și liste favorite.

Pachetul ro.ucv.inf.radioapp.entries conține clase ce sunt folosite în operațiile cu baze de date, și anume coloanele pentru fiecare tabel.

Imagine 40 – lista de clase din pachetul ro.ucv.inf.radioapp.entries

Imagine 41 – ListEntry și SongEntry

Pachetul ro.ucv.inf.radioapp.tasks conține clasa RadioSongsTask, care se ocupă de operațiile de conectare la site-urile web pentru a extrage melodiile.

Imagine 42 – pachetul ro.ucv.inf.radioapp.tasks

În clasa RadioSongsTask există metode pentru parsarea informațiilor primite printr-o cerere HTTP către site-urile posturilor de radio. În Imagine 40 este afișată lista de metode din această clasă.

Imagine 43 – Structura clasei RadioSongsTask

Pachetul ro.ucv.inf.radioapp.util conține clase utilitare pentru operații reutilizabile.

Imagine 44 – clasele din pachetul ro.ucv.inf.radioapp.util

Clasa Constants este o clasă utilitară ce conține constante folosite global în majoritatea claselor aplicației, constante precum url-urile posturilor de radio și a site-urilor web sau lista de iconițe pentru fiecare post de radio.

CustomWebViewClient este o clasă simplă care extinde WebViewClient. Aceasta primește o adresa URL pe care îl încarcă din metoda shouldOverrideUrlLoading.

Clasa Utils are metoda getRadioByResourceValue(String value, Resources res), care întoarce un obiect RadioItem în funcție de nume. RadioItem conține eticheta ce reprezintă numele de radio și iconița acestuia.

Componente folosite

Componentele Android folosite pentru implementarea aplicației au fost de mai multe tipuri. Cel mai des s-a folosit TextView, ListView, ListView, ToggleButton, WebView, Button, ImageView.

Pentru layout s-au folosit LinearLayout (cel mai utilizat pentru afișarea componentelor de interfață în acestă aplicație), FrameLayout și RelativeLayout.

Utilizarea elementelor de meniu din bara de acțiuni predomină de asemenea, toate activitățile fiind implementate să extindă ActionBarActivity.

Pentru afișarea listelor a fost necesară implementarea unui adaptor, clasa utilă pentru extindere fiind ArrayAdapter.

Media player

RadioApp suportă redarea unui stream online. La accesarea componentei de vizualizare a melodiei curente este disponibil și un player media.

Imagine 45 – Player radio

Posturile de radio din România au stream online în format Advanced Audio Coding Plus (AAC+) datorită cerințelor mici pentru alocare bandă de internet. Advanced Audio Coding (AAC) este o schemă de compresie cu pierderi și encoding pentru conținut audio digital.

AAC a fost proiectat să fie un succesor al formatului MP3, acesta reușind să obțină o calitate mai buna a sunetului. Acest format a fost standardizat de ISO și IEC, făcând parte din specificațiile MPEG-2 și MPEG-4. Parte a formatului AAC, formatul High Efficiency Advanced Audio Coding (HE-AAC) este adoptat de standardele radio precu DAB+ si Digital Radio Mondiale, precum și standardele mobile de televiziune DVB-H and ATSC-M/H.

AAC este formatul audio standard și implicit pentru YouTube, iPhone, iPod, iPad, Nintendo DSi, Nintendo 3DS, iTunes, DivX Plus Web Player si PlayStation 3. Este de asemenea suportat pe PlayStation Vita, Wii, Sony Walkman MP3, Sony Ericsson, Nokia, Android, BlackBerry, și telefoanele mobile bazate pe webOS, prin intermediul unui convertor.

Un inconvenient legat implementarea unui player pentru stream AAC+ este faptul că android până la momentul actual nu dispune de un decodor pentru acest format. În tabelul de formate suportate de platforma Android, afișată la adresa https://developer.android.com/guide/appendix/media-formats.htmleste specificat faptul că de la Android 4.1+ exista numai encoder pentru acest format.

Pentru a depăși acest inconvenient, și mai ales pentru a face posibilă redarea stream-urilor radio online, Radio App folosește o librărie bazată pe MediaPlayer din SDK-ul Android și o librărie nativă numită ffmpeg (https://sourceforge.net/projects/ffmpeg4android/). Player-ul implementat este un obiect de tip FFmpegMediaPlayer.

Asemenea implementării unui player folosind MediaPlayer, utilizarea FFmpegMediaPlayer este făcută folosind metoda prepareAsync() pentru execuția acestioa într-un fir de execuție separat. Pentru a înștiința aplicația atunci când player-ul media este pregătit, trebuie atașat un ascultător de evenimente de tip FFmpegMediaPlayer.OnPreparedListener(), care dispune de metoda onPrepared(), în care este posibilă pornirea player-ului în siguranță.

Metodele createPlayer() și preparePlayer() clasa RadioDetailsActivity se ocupă de instanțierea și prepararea unui player radio.

Concluzii

Android este unul din cele mai populare sisteme de operare pentru dispozitive mobile și tablete.

Faptul că este open-source îl face accesibil pentru dezvoltatori de orice nivel, începând de la dezvoltatori new entry și până la profesioniști în domeniu.

Numărul mare de dezvoltatori și popularitatea sa foarte mare a dus la apariția numeroaselor cărti, tutoriale, exemple și forumuri de discuții, astfel încât găsirea de soluții la problemele întâlnite este foarte la îndemână.

Configurarea interfeței grafice cu doua alternative, XML și cod java, oferă un plus și flexibilitate pentru dezvoltator.

ADT oferă un emulator intuitiv de configurat și cu o gamă largă de configurații pre-setate. Acesta nu este la fel de rapid ca un dispozitiv real dar folosit pe un sistem cu o configurație hardware bună poate îndeplini cu ușurință sarcinile de instalare/testare.

Datorită combinației dintre resurse XML și limbajul java, Android este o platformă convingătoare din punct de vedere al opțiunii de a dezvolta aplicații pentru mobile.

Există o multitudine de dispozitive hardware distribuite de foarte mulți producători, având dimensiuni diversificate și mii de dezvoltatori de aplicații.

Android nu oferă cel mai bun suport nativ. Android este curent la versiunea de NDK 1.6 Revision 9, dar totusi este în urmă față de iPhone OS în acest domeniu.

Bibliografie

Gabriel Stoian, Claudiu Ionuț Popirlan, Tehnologii Java pentru dezvoltarea aplicațiilor – Note de curs, Universitaria Publishing House, 2009

Mirel Cosulschi, Adrian Giurca, Bogdan Udrescu, Nicolae Constantinescu, Mihai Gabroveanu, HTML Pattern Generator–Automatic Data Extraction from Web Pages, 2006

Cristian Frăsinaru, Curs practic de Java

Ivor Horton, Beginning Java, Wrox, 2011

Ian Darwin, Java cookbook, O’Reilly Media, 2001

Grant Allen, Beginning Android 4, Apress, 2012

Joshua Bloch, Effective Java Second Edition, Addison-Wesley, 2008

J. F. DiMarzio, Practical Android 4 Games Development, Apress, 2011

Mark L. Murphy, Android Programming Tutorials, CommonsWare, 2011

Murat Aydin, Android 4: New features for Application Development, Packt Publishing, 2012

Reto Meier, Professional Android 4 Application Development, John Wiley & Sons, 2012

Mario Zechner, Robert Green, Beginning Android 4 Games Development, Apress, 2011

Satya Komatineni, Dave MacLean, Pro Android 4, Apress, 2012

Vladimir Silva, Advanced Android 4 Games, Apress, 2012

Wei-Meng Lee, Android™ 4 Application Development, John Wiley & Sons, 2012

Jason Wei, Android Database Programming, Packt Publishing, 2012

Jason Morris, Android User Interface Development – Beginner's Guide, Beginner's Guide, 2011

tutorialspoint.com, ANDROID TUTORIAL, 2014

https://developer.android.com

https://stackoverflow.com/questions/tagged/android

https://android.stackexchange.com/

Bibliografie

Gabriel Stoian, Claudiu Ionuț Popirlan, Tehnologii Java pentru dezvoltarea aplicațiilor – Note de curs, Universitaria Publishing House, 2009

Mirel Cosulschi, Adrian Giurca, Bogdan Udrescu, Nicolae Constantinescu, Mihai Gabroveanu, HTML Pattern Generator–Automatic Data Extraction from Web Pages, 2006

Cristian Frăsinaru, Curs practic de Java

Ivor Horton, Beginning Java, Wrox, 2011

Ian Darwin, Java cookbook, O’Reilly Media, 2001

Grant Allen, Beginning Android 4, Apress, 2012

Joshua Bloch, Effective Java Second Edition, Addison-Wesley, 2008

J. F. DiMarzio, Practical Android 4 Games Development, Apress, 2011

Mark L. Murphy, Android Programming Tutorials, CommonsWare, 2011

Murat Aydin, Android 4: New features for Application Development, Packt Publishing, 2012

Reto Meier, Professional Android 4 Application Development, John Wiley & Sons, 2012

Mario Zechner, Robert Green, Beginning Android 4 Games Development, Apress, 2011

Satya Komatineni, Dave MacLean, Pro Android 4, Apress, 2012

Vladimir Silva, Advanced Android 4 Games, Apress, 2012

Wei-Meng Lee, Android™ 4 Application Development, John Wiley & Sons, 2012

Jason Wei, Android Database Programming, Packt Publishing, 2012

Jason Morris, Android User Interface Development – Beginner's Guide, Beginner's Guide, 2011

tutorialspoint.com, ANDROID TUTORIAL, 2014

https://developer.android.com

https://stackoverflow.com/questions/tagged/android

https://android.stackexchange.com/

Similar Posts

  • Efectele Stresului Asupra Parintilor Care Au Copii cu Autism

    „Тοatе ființеlе umanе sunt născutе libеrе și еgalе, în dеmnitatе și drерturi”. (Dеclarația Univеrsală a Drерturilοr Оmului, 1984) IΝТRОDUCΕRΕ Atitudinеa sοciеtății cοnstituiе nuclеul în carе tеrmеnul dе handicaр ia naștеrе. Рrivind din acеastă реrsреctivă, la acеst nivеl, sе întrеțеsе cοncерtul dеficiеnțеi cοgnitivе asuрra tuturοr tiрurilοr și gruреlοr dе dеficiеnțе. Cοmрοrtamеntul dеrivat în urma atitudinii, ехрrimat…

  • . Considerente Legate de Proiectarea Antipertubativa a Cablajelor Imprimate

    2. Studiu bibliografic Generatoarele de semnale sunt aparate electronice care, în laboratoarele de măsurări electronice, sunt utilizate ca surse de tensiune variabile în timp, cu o anumită formă de undă și cu nivel și frecventă reglabile. În esența lor, generatoarele de semnal conțin circuite electronice care transformă energia furnizată de sursa de curent continuu (de…

  • Catalizatori de Polimerizare a Propilenei

    1.Progrese in productia de poliolefine 2.Polipropilena.Prezentare generala 2.1.Polipropilena-homopolimer 2.2.Copolimerii polipropilenei 2.2.1.Random copolimeri 2.2.2.Bloc copolimeri 2.2.3.Elastomeri termoplastici olefinici 2.3.Caracteristicile polipropilenei 2.3.1.Structura 2.3.2.Densitatea 2.3.3.Gradul de cristalinitate 2.3.4.Gradul de izotacticitate 2.3.5.Masa moleculara medie 2.3.6.Distributia masei moleculare 2.3.7.Proprietati mecanice 3.Catalizatori stereospecifici de polimerizare 3.1.Scurt istoric 3.2.Comparatii intre generatii de catalizator 3.2.1.Comparatie intre un catalizator de generatia a II-a si…

  • Comunicarea Ir Ca Mod de Analiza a Densitatii Traficului

    Cuprins Capitolul 1 Introducere…………………………………………………………………….4 Capitolul 2 Obiective și specificația proiectului………………………………….6 2.1. Obiectivul principal…………………………………………………….6 2.2. Obiective specifice……………………………………………………..6 Capitolul 3 Studiu Bibliografic……………………………………………………..7 3.1. Microcontrollerul…………………………………………………………7 3.1.1. Introducere………………………………………………………….7 3.1.2. Caracteristici……………………………………………………….8 3.1.3. Descriere………………………………………………………….8 3.1.4. Descrierea pin-ului……………………………………………10 3.1.5 Caracteristicile Oscilatorului………………………………..13 3.2. Alimentarea Electrică………………………………………………. …13 3.2.1. Transformatorul……………………………………………………14 3.2.2. Redresorul……………………………………………………………15 3.2.2.1. Tipuri de redresoare……………………………………………15 3.2.2.2. Compararea circuitelor redresoare……………………….15 3.2.3. Filtrul……………………………………………………………………16 3.2.3.1. Filtrul condensator………………………………………………16…

  • Proiectarea Tehnologiei de Fabricatie a Reperului Flansa

    Capitolul 1. Proiectarea tehnologiei de fabricație a reperului ”Flanșă” 1.1.Analiza functionala a reperului Reperul “Flanșă” face parte din construcția carcasei unui reductor de turație cu 3 trepte, cu raportul de transmitere i = 95,691. Flanșa se montează pe carcasa reductorului cu 6 suruburi M8. Prin deschiderea cu diametrul de 137 mm trece arborele principal al…