APLICAȚIE ANDROID PENTRU TRANSMITEREA DE MESAJE PE MAI MULTE PLATFORME [306332]

[anonimizat]: [anonimizat] – Tudorel

Coordonator științific:

Lect. univ. dr. Popescu Doru Anastasiu

PITEȘTI

2016

[anonimizat] “inteligente”, [anonimizat] a implementa sistemul și pe alte platfome. [anonimizat] o cotă de piață pentru telefoane la nivel mondial de 81,1%, [anonimizat], [anonimizat] 18,3%, iar restul procentelor avându-l companii precum Nokia prin Windows Phone sau Blackberry. [anonimizat], [anonimizat].

Acest aparent monopol creează în mod constant noi oportunități pentru dezvoltatorii de aplicații. [anonimizat] 2016 număra nu mai puțin de 2.000.000 [anonimizat], acest număr pare că va depăși 2.500.000 până la sfârșitul lui 2016. [anonimizat] ([anonimizat]) sau alternativa magazinelor și aplicațiilor independente. [anonimizat] a avea un “comportament etic”. [anonimizat] o [anonimizat]. Odată ce s-a încălcat o condiție, [anonimizat], [anonimizat]. [anonimizat] a instala aplicații din surse necunoscute este nevoie de o [anonimizat].

Aplicațiile din Google Play Store pot fi descărcate de către orice utilizator. [anonimizat] 30% ce va fi împărțit între costuri de operare și diverse sume către partenerii de distribuție. [anonimizat], dezvoltatorul primind aproximativ 0,002 [anonimizat].

În realizarea temei “Aplicație Android pentru transmiterea de mesaje pe mai multe platforme”, [anonimizat], Whatsapp, SMS, [anonimizat] a-și transmite mesajul. Aplicația „blink!” [anonimizat], fiind astfel o alternativă mult mai rapidă.

Capitolul 1. Noțiuni fundamentale despre Android

Istoric

Danger Hiptop/T-Mobile Sidekick

La începutul anilor 2000, telefoanele „inteligente” erau comparativ cu standardele de astăzi, încete, robuste, o piață dominată de Symbian, Windows Mobile și Blackberry. Deși idea unui telefon care era “mai mult decât un telefon” căpăta din ce în ce mai multă atenție, conceptul unui telefon inteligent accesibil tuturor rămânea totuși implauzibil.

Pași importanți au fost făcuți în anul 2002. Atunci, compania Danger fondată de inginerul veteran Apple, Andy Rubin, a scos pe piață modelul Hiptop. Acest telefon a ieșit instant în evidență datorită aspectului, având o tastaură orientată pe lățime și un ecran glisabil ce aducea aminte de consolele portabile de jocuri. De asemenea, soft-ul punea accent pe navigarea pe Internet, serviciul de mesagerie și poștă electronică în mod egal. Printr-un parteneriat cu compania de telecomunicații T-Mobile, Hiptop a fost îmbunătățit și redenumit Sidekick, brand-ul câștigând simpatizanți la un nivel nemaiîntâlnit pentru acea perioadă.

Fig. 1.1 – T-Mobile Sidekick

Primul telefon Android

La scurt timp dupa succesul lui T-Mobile Sidekick, Andy Rubin a părăsit Danger și a creat Android Inc., o companie de sine stătătoare, susținută financiar inițial aproape în totalitate de Rubin. Cu o mică echipă de ingineri software, Android plănuia lansarea unei noi generații de soft pentru telefoane inteligente, ce urmărea crearea unei experiențe a utilizatorului bazată pe conexiunea la Internet, având o politică de „sursă deschisă”. În iulie 2005 Android Inc. a fost cumpărată de către Google, pentru o sumă de aproximativ 50.000.000 de dolari, fapt ce a oferit companiei resursele necesare pentru dezvoltarea proiectului la scală largă.

Fig. 1.2 – T-Mobile G1

T-Mobile G1 a fost primul telefon Android disponibil pentru consumatori, începând cu data de 22 octombrie 2008. Deși nu avea specificații deosebite (funcționa cu sistemul de operare Android 1.0, procesor de 528 MHz cu un singur nucleu, 192 MB RAM) avea o tastatură QWERTY glisabilă și un ecran tactil supradimensionat, cel puțin pentru acea perioadă, ce-l diferențiau de celelalte telefoane de pe piață.

Companii precum LG și Apple facuseră deja pași importanți în dezvoltarea unui sistem de operare bazat numai pe ecranul tactil, dar designerii au considerat că o tastatură fizică ar fi o soluție mai indicată pentru început.

Versiuni

Android 1.5 Cupcake și Android 1.6 Donut

Deși au existat actualizări ale soft-ului (Android 1.1 a fost lansat în februarie 2009), primele schimbări au venit odată cu versiunile 1.5 (Cupcake) și 1.6 (Donut), lansate în aprilie 2009, respectiv septembrie 2009.

Android Cupcake a deschis drumul pentru telefoanele doar cu ecran tactil, având o tastatură implicită pe ecran și suport pentru alte terțe aplicații-tastatură. De asemenea, au fost introduse widget-urile pe ecranul de Acasă (ceas analog, calendar, player muzical, căutare și rama de fotografii), în timp ce funcții de bază pentru înregistrarea video au fost adăugate aplicației Cameră.

Android Donut a adus cu sine suportul pentru diferite rezoluții ale ecranelor și pentru rețelele CDMA. În plus, widget-ul de căutare de la Google a fost extins pentru a găsi rezultate nu doar în rețeaua de Internet, ci și în contactele telefonului, fișierele audio, aplicațiile instalate sau datele stocate ale aplicațiilor. Totodată, a fost adăugat un nou ecran ce monitoriza nivelul de energie al bateriei.

De asemenea, versiunea 1.6 a adus și prima actualizare a aplicației Android Market prin rearanjarea categoriilor. Ecranul de start afișa coloanele de Aplicații, Jocuri și Descărcări, iar în interiorul fiecărei categorii exista opțiunea de a explora aplicațiile de top cu plată, gratis, sau noi în magazin.

Personalizarea interfeței

Comparativ cu iOS și în cele din urmă Windows Phone, Android nu a adoptat un aspect propriu până relativ recent. Versiunile timpurii aveau un aspect simplu, utilitarist, iar grafica era de înțeles, la rezoluție mică, datorită dimensiunilor ecranelor de atunci. Aceasta eră în dezvoltarea sistemului coincide cu începutul tendinței companiilor producătoare de a avea propriul aspect. HTC a implementat Sense UI, una dintre cele mai bune interfețe la acea dată pentru a face experiența Android mai plăcută pentru utilizator. A urmat apoi Sony Ericsson, care a adus nou în Android 1.6 Timescape UI și Samsung, care a dezvoltat TouchWiz, interfață care este într-o continuă evoluție chiar și în ziua de astăzi.

De menționat este faptul ca odată standardizat, aspectul Android nu s-a schimbat major până la lansarea versiunii 2.2 Froyo, iar versiunile următoare, Gingerbread, Honeycomb și eventual Ice Cream Sandwhich, au introdus gradual schimbări ce aveau să pună accent pe aspect.

Fig. 1.3 – De la stânga la dreapta, Sense UI, Timescape UI și TouchWiz

Versiunile 1.5 și 1.6 au adus îmbunătățiri și la multe dintre aplicațiile preinstalate precum Android Market (acum Google Play Store) și Gmail. Este de menționat faptul că în acea perioadă aceste aplicații erau în mare parte componente ale sistemului de operare. Orice schimbare cât de mică a browser-ului, aplicației de poștă electronică sau calendarului, necesita actualizarea completă a soft-ului, operație ce acum este gestionată prin Google Play Store. Până la sfârșitul anului 2009, Android a mai făcut progrese în domeniul recogniției vocale și text-to-speech.

Android 2.0 Eclair și Android 2.2 Froyo

Android 2.0 a continuat dezvoltarea caracteristicilor cheie ale sistemului de operare cum ar fi sincronizarea contactelor și a conturilor pentru terțe aplicații, suport pentru căutare SMS și MMS sau funcția de zoom la acționarea unei duble atingeri a ecranului în browser. O actualizare a acestei versiuni, Android 2.1, a adus cu sine ecranele de fundal animate și câteva mici modificări la nivel de performanță.

Android 2.2 sau Froyo, a adus din nou îmbunătățiri la nivel de performanță datorită compilatoarelor JIT, punând totodată bazele pentru serviciile Google Play, o caracteristică ce avea să sosească doi ani mai târziu. Totodată, sistemul de operare a fost făcut mai accesibil pentru oamenii de afaceri prin suportul pentru Microsoft Exchange, și opțiunea de „administrator dispozitiv” pentru ștergerea datelor din telefon de la distanță. Mai mult, Android a primit un suport implicit pentru tethering, iar transmiterea de mesaje din Cloud către dispozitiv a creat noi oportunități pentru dezvoltatori prin extensia “Chrome to Phone”, care trimitea pagini web și locații din Google Maps din Desktop către telefon.

Lansarea Android pe tablete

Datorită succesului Apple cu iPad, s-a încercat mutarea competiției și pe piața tabletelor. La început, trecerea Android de la telefon la tabletă a fost lentă. Una dintre cauze a fost faptul că majoritatea consumatorilor ezitau să achiziționeze o tabletă deoarece nu existau destule aplicații destinate tabletelor, iar dezvoltatorii ezitau să dezvolte aplicații pentru o piață care nu era încă bine definită.

Samsung Galaxy Tab 7.0 a fost prima tabletă ce a rulat pe Android. Acest model a fost lansat în septembrie 2010, cu versiunea de Android personalizată 2.2. Deși au existat anumite probleme cu sistemul de operare care nu era adaptat pentru a pune în evidență caracteristicile tabletei sau cu aspectul aplicațiilor care depășea dimensiunea ecranului, nefiind concepute pentru astfel de rezoluții, per total, a fost un model apreciat.

Tableta avea un ecran de 1024×600 pixeli, care nu era susținut în mod oficial de Android, procesor Hummingbird de 1 GHz, cameră frontală de 1.3 MP și unitate de procesare grafică PowerVR SGX540 ce facea posibilă redarea video la rezoluție HD. De asemenea, tableta putea fi folosită și ca telefon.

Fig. 1.4 – Samsung Galaxy Tab 7.0

Totuși, în ciuda reținerii inițiale a consumatorilor, piața tabletelor a explodat la scurt timp după lansarea modelului Galaxy Tab. La o săptămână de la lansare, Samsung a anunțat vânzarea a nu mai puțin de 600.000 de unități, pragul de 1.000.000 fiind atins la data de 4 decembrie 2010.

Succesoarele acestui model, Galaxy Tab 2 7.0 și Galaxy Tab 10.1 au fost orientate către un raport calitate preț. Așadar, cum prețul a devenit unul accesibil nu doar persoanelor cu buget ridicat, și specificațiile au scăzut calitativ. Camerele frontale aveau acum calitate VGA, chipset-ul folosit fiind OMAP4430 de 1.0 GHz, cu două nuclee, iar frecvența de 5 GHz pentru rețelele fară fir nu a mai fost inclusă.

Android 2.3 Gingerbread și Android 3.0 Honeycomb

Lansat în decembrie 2010, Android Gingerbread a reprezentat prima revizie generală a sistemului, aducând tehnologii de ultimă generație precum NFC (near-field communication), sau îmbunătățirea performanței și gestiunii aplicațiilor. De asemenea, interfața a fost actualizată pentru facilita interacțiunea cu utilizatorul și a minimiza resursele folosite.

Spre deosebire de alte versiuni antecedente de Android, Gingerbread a primit actualizări pentru o perioadă îndelungată de timp. Datorită faptului că versiunea 3.0 Honeycomb a fost exclusiv pentru tablete, distribuitorii de telefonie mobilă au continuat să vândă telefoane ce rulau Android Gingerbread și ca atare, această versiune a rămas o țintă importantă pentru dezvoltatorii de aplicații în următorii doi ani.

Fig. 1.5 – Interfața actualizată a Android Gingerbread

Tot în decembrie 2010, a fost prezentată o versiune Android special proiectată pentru tablete, Android 3.0 Honeycomb. Până la acel moment, tabletele erau doar ecrane supradimensionate, ce rulau pe software destinat telefoanelor iar noul sistemul de operare s-a dorit a fi deschizător de drumuri pentru un nou aspect al interfeței, holografic, denumit sugestiv “Holo”. Culorile predominante erau negru și albastru iar sistemul de notificări fusese actualizat.

Android 4.0 Ice Cream Sandwhich

Android 4.0 a dus o interfață modernizată și per total ordonată, continuând de asemenea aspectul holografic stabilit odată cu Android Honeycomb. S-a încercat eliminarea tonurilor monotone de alb și gri din meniu prezente la versiunile anterioare și a fost introdus fontul “Roboto”, special proiectat pentru ecranele de înaltă rezoluție precum cel de ultimă oră al telefonului Samsung Galaxy Nexus. Deși butoanele și pictogramele aveau un design futurist, nu aveau un aer “științifico-fantastic” precum cele din versiunea anterioară.

Fig. 1.6 – Captură de ecran – Android 4.0

La această versiune în mod special s-a pus foarte mult accent pe detalii. Printre altele, au fost eliminate din design toate liniile și butoanele inutile și au fost adăugate anumite comportamente ale interfeței. De exemplu, sistemul prezenta sclipiri albăstrui atunci când utilizatorul ajungea la finalul unei liste, sau un contur luminos atunci când aplicațiile erau rearanjate.

De asemenea, au fost implementate elemente de design obișnuite precum bara de activități și meniuri “overflow” în aplicațiile Google, câteva dintre ele regăsindu-se până în prezent. Aceste trăsături aveau să evolueze în timp, dar cel mai important este faptul că existau anumiți parametri ce trebuiau respectați de dezvoltatori pentru ca aplicațiile să se integreze estetic în ecosistemul “Holo”, lucru nemaiîntalnit la alte versiuni de până atunci.

În plus, au fost făcute și schimbări la capitolul funcționalitate. Urmând exemplul tabletelor, telefoanele aveau butoane pe ecranul tactil și o tastă dedicată comutării între aplicațiile recente – inginerii Google fiind conștienti de faptul că din ce în ce mai mulți utilizatori foloseau telefonul pentru multi-tasking.

Android 4.0 a fost piatra de temelie pe care companiile producătoare de telefoane au proiectat dispozitivele anului 2012. Și, deși nu toate caracteristicile temei “Holo” aveau să se transmită produsului finit, a fost începutul unei noi ere în istoria Android.

Un nou tip de telefon – telefonul tabletă sau “phablet”

La conferința IFA 2011 din Berlin, Samsung a dezvăluit publicului Samsung Galaxy Note, telefon ce a șocat prin dimensiunile sale. Avea unul dintre primele ecrane HD SuperAMOLED de pe piața și măsura nu mai puțin de 13,5 cm. Totuși, dimensiunile ecranului nu erau decorative, Samsung așteptându-se ca utilizatorii să îl folosească atât la serviciu cât și în timpul liber. Ca atare, includerea „S-Pen” de la Wacom, un creion digital care nu necesita o baterie proprie, acesta putând fi andocat într-un slot din lateralul dispozitivului atunci când nu era folosit. Alte specificații includ, un procesor cu două nuclee de 1,4 GHz sau 1,5 GHz, 1 GB memorie RAM și cameră de 8 megapixeli capabilă să înregistreze Full HD, la 30 de cadre pe secundă.

Situat ca dimensiune între Samsung Galaxy S2 și tableta Galaxy Tab, una dintre marile îngrijorări ale distribuitorilor era faptul că telefonul era prea mare pentru a încăpea în buzunar și a fi manevrat cu ușurință. De fapt, însăși demumirea de “phablet” este o combinație între cuvintele “phone” și “tablet”, care face referire la dimensiune. Totuși, nu doar dimensiunea situa Galaxy Note la marginea dintre telefon și tabletă, ci și sarcinile pe care acesta le putea efectua.

Fig. 1.7 – Samsung Galaxy Note și S-Pen

Ideea din spatele Galaxy Note era că utilizatorii mai tineri aveau să îl folosească în scopuri creative, în timp ce oamenii de afaceri vor folosi ecranul generos pentru email-uri și creșterea productivității. Deși la momentul lansării mulți s-au îndoit de succesul său, în timp, Galaxy Note a dovedit că există întrebuințări pentru telefoanele cu ecrane enorme. Vânzările modelului au fost de 10.000.000 de unități și au ridicat compania Samsung la rangul de lider pe piața Android.

Succesorul modelului, Galaxy Note II, a prezentat îmbunătățiri la capitolul hardware, având un procesor cu 4 nuclee, un ecran mărit la 14 cm, 1.024 niveluri diferite de presiune adăugate creionului digital pentru introducerea mai precisă a datelor, precum și gesturi ce declanșau activități predefinite și capacitatea de a face multi-tasking în două ecrane diferite.

Magazinului Play

Una din marile schimbări ce au venit în 2012 a fost reinventarea Android Market. Prin Magazinul Play, Google a dorit să unifice toate serviciile oferite, cum ar fi Music sau Books, care aveau aplicațiile proprii, cu aplicația Android Market, de unde utilizatorii puteau descărca aplicații, pentru a crea o singură aplicație.

De asemenea, designerii s-au folosit de ocazie pentru a lansa o nouă interfață a aplicației Android și a site-ului web. În anii ce au urmat, Google Play a evoluat adăugând noi caracteristici atât pentru consumatori cât și pentru dezvoltatori. De exemplu, abonamentele recurente, tranzacțiile în aplicații și facturarea făcută de distribuitorul de telefonie mobilă au facilitat procesul de cumpărare, vindere și gestionare conținut. Google a încercat chiar pentru o scurtă perioadă de timp să vândă prin intermediul magazinului propriile dispozitive Nexus și linia de accesorii aferentă, deși ulterior toate aceste tranzacții au fost mutate pe o aplicație individuală.

Fig. 1.8 – Aspectul actualizat al Android Market, acum Google Play

Servicii

Pe lângă aplicațiile Android disponibile pentru descărcare, Google Play oferă o platformă online de muzică cu o bază de date de peste 35.000.000 de cântece, opțiunea de stocare gratuită în cloud a până la 50.000 de cântece și un abonament la un serviciu online de streaming numit Google Play Music, disponibil la momentul actual în 58 de țări.

De asemenea, Play Store este cel mai mare magazin de cărți în format electronic din lume, cu peste 5.000.000 de exemplare. Cărțile pot fi stocate în cloud sau descărcate în format PDF și EPUB. Cărțile pot fi transferate pe un număr de dispozitive ce suportă Adobe eBook DRM, pot fi citite online de pe orice browser cu JavaScript pornit, prin intermediul aplicației Google Play Books și pe browser-ul Chrome de pe orice platformă desktop, cu ajutorul unei aplicații HTM5 din Chrome Web Store. Momentan, serviciul este disponibil în 65 de țări.

Google Play Movies & TV este accesibil din 70 de țări și pune la dispoziție sute de filme și show-uri de televiziune, câteva chiar la rezoluție HD, ce cuprind genuri de la comedii și animații până la drame, acțiune sau documentare. Vizionarea se poate face pe site-ul Google Play sau prin intermediul unei aplicații, pe telefonul Android. Anumite producții pot fi disponibile doar pentru închiriere sau cumpărare, în timp ce altele pot fi disponibile atât pentru închiriere cât și pentru cumpărare. Serialele în mod special, pot fi cumpărate pe episod sau pe sezon, dar nu pot fi închiriate.

De asemenea, Google oferă abonamente la peste 1.900 de publicații de știri cu plată sau fără plată pentru lectura în cadrul serviciului Play Newsstand, disponibil în 38 de țări.

Magazinul Play are și un serviciu dedicat persoanelor ce folosesc aplicațiile de jocuri prin Google Play Games, ce prezintă capacități de jocuri multiplayer în timp real, salvări în cloud, clasamente publice și o secțiune de realizări. Potrivit Google, în perioada ianuarie 2014 – iunie 2014 s-au înregistrat peste 100.000.000 de noi utilizatori, devenind astfel cea mai rapid dezvoltată rețea de jocuri pentru telefonul mobil din toate timpurile.

Aplicația Google Play Services este o aplicație la nivel de sistem ce este actualizată în mod regulat în fundal, prin intermediul magazinului Play. Datorită accesului privilegiat, poate scana aplicații în timp ce acestea sunt instalate sau bloca și sterge de la distanță datele telefonului, dacă este necesar. Este de asemenea o țintă importantă pentru dezvoltatori, cărora le permite integrarea de servicii precum Google Play Games, Google Fit sau Android Wear.

Inițial, aplicația suporta toate dispozitivele până la Android 2.2 Froyo dar la momentul actual versiunea a fost mutată la 2.3 Gingerbread.

Fără Google Play Services telefoanele ar trebui să aștepte o nouă versiune de soft pentru a primi acces la noi caracteristici și ca atare amenințările de securitate nu ar mai fi așa ușor de detectat. Prin păstrarea modulului de securitate și al învelișului API în afara nucleului open-source al Android OS este redus riscul ca aplicații sau persoane rău-voitoare sa aibă acces la informații.

Android 4.1 Jelly Bean

Din punct de vedere mecanic, Android se schimbase enorm de la prima lansare cu telefonul T-Mobile G1. Totuși, majoritatea utilizatorilor încă îl foloseau doar pentru sarcini banale. O mare parte din faza a doua a dezvoltării sistemului era îmbunătățirea performanței, mai concret, reducerea timpului necesar pentru efectuarea unei sarcini și a energiei utilizate pentru a face acest lucru. Primul pas important în această direcție a fost făcut prin intermediul Android 4.1, cunoscut mai informal sub denumirea de Jelly Bean. Atenția deosebită care a fost acordată acestui proiect a făcut ca versiunea 4.1 să fie cea mai longevivă, primind actualizări din vara lui 2012 până în iarna lui 2013, când o nouă versiune a fost lansată.

Pentru dezvoltatori a fost adăgat API pentru accesibilitate, suport lingvistic extins cu text bi-dimensional, suport pentru gestionarea dispozitivelor de intrare (telecomenzile pentru jocurile video), acces la nivelurile cele mai de jos ale arhitecturii hardware si software ale codec-urilor audio și video etc.

Acum că Android era văzut ca lider în multe dintre piețele din jurul lumii, un aspect plăcut juca un rol important atunci când consumatorii comparau telefoanele Android cu alte telefoane intelegente. Tranzițiile mai line, un aer mai responsiv, animațiile îmbunătățite pentru derulare și o experiență vizuală fără probleme per total au fost elementele centrale ale acestui proiect.

Această versiune a introdus și Google Now. Adunând datele introduse în mod obișnuit prin intermediul tastaturii în conversații sau căutări, Google Now făcea sugestii referitoare la diferite opțiuni pe care utilizatorul le avea atunci când primea un mesaj electronic sau efectua o căutare.

Fig. 1.9 – Captură de ecran, Android 4.0

Ecranul de start implicit a căpătat odată cu Android Jelly Bean și noi caracteristici cum ar fi abilitatea altor scrurtături și widget-uri de a se auto-aranja pentru a face loc unui obiect mutat sau redimensionat. Sistemul de notificări a fost de asemenea îmbunătațit fiind adăugat conceptul de notificări “consumabile” și “acționabile”.

Android 4.4 KitKat

Versiunea 4.4 a fost lansată la 31 octombrie 2013 și deși nu a reprezentat o restructurare totală a aspectului, a adus câteva schimbări importante. Printre ele se numără bările de stare translucente, tastele software și utilizarea culorilor calde în interfață ce au conferit sistemului un aer mai plăcut.

Lansatorul de aplicații implicit a fost și el revizuit, aplicația Google Now fiind adăugată în partea cea mai din stânga a panoului de pornire, subliniind astfel importanța căutării predictive în ecosistemul Android. Această versiune în special a fost una în care amprenta Google s-a putut observa cel mai bine, fiind puse bazele pentru versiunile și dispozitivele generației următoare.

Plecând de la accentul pus pe îmbunătățirea performanțelor vizuale în Android 4.1, obiectivul principal al acestei versiuni a fost acela de optimizare a performanței per total pe dispozitivele mai puțin capabile din punct de vedere al specificațiilor, fără a compromite capacitățile sistemului și funcționalitatea. O unealtă specială de dezvoltare numită “proctools” a fost creată pentru a analiza memoria utilizată de aplicații, în special cele ce rulau servicii în fundal. Datele colectate au fost folosite pentru a optimiza și decupla aplicațiile și serviciile Google care nu erau eficiente. În plus, Android 4.4 a fost proiectat pentru a fi mai agresiv în gestionarea memoriei, apărând astfel sistemul de aplicațiile ce foloseau inutil memoria.

Android 5.0 Lollipop

Odată cu octombrie 2014 și lansarea Android 5.0, a venit și o schimbare radicală de design, aspectul „Holo” fiind înlocuit de “Material Design”. Acest lucru însemna culori mai vii, font-uri îngroșate și un design meticulos ce a fost construit pe ideea unei foi de hârtie ce se pliază în mai multe feluri, după cum este îndoită. Notificările puteau fi acum accesate din ecranul de deblocare și afișate în interiorul aplicațiilor ca bannere plasate în partea de sus a ecranului. Pentru prima dată design-ul precum și mii de noi API au fost puse la dispoziția dezvoltatorilor mai devreme, prin intermediul pachetului “Android L”.

Totuși, Android Lollipop nu a adus schimbări numai în materie de design. Noul proces de “Tap and Go” (apasă și fugi) al setărilor, a făcut tranziția de la o versiune Android la alta, mai ușoară, modul „Vizitator” și aplicațiile fixate, pentru atunci când altcineva decât utilizatorul controleză dispozitivul și “Vederea de ansamblu”, care facilitează comutarea între aplicații și multi-tasking-ul. În plus, Google a facut schimbări interne, Android Runtime (ART) înlocuind în mod oficial Dalvik pentru a crește performanța aplicațiilor.

Un număr de caracteristici la nivel de sistem orientate întreprinderilor pentru a segrega datele personale de cele profesionale au fost de asemenea introduse, sub denumirea de „Android for Work”. În plus, prin opțiunea „Smart Lock” dispozitivele puteau fi configurate astfel încât utilizatorii să nu mai fie nevoiți să introducă un cod sau un model pentru a debloca telefonul, atunci când se aflau într-o locație de încredere, în vecinătatea unui dispozitiv Bluetooth desemnat sau a unei etichete NFC. Lollipop trebuia să susțină și criptarea dispozitivului în mod implicit pe toate telefoanele cu specificații capabile de un asemenea lucru. Totuși, din cauza problemelor la nivel de performanță această caracteristică a fost amânată pentru versiunea următoare.

Fig. 1.10 – Android 5.0 Lollipop

Lollipop a acordat o atenție deosebită și optimizării consumului de energie. Au fost introduse un nou mod de economisire energie, API pentru programarea executărilor de sarcini numai atunci când telefonul este conectat la rețeaua Wi-Fi și gruparea sarcinilor pentru a reduce timpul general în care radio-urile interne sunt active. Mai mult, o nouă unealtă de dezvoltare numită „Istoricul Bateriei” a fost adăugată pentru a monitoriza consumul de energie al fiecărei aplicații în parte.

Android 6.0 Marshmallow

Android 6.0 Marshmallow este cea mai recentă versiune a sistemului de operare, fiind lansată la 5 octombrie 2015. Aceasta nu s-a dorit a fi o restructurare a sistemului ci mai degrabă o continuare a schimbărilor implementate în versiunea anterioară.

La capitolul aspect, Android 6.0 nu prezintă abateri față de designul stabilit de Android Lollipop. Există totuși diferențe cum ar fi scurtăturile către anumite setări care acum prezintă o miniatură a catergoriei de setări față de o miniatură implicită. Ecranul de deblocare păstrează aproape acealeași caracteristici mai puțin scurtătura din colțul din jos către aplicația de apel, care a fost înlocuită cu cea de căutare vocală. Sertarul de aplicații a devenit acum o listă ce se poate derula vertical comparativ cu derularea paginată orizontală din versiunea Lollipop și afișează aplicațiile folosite cel mai des la o anumită oră din zi, la începutul listei.

În plus, a fost adăugată o unealtă numită System UI Tuner ce odată activată furnzizează câteva simple modificări ale interfeței precum includerea procentajului bateriei la miniatura acesteia din bara de stare, personalizarea zonei de Setări rapide și un meniu pentru selectarea scurtăturilor prezente în bara de stare.

De asemenea, s-au facut progrese și în zona consumului de energie cu aplicații precum Doze și App Standby, care identifică dacă telefonul nu a mai fost folosit, caz în care este pus în modul de hibernare și dezactivează aplicațiile ce nu au mai fost folosite recent, pentru a nu mai putea accesa resurse.

Probabil caracteristica cea mai deosebită a acestei versiuni este Google Now on Tap. Printr-o apăsare lungă pe butonul Acasă, aplicația citește conținutul ecranului curent și afișează informații ce ar putea fi relevante cuvintelor cheie din conținut. Aceste rezultate pot fi căutari Google despre anumite persoane, locuri și lucruri menționate într-un articol, sau sugestii de aplicații. În acest fel, s-a dorit crearea unui mod instant de căutare și chiar dacă aplicația poate furniza informații irelevante uneori, este un pas important în direcția potrivită.

Fig. 1.11 – Google Now on Tap

În această versiune a fost introdusă și opțiunea de criptare dispozitiv, încercată inițial în versiunea 5.0, dar amânată din cauza problemelor de performanță pe anumite dispozitive. Pentru dezvoltatori au fost introduse API pentru integrarea căutărilor și comenzilor vocale actualizate și recunoaștere de amprente.

Alte proiecte

Google Glass

Numeroase companii au încercat de-a lungul timpului să implementeze Android pe alte dispozitive decât telefoane sau tablete. La conferința I/O din 2012 Google a prezentat un astfel de dispozitiv, prin Google Glass. La bază, era un telefon Samsung Galaxy Nexus care fusese micșorat pentru a putea fi susținut de o ramă de ochelari.

Fig. 1.12 – Google Glass

Comunicarea se realiza vocal și fiecare comandă trebuia să fie predecedată de formula “Ok, Glass!”. De asemenea, pe lateralul dispozitivului exista un touchpad prin care utilizatorul putea să navigheze prin interfață. Un ecran prin prismă oferea purtătorului acces la notificări atunci când acesta era privit iar bateria avea o autonimie de aproape 24 de ore. Modelul Glass era echipat și cu o cameră care putea face fotografii și înregistra video la calitate HD 720p.

Proiectul nu s-a materializat însă pentru a fi disponibil publicului la scală largă datorită plângerilor și criticilor primite, referitoare la încălcarea dreptului la intimitate și siguranță. Totuși, dispozitivul rămâne disponibil prin programul de dezvoltare Explorer.

Android Wear

Spre deosebire de celelalte proiecte, versiunea Android pentru linia de ceasuri Android Wear nu a fost niciodată cu sursă deschisă. Există câteva motive întemeiate pentru care Google a ales această strategie, unul dintre ele fiind că Wear se bazează în mare parte pe Google Play Services, proiect cu sursă închisă de asemenea. Ca atare, prin această măsură s-a prevenit producția ceasurilor de către firme care nu erau partenere și s-a evitat existența pe piață a dispozitivelor fără suport. Totuși, producătorii autorizați de ceasuri puteau să personalizeze design-ul și selecția de aplicații pre-instalate.

Fig. 1.13 – Concept Android Wear

Prima versiune a sistemului de operare pentru Android Wear, Android 4.4W se baza aproape în totalitate pe comenzi vocale, nu avea o metodă rapidă de acces la sertarul cu aplicații și avea un suport relativ limitat pentru rularea de aplicații. În schimb, dispozitivul acționa ca o platformă pentru a vedea cele mai noi notificări și interacționa cu aplicațiile telefonului, printr-o conexiune Bluetooth sau Wi-Fi.

Android Auto

Directorul departamentului de inginerie al Android, Patrick Brady declara că mașinile ne mențin conectați la lumea fizică, în mare parte, dar rămân deconectate față de alte dispozitive din viața noastră. Într-adevăr, în afară de conexiuni Bluetooth de bază nu existau alte opțiuni pentru utilizarea telefonului în mașină. Acest lucru a început să se schimbe prin proiectul Android Auto.

Pe scurt, telefonul este conectat la sistemul de infotainment, iar conținutul este afișat pe ecranul mașinii. Important este faptul că majoritatea proceselor se desfășoară pe telefon și nu pe soft-ul mașinii. Acest lucru înseamnă că atunci când o actualizare este necesară, gestionarea acesteia va fi făcută de telefon.

Fig. 1.14 – Android Auto

Prin intermediul conexiunii, șoferii au control asupra navigației prin GPS, redarea de melodii, trimiterii și citirii SMS, telefoniei și căutării web. Atât controlul prin ecranul tactil cât și prin butoanele mașinii este suportat, deși accentul este pus pe controlul hands-free, prin comenzi vocale, pentru un șofat mai sigur.

Primele mașini care au avut Android Auto instalat din fabrică au venit în 2015, cel mai notabil Hyundai Sonata, alți producători urmând exemplul la scurt timp după lansarea modelului.

Android TV

Android TV este o platformă pentru televizoarele inteligente bazată pe versiunile 5.0 și mai departe. Prin intermediul ei, utilizatorii au acces la Magazinul Play pentru a descărca aplicații Android, servicii de streaming precum Netflix sau Hulu cât și jocuri. Platforma pune accent pe comenzile vocale pentru a găsi conținut instant. Interfața este împărțită vertical în trei secțiuni: secțiunea de sus, recomandări bazate pe vizionările din trecut, aplicații media în cea de mijloc și jocuri în secțiunea de jos.

Fig 1.15 – Ecran de pornire Android TV

Navigarea se poate face folosind o manetă pentru jocuri, telecomandă, sau aplicația Android TV pentru telefonul mobil. De asemenea, este suportat și media player-ul Chromecast care face posiblă redarea conținutului de pe o rețea locală sau Internet, pe televizor.

Google a realizat un parteneriat cu Sony, Sharp și Philips pentru a oferi platforma pe televizoare în timp ce un parteneriat a fost realizat cu Razer și Asus pentru a lansa playere media ce pun acces pe experiența de gaming.

Capitolul 2. Dezvoltarea unei aplicații Android

Proprietățile sistemului

Android Open Source (sursă deschisă)

Android este bine-cunoscut ca un sistem de operare “open-source” sau cu “sursă deschisă”. Ca atare, codul sursă poate fi descărcat și modificat de către oricine, fapt ce a dat naștere AOSP (Android Open Source Project). Totuși, deși nucleul Android este cu sursă deschisă, aplicațiile Google pre-instalate nu sunt. Odată ce Google a finalizat dezvoltarea unei noi versiuni, codul este pus la dispoziția tuturor, de la companii majore până la cei ce dezvoltă din plăcere, pentru a-și putea realiza versiuni personalizate.

Desigur, există totuși anumite criterii care trebuie îndeplinite pentru a asigura compatibilitatea cu toate tipurile de dispozitive, criterii ce se regăsesc în Android Compatibility Program. Pentru a primi licența Google și a putea folosi serviciile Google (Play Store, Music, Photos etc.), producătorii și dezvoltatorii trebuie sa treacă toate testele de compatibilitate. În acest fel, este asigurat faptul că orice aplicație cu acces la magazin este compatibilă cu restul aplicațiilor din magazin.

Limbajul de programare

Deși Android , implementat pe nucleul Linux, a fost codat în mare parte în C, Android SDK utilizează limbajul de programare Java pentru dezvoltarea aplicațiilor. Totuși, nu este folosită versiunea familiară dezvoltatorilor ce utilizează Java Platform, Enterprise Edition (J2EE), ci un subgrup de biblioteci specifice.

Așadar, Android nu folostește mașina virtuală standard Java, în schimb folosind șiruri de biți ca un pas intermediar, care sunt apoi transformați în șiruri de biți Dalvik. În funcție de versiunea sistemului de operare, aceștia sunt interpretați fie de mașina virtuală Dalvik, fie compliați în cod nativ de către Android Runtime.

Componentele unei aplicații

Compomente programabile

Activitățile

O aplicație Android poate fi constituită din una sau mai multe activități, conceptul de activitate definind recipientul abstract atât al interfeței cu utilizatorul cât și al codului din spatele acesteia.

O activitate este o parte importantă a ciclului de viață al unei aplicații și felul în care acestea sunt lansate și implementate este un aspect fundamental al modelul de aplicație Android. Fiecare activitate este proiectată ca o implementare a clasei de bază Activity.

Ciclurile de viață ale unei activități

Fig 2.1 – Ciclul de viață al unei activități

Ciclul de viață întreg al unei activități durează de la primul apel, al metodei onCreate(), la utlimul apel, al metodei onDestroy(). Activitatea realizează toate aranjamentele necesare rulării în onCreate(), și eliberează toate resursele rămase în onDestroy().

Ciclul de viață vizibil are loc între apelarea metodelor onStrart și onStop(). În acest timp, utilizatorul poate vedea activitatea pe ecran (deși poate fi vorba și de activități care nu sunt în prim plan, de exemplu când utilizatorul inreacționează cu o fereastră de dialog). Se pot menține resure necesare pentru a afișa și rula activitatea. Metodele onStart și onStop() pot fi apelate de mai multe ori, după cum activitatea devine vizibilă sau ascunsă utilizatorului.

Ultimul ciclu, cel de prim-plan, începe la apelul metodei onResume() și se termină la apelul metodei onPause(). În acest timp, activitatea este în fața altor activități și interacționează cu utilizatorul. O activitate trece în mod normal prin metodele onResume() și onPause() de mai multe ori și, ca atare, codul din aceste metode nu trebuie să fie încărcat.

Intențiile

Intențiile sunt folosite pentru a începe activități și a comunica cu diverse componente ale sistemului de operare Android. Ele- sunt formate din două elemente: o acțiune generală ce urmează a fi realizată și datele pe baza cărora acțiunea operează. O aplicație poate fie să transmită o intenție, fie să o primescă. Totuși, trimiterea unei intenții nu este de ajuns pentru a declanșa o nouă activitate. Pentru a realiza acest lucru este nevoie de înregistrarea unui primitor de intenții (intent receiver).

Vederile

Vederile sunt un element de bază al interfeței Android. Ele ocupă un spațiu dreptunghiular al ecranului și sunt responsabile cu gestionarea evenimentelor. Pot fi de mai multe feluri, TextView (pentru a afișa variabile de tip text), ImageView (pentru a afișa imagini), Layout (pentru așezarea în pagină a interfeței cu utilizatorul) sau Button (pentru a crea butoane).

Apelurile asincrone

Clasa AsyncTask, specifică apelurilor asincrone, este folosită pentru a executa operații multiple simultan, fără a mai fi nevoie de gestionarea manuală a firelor de execuție. În general, este nevoie de prelucrarea asincronă a sarcinilor atunci când o activitate ar putea necesita mai multe resurse, cum ar fi comunicarea de date prin intermediul internetului, citirea informațiilor de pe dispozitivul de stocare și altele.

Nefolosirea modelului de programare asincron pentru sarcinile laborioase poate cauza încetinirea aplicației sau, în cel mai rău caz, afișarea ferestrei de dialog ANR (Application Not Responding), prin intermediul căreia utilizatorul poate alege să aștepte sau să închidă forțat aplicația.

Bara de acțiuni

Primele telefoane Android obișnuiau să aibă un buton fizic de meniu, ce odată apăsat afișa pe ecran anumite opțiuni din care utilizatorul putea să aleagă. Acest lucru s-a schimbat odată cu Android 3.0, când butonul de meniu a fost abandonat în favoarea mutării opțiunilor în spatele unui buton din bara de acțiuni.

Fig. 2.2 – Bara de acțiuni a aplicației YouTube

Butonul de înapoi conține de asemenea logo-ul aplicației și este responsabil cu navigarea înapoi cu un nivel. Spre deosebire de butonul fizic de înapoi care întoarce utilizatorul la activitatea precedentă, cel din bara de activități întoarce utilizatorul la activitatea precedentă a aplicației curente, chiar dacă acea activitate nu a fost accesată anterior.

Lângă logo-ul aplicației, în bara de activități se află câmpul de pagină care afișează pagina curentă.

Butoanele de acțiune sunt prezente în partea din dreapta, utilizatorul putând adăuga videoclipul la o listă de redare, distribui link-ul prietenilor sau căuta alte clipuri. Pe caz general, ele pot lua forma unui text, unei pictograme, sau amândouă, dezvoltatorul având posibilitatea să adăuge oricât de multe acțiuni, cele care nu au loc în bară fiind afișate într-un meniu overflow.

Notificările

Aplicațiile Android pot avertiza utilizatorul în anumite cazuri, cum ar fi existența unei actualizări sau primirea unui mesaj. Notificările apar în bara de stare a dispozivitivului și comportamentul acestora poate fi definit de către dezvoltator. De exemplu, o notificare se poate extinde atunci când este apăsată pentru a afișa mai multe detalii sau redirecționa utilizatorul către o activitate prin intermediul intențiilor.

Unelte hardware și software

Dispozitivele Android vin echipate cu câteva unelte hardware ce pot fi folosite de către orice dezvoltator, inclusiv cei începători. Totuși, pentru a le putea implementa, este nevoie de declararea lor în maifestul aplicației. Făcând acest lucru, la instalare utilizatorul este avertizat de accesul aplicației la anumite date private precum locația sau contactele, și își poate da acordul sau nu, caz în care procesul de instalare este suspendat.

Ecranul tactil

Ecranul unui dispozitiv Android oferă nenumărate posibilități pentru a îmbunătați interacțiunea untilizatorului. Dezvoltatorii se pot folosi de anumite gesturi predefinite cum ar fi zoom-ul prin apăsarea de două ori a ecranului, glisarea orizontală a degetului pe ecran care schimbă pagina curentă sau crea noi gesturi, personalizate pentru aplicația lor. De asemenea, Android suportă și capacitatea de multitouch, care permite utilizatorilor să controleze dispozitivul prin atingera ecranului cu mai mult de un deget.

Cardul SD

Sistemul de operare Android oferă și uneltele necesare pentru a accesa fișiere pentru scriere sau încărcare de pe cardul de memorie al unui dispozitiv. Această practică poate fi folosită pentru a nu supraîncărca memoria internă limitată a unor dispozitive cu date inutile.

Totuși, uneltele hardware nu sunt singurele caracteristici puse la dispoziție, ci de asemenea există și anumite unelte software.

Accesul la internet

Datorită capacităților dispozitivelor Android, utilizatorii pot accesa informații în timp real prin intermediul internetului. Ca dezvoltator, această caracteristică poate fi folosită pentru a menține datele aplicației actualizate, descărca noi versiuni sau pentru a stoca datele pe un server. În plus, procesele mai pretențioase din punct de vedere al resurselor pot fi transmise către un server pentru a îmbunătați timpul de procesare al datelor, practică foarte des întâlnită în arhitectura software.

Suportul audio și video

Majoritatea formatelor audio și video sunt suportate de către sistemul de operare, iar includerea conținutului multimedia în aplicații (efecte sonore, videoclipuri de instructaj, muzică de fundal etc.) este prezentă în numeroase dintre aplicațiile disponibile pe magazinul Play.

Google API

API-urile Google sau (Application Programming Interfaces) sunt un set de intefețe dezvoltate de Google și utilizate în programarea unui aplicații. Prin intermediul lor, dezvoltatorul poate integra servicii precum Google Play Services, Search, Gmail, Translate sau Google Maps. Aplicațiile pot folosi intefețele pentru a profita de serviciile existente sau de a extinde funcționalitatea lor.

Acestea mai oferă funcții precum serviciul de analiză al statisticilor de utilizare ale aplicației, sau accesul la datele utilizatorului, atunci când există această permisiune.

Fișiere XML

XML sau Extensible Markup Language, este un limbaj folosit pentru a adnota conținutul unui document. Acesta definește un set de reguli pentru codificarea documentelor într-un format accesibil atât programatorului cât și mașinii de programare. Scopul XML este de a evidenția simplitatea, generalitatea și utilizarea la scală largă, prin intermediul Internetului.

De asemenea, este un format textual de date cu un suport important prin intermediul Unicode pentru mai multe limbi. Deși design-ul XML se axează pe documente, este folosit în mod special pentru reprezentările arbitrare ale structurilor de date.

Fig. 2.3 – Exemplu de fișier XML

Structura unui document XML

Documentele XML pot începe prin declararea versiunii și codificării folosite, ca în exemplul: <?xml version="1.0" encoding="UTF-8"?>.

Prin definiție, un document XML este un șir de caractere. Cu excepția câtorva caractere de control, toate caracterele Unicode pot fi folosite. Pentru a transmite informațiile structurate către aplicație, sunt analizate marcajele documentului. Acestea pot fi “semne” sau „conținut” și pot fi distinse prin simple reguli sintactice. De obicei, șirurile de caractere care fie încep cu caracterul „<” și se termină cu „>”, sau încep cu caracterul “&” și se termină cu “;”, constituie un semn. Restul șirurilor care nu sunt semne sunt considerate conținut.

Etichetele sunt catalogate ca semne și pot fi de trei tipuri:

Etichete de început: <section>

Etichete de sfârșit: </section>

Etichete vide, ca de exemplu: <line-break />

Documentele logice componente care fie încep cu o etichetă de început și se termină cu eticheta de sfârșit corespunzătoare, sau constau doar într-o etichetă vidă, se numesc elemente. (Exemplu: <Greeting>Hello, world.</Greeting>). Caracterele aflate între etichetele de început și sfârșit, dacă există, sunt conținutul elemetului. Conținutul poate consta în semne și inclusiv alte elemente, numite copii.

Atributele sunt semne ale unei perechi nume/valoare care există în interiorul unei etichete de început sau vide. În exemplul de mai jos, elementul img are două atribute, src și alt.

<img src="madonna.jpg" alt='Foligno Madonna, by Raphael' />

AndroidManifest.xml

Acest fișier este esențial fiecărei aplicații Android, el ținând evidența tuturor lucrurilor necesare rulării aplicației. Ca atare, oferă informații despre numele pachetului Java utilizat, componentele aplicației (activități și servicii de fundal), declarări de permisiuni, sau nivelul minim al Android API necesar. De asemenea, fișierul manifest declară și versiunea curentă a aplicației, procesul de versionare necesitând ca proiectul să primească atât un cod de versiune cât și un nume.

Codul de versiune este o valoare de tip întreg folosită pentru a compara versiunile între ele. Această valoare este utilizată apoi de către alte aplicații pentru a determina gradul de compatibilitate, și de magazinul Play care folosește această valoare ca bază pentru a identifica aplicația și a gestiona actualizările. Așadar, versiunea inițială poate corespunde oricărei valori întregi, dar o versiunile ulterioară trebuie să aibă valori implicit mai mari decât cea anterioară.

Numele unei versiuni este un șir de caractere ce reprezintă versiunea de lansare a aplicației, așa cum va fi afișată utilizatorilor. Asemănator codului de versiune, șirul poate lua orice valoare, dar de obicei se folosește o structură de tipul <major>.<minor>.<punct> (de exemplu, 2.1.1, sau prin omiterea valorii de după ultimul punct întru totul, 2.1).

Permisiunile sunt linii de cod din manifest ce specifică sistemului resursele folosite. Acestea vor fi afișate pe ecran atunci cand utilizatorul instalează aplicația pentru a-și da acordul, caz în care procesul de instalare poate continua. Permisiunile cele mai des întâlnite în dezvoltarea aplicațiilor Android sunt următoarele:

Proiecte Android

Configurarea unui nou proiect

Pentru a dezvolta aplicații Android este nevoie de instalarea și configurarea anumitor unelte, inclusiv a kit-urilor de dezvoltare soft (SDK):

Java SDK care pune bazele pentru Android SDK .

Android SDK care face posibil accesul la bibliotecile Android.

Android Studio sau Eclipse IDE care aduce laolaltă Java și Android SDK și pune la dispoziție mediul de dezvoltare al aplicațiilor.

Alegerea versiunii țintă

Odată configurat mediul de dezvoltare, aceasta poate fi folosit pentru a crea noi proiecte Android. Primul pas în dezvoltarea proiectelor constă în alegerea unei versiuni țintă. Deoarece numărul versiunilor Android nu este limitat, o nouă adiție făcându-se în fiecare an, este important ca dezvoltatorul să aleagă o versiune țintă pentru proiect, în jurul caracteristicilor căreia să poată începe procesul de dezvoltare.

Fig. 2.4 – Cota de piață a fiecărei versiuni Android, în mai 2016

Fiecarei versiuni îi corespunde o interfață de dezvoltare API și o cotă de piață. Deși cea mai recentă versiună are la ora actuală o cotă de piață de doar 7.5%, prezintă o creștere substanțială față de cota de 0.7% de la începutul acestui an, Ca atare, este de preferat să fie găsită o cale de mijloc între cota de piață și uneltele de dezvoltare. De exemplu, dacă aplicația necesită unelte de dezvoltare din cea mai recentă versiune Android, atunci nu va putea rula pe dispozitive cu versiuni mai vechi.

De asemenea, Google încurajează dezvoltatorii să susțină și versiunile mai vechi în aplicațiile lor pentru a ajuta la o răspândire mai uniformă a versiunilor.

Dosarele unui proiect

În Android Studio, fișierele unui proiect sunt organizate pe categorii, fiecare având câte un dosar specific (de exemplu, dosarul manifests conține manifestul aplicației, sau dosarul java conține fișierele sursă .java).

Dosarul res este cel care conține toate fișierele de tip resursă (XML). Acesta poate conține la rândul său următoarele sub-dosare:

** Resursele întâlnite de obicei în dosarul values pot fi arrays.xml (fișier XML folosit pentru a stoca șiruri de caractere și numere întregi laolaltă), colors.xml (pentru a defini resurse de culoare ce pot fi accesate prin intermediul clasei R.color), dimens.xml (pentru a defini dimensiuni accesibile prin intermediul clasei R.dimen), strings.xml (pentru valori șiruri de caractere accesibile prin clasa R.string), și styles.xml(pentru resurse de tip temă, accesibile prin clasa R.style).

Adăugarea unei activități

Android Studio oferă posibilitatea adăugării unor activități pre-programate. Printre selecțiile disponibile se numără activitatea de autentificare, de integrare Google Maps, sau activitatea „pe tot ecranul” .

Fig. 2.4 – Structura unui fișier de tip activitate în Android, metoda onCreate()

Punctul de plecare în orice activitate este metoda onCreate(). Pentru ca orice aplicație să funcționeze este nevoie de supra-scrierea acestei metode. Ea se realizează prin linia de cod super.onCreate(savedInstanceState). Parametrul folosit memorează starea în care se află aplicația pentru a o putea recrea dacă este nevoie. Lipsă acestei linii de cod va duce la o eroare de tipul RuntimeException. Tot în interiorul metodei se definește și interfața respectivei activități, prin intermediul liniei de cod setContentView(R.layout.activity_main). În acest caz, activity_main este fișierul XML ce conținte toate datele despre interfața aplicației și astfel, se precizează sistemului ce anume să caute și să încarce pe ecran.

Odată finalizați acești pași, se poate trece la personalizarea activității prin adăugarea metodelor și programelor necesare de către dezvoltator.

Pentru a putea fi introduse date în cadrul activității, este nevoie de declararea unui ascultător de evenimente care urmărește toată activitatea înregistrată de ecranul tactil. Apoi, pentru ca aplicația să răspundă la eveniment, este nevoie și de un gestionar. Astfel, în funcție de gestul detectat de ecranul tactil, este declanșat un anumit comportament al aplicației.

Capitolul 3. Aplicație Android de transmitere mesaje pe mai multe platforme

“That’s all it takes to be connected”

Descrierea aplicației

Prin intermediul aplicației blink! utilizatorul are o modalitate extrem de rapidă de a contacta un prieten pe toate platformele de socializare importante. Așadar, un utilizator poate alege între Facebook, Whatsapp, mesaj SMS, și până la 3 adrese diferite de mail. Odată selectate platformele, se poate folosi de cele 100 de caractere alocate pentru a-și transmite mesajul. De reținut este faptul că blink! nu este un serviciu de mesagerie, aplicația doar notificând destinatarul că este căutat.

În lumea aplicațiilor Android, numele, aspectul și sloganul sunt la fel de importante pentru reușită ca aplicația în sine. Numele monosilabic și ușor de pronunțat, „blink!” precum și semnul de exclamație de la final, au fost adoptate pentru a reda ușurința cu care aplicația poate fi folosită, și rapiditatea serviciului (blink = clipită în limba engleză). De asemenea, sloganul “That’s all it takes to be connected” (Doar de-atât este nevoie pentru a fi conectat) este utilizat pentru a accentua ideea de rapiditate.

Interfața are un design simplist și ușor de înțeles, în ton cu scopul aplicației. Logo-ul este reprezentat de o „bulă” de mesaj ce conține numele aplicației ușor stilizat, i-ul și n-ul fiind contopite, scris cu un font de culoare albastră, pe fundal alb. În plus, culorile predominant folosite în interfață sunt alb și albastru pentru a conferi un aspect uniform.

Module componente

Proiectul este compus din 13 clase Java, fiecare având un rol specific în structura aplicației. Pe lângă clasele obișnuite de login/logut sau cea principală, există clase abstracte, responsabile cu obținerea locației, implementarea bazei de date, ori monitorizarea conexiunii la internet.

LoginActivity

Clasa lansator este LoginActivity.java, prin intermediul ei utilizatorul autentificându-se în aplicație. Datorită faptului că orice utilizator Android are un cont de Gmail necesar accesării serviciilor Google și implicit magazinului Play, blink! a fost dezvoltată pentru a putea opera pe contul de Gmail al utilizatorului.

Fig. 3.1 – Ecranul de pornire al aplicației blink!

Așezarea în pagină a ecranului principal constă în logo-ul aplicației, starea utilzatorului curent și butonul de autentificare. Datorită proprietății de localizare a SDK-ului oferit de Google Play Services, textul afișat pe buton va fi tradus automat. De menționat este faptul că acest ecran este afișat numai în cazul în care datele de autenficare ale utilizatorului nu mai sunt valide.

Odată deschisă aplicația, se verifică conexiunea la internet prin metoda isNetworkConnected() pentru a putea încerca operațiunea de autentificare. Dacă telefonul nu este conectat la o rețea internet, este afișat un mesaj ca atare, de fiecare dată când butonul de autentificare este apăsat, iar restul procedurilor nu se mai execută.

private boolean isNetworkConnected()

{
ConnectivityManager cm =

(ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
return cm.getActiveNetworkInfo() != null;
}

În cazul în care există conexiune la internet, se verifică dacă datele utilizatorului logat anterior sunt încă valide, pentru a putea trece direct la ecranul principal.

if (opr.isDone())// datele utilizatorului sunt încă valide

{
Intent blink;
blink=new Intent(getApplicationContext(), MainActivity.class);
startActivity(blink);

GoogleSignInResult result = opr.get();
handleSignInResult(result);
}

else //datele au expirat ori utilizatorul nu a mai fost logat anterior

{
showProgressDialog();
opr.setResultCallback(new ResultCallback<GoogleSignInResult>()

{
@Override
public void onResult(GoogleSignInResult googleSignInResult)

{
hideProgressDialog();
handleSignInResult(googleSignInResult);
}
});
}

În final, dacă niciun utilizator nu este logat în aplicație, se afișează o fereastră de dialog pentru a putea selecta unul dintre conturile Google înregistrate deja în memoria telefonului, sau adăuga un cont Gmail nou.

După ce utilizatorul a fost autentificat cu succes, se salvează ID-ul Google al acestuia într-un obiect de tipul SharedPreferences, pentru a putea fi folosit ca parametru intern al anumitor metode, și de asemenea, se face trecerea la ecranul principal.

GoogleSignInAccount acct = result.getSignInAccount();
String personId = acct.getId();

email.storeId(personId);

Intent GoHome = new Intent(getApplicationContext(), MainActivity.class);
startActivity(GoHome);

Pentru a putea integra procesul de autentificare prin adresa de Gmail în aplicație, este nevoie mai întâi de îndeplinirea câtorva cerințe, cum ar fi versiunea de Android 2.3 sau mai nouă, cea mai recentă versiune a Android Software Development Kit (SDK) și de asemenea, SDK-ul pentru Google Play Services.

Odată îndeplinite aceste cerințe, se poate trece la pasul următor și anume, obținerea unui fișier de configurare. În acest scop, se completează un formular cu numele aplicaței, pachetul folosit și codul SHA-1. Rolul acestui cod este acela de a crea un client OAuth2 și un cod API al aplicației. Pentru generarea lui, se rulează următoarea comandă în Command Prompt:

keytool -exportcert -list -v \-alias androiddebugkey -keystore %USERPROFILE%\.android\debug.keystore.

După rularea comenzii, codul rezultat va fi format din 20 de grupuri de cifte și litere, grupate două câte două și despărțite prin două puncte, așa cum arată exemplul următor: DA:39:A3:EE:5E:6B:4B:0D:32:55:BF:EF:95:60:18:90:AF:D8:07:09.

Numai după ce toți acești pași au fost parcurși cu succes, se poate genera și descărca un fișier .json, care poate fi apoi importat în proiect. În final, se adaugă următoarele linii de cod fișierelor build.gradle de la nivelul proiectului, respectiv aplicației:

classpath 'com.google.gms:google-services:2.0.0-alpha6'

apply plugin: 'com.google.gms.google-services'

MainActivity

Clasa MainActivity.java este așa cum sugerează și numele, clasa centrală a proiectului. Ea conține metodele pentru transmiterea mesajelor pe diferite platforme și reprezintă totodată ecranul principal aplicației.

Fig. 3.2 – Ecranul principal al aplicației

Elementul central al interfeței este logo-ul, afișat în partea de sus a ecranului, imediat sub bara de acțiuni. De asemenea, interfața este alcătuită din 5 câmpuri de text (unul pentru mesaj, număr de telefon, iar ultimele trei pentru adrese de email), precum și din două căsuțe ce pot fi marcate pentru a trimite mesajul atât pe Facebook cât și pe WhatsApp. Odată marcate sau demarcate, starea lor se va memora pentru a fi reinițializată de fiecare dată când utilizatorul deschide aplicația.

În dreptul fiecărui câmp de text se află câte un buton care dacă este apăsat, va trimite mesajul doar către adresa sau numărul de telefon respectiv. Excepție face butonul din dreptul casetei de mesaj, care dacă este apăsat, va lansa în execuție motorul de speech-to-text și va transforma spusele utilizatorului în mesaj text.

Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault());
intent.putExtra(RecognizerIntent.EXTRA_PROMPT,
getString(R.string.speech_prompt));
try

{startActivityForResult(intent, REQ_CODE_SPEECH_INPUT);}

catch (ActivityNotFoundException a)

{showToast(getString(R.string.speech_not_supported));}

Butonul principal, aflat în josul ecranului, este denumit sugestiv “blink!”, și realizează transmiterea simultană a mesajelor către toate datele introduse. Dacă acesta sau oricare alt buton este apăsat deși nu sunt introduse date, va afișat un mesaj corespunzător însoțit de apelarea funcției de vibrație pentru 100 de milisecunde.

showToast("Insert a valid recipient and a message");
Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
vibrator.vibrate(100);

Pentru a trimite mesaje către un anumit număr de telefon, este utilizat manager-ul SMS din API-ul Google. Numărul este preluat din caseta de text corespunzătoare și apoi transmis ca parametru al metodei. Pentru a putea fi trimise mesajele ce depășesc limita impusă de distribuitorii de telefonie mobilă, este utilizată funcția sendMultipartTextMessage, care împarte mesajul în părți egale cu până la 160 de caractere.

try
{

SmsManager smsManager = SmsManager.getDefault();
ArrayList<String> parts = smsManager.divideMessage(text);

no=phoneNumber.getText().toString();

smsManager.sendMultipartTextMessage(no, null, parts, null,

null);
showToast("SMS successfully sent");
}

catch (Exception ex)
{

showToast("Error: Operation not done");
ex.printStackTrace();
}

În implementarea procesului de transmitere mesaje prin intermediul poștei electronice, a fost necesară importarea a trei biblioteci externe, și anume mail.jar, activation.jar și additional.jar, pentru a evita afișarea unei ferestre de dialog prin intermediul căreia utilizatorul să selecteze aplicația de mail dorită, și a folosi serviciul Gmail, în schimb.

Toate email-urile trimise din aplicația “blink!” au ca expeditor universal adresa blink.message@gmail.com, și au o structură predefinită. Ca subiect, este afișat mesajul “You have a blink! from” împreună cu numele utilizatorului preluat din contul de Gmail, iar la mesajul propriu zis se adaugă adresa de Gmail a expeditorului (utilizatorul curent), pentru a facilita un evenual raspuns.

La transmiterea în sine a mesajului sunt utilizate sarcinile asincrone, deoarece implementarea cu un singur fir de execuție a proceselor ce necesita conexiunea activă la internet poate bloca aplicația, din cauza resurselor necesare pentru efectuarea lor.

@Override
protected Void doInBackground(String… data)

{
String r = data[0];
String b = data[2];
String name = personemail.getName();

try
{
sender.sendMail("You have a blink! from " + name, b + "\n" +

data[1],"blink.message@gmail.com", r);
}

catch (Exception ex){ }

return null;
}

Implementarea funcțiilor pentru WhatsApp se poate dovedi a fi problematică din cauza faptului că platforma nu suportă trimiterea directă a mesajelor prin intermediul altor aplicații. Opțiunile disponibile pentru dezvoltatori sunt fie deschiderea unei fereste de dialog pentru ca utilizatorii să aleagă din conversațiile recente un contact căruia mesajul predefinit să îi fie trimis, fie deschiderea unei ferestre de dialog cu un anumit contact, dar fără posibilitatea încărcării mesajului predefinit.

myClip = ClipData.newPlainText("text", text);
myClipboard.setPrimaryClip(myClip);

Uri uri = Uri.parse("smsto:" + phoneNumber.getText().toString());
Intent i = new Intent(Intent.ACTION_SENDTO, uri);
i.setPackage("com.whatsapp");
startActivity(Intent.createChooser(i, ""));

showToast("Message copied to clipboard. Paste it here.");

Ca atare, odată trimis mesajul către un număr de telefon, conținutul acestuia este copiat în clipboard. Dacă a fost bifată căsuța pentru trimiterea mesajului și pe WhatsApp, urmează ca o fereastră de conversație cu respectivul contact să se deschidă, unde utilizatoriul poate lipi conținutul din clipboard, sau scrie un alt mesaj.

Fig 3.3 – Ferestrele de dialog deschise pentru Facebook, respectiv WhatsApp

Similar procedeului de integrare Gmail în aplicație, pentru a putea implementa funcțiile necesare trimiterii mesajelor către platforma Facebook Messenger, este necesară îndeplinirea cerințelor minime de sistem, și anume versiune Android corespunzătoare API 15 (Android 4.0.3), sau mai recentă. Apoi, se adaugă fișierului build.gradle următoarele linii de cod:

repositories { mavenCentral() }

compile 'com.facebook.android:facebook-android-sdk:[4,5)'.

Odată făcuți acești pași, se completează un formular cu numele pachetului utilizat și al clasei principale. Fișierului strings.xml i se adaugă șirul de caractere corespunzător codului de identificare generat de Facebook, iar manifestului Android proprietatea de meta-data corespunzătoare.

<string name="facebook_app_id">1698761427010638</string>

<meta-data android:name="com.facebook.sdk.ApplicationId"

android:value="@string/facebook_app_id"/>

La pasul următor este nevoie de generarea unui cod “hash” specific stagiului de dezvoltare al aplicației. Acest lucru se realizează prin rularea următorului set de comenzi, în Command Prompt: keytool -exportcert -alias androiddebugkey -keystore %HOMEPATH%\.android\debug.keystore | openssl sha1 -binary | openssl base64. Rezultatul va fi un cod format din numere și cifre generate aleator, de forma PQ9lnSVCveO4br0SRIQjpEGCG40=EvvdwgRV+DOQjP4X7YYTjCrUtHI=.

Asemănător problemelor ce pot fi întâmpinate atunci când un dezvoltator implementează funcții pentru platforma WhatsApp, de asemenea, aplicația Facebook nu susține trimiterea mesajelor către Facebook Messenger prin intermediul unor terțe-aplicații. Soluția oferită dezvoltatorilor constă în deschiderea unei ferestre de dialog, ShareDialog, ce conține o listă cu toate contactele utilizatorului, cele mai frecvent utilizate aflându-se la începutul listei. De asemenea, există și posibilitatea căutarii după nume a unui utilizator, precum și opțiunea pentru expediere destinatari multipli.

Deoarece prin intermediul ShareDialog încărcarea unui mesaj cu text predefinit nu este permisă, conținutul trimis va fi sub forma unei legături către o pagină web care va afișa mesajul, precum și datele de contact ale expeditorului.

ShareLinkContent shareContent = new ShareLinkContent.Builder()
setContentUrl(Uri.parse(

"http://tudor182.5gbfree.com/~tudor182/index.php?message=" +

messagebody + "&name=" + personemail.getName()))
.setContentTitle("You have a blink!")
.setContentDescription(messagebody)
.build()

sendButton.setShareContent(shareContent)

Conținutul paginii web va fi preluat din adresă, cu ajutorul funcției PHP, ECHO. Așadar, dintr-o legătură ce redirecționează către o pagină web din aplicație, având forma următoare: https://tudor182.5gbfree.com/index.php?message=Salut%21&name=Ionut+Stoica, mesajul preluat va fi “Salut!”, iar expeditorul “Ionuț Stoica”.

Fig. 3.4 – Mesajul afișat sub forma unei pagini web

Meniul corespunzător acestei clase are două opțiuni, pentru adăugarea contactelor din memoria telefonului sau din baza de date a aplicației. La selectarea opțiunii de navigare prin agenda telefonului, este lansată o intenție pentru deschiderea acesteia. Atunci când este selectat un contact, toate datele relevante aplicației (nume, număr de telefon, adresă/adrese de email) sunt memorate într-o variabilă de tip cursor, ale cărei valori se vor transmite câmpurilor de text pentru a fi completate automat.

if (emailCursor.isAfterLast() == false)
{
String email =

emailCursor.getString(emailCursor.getColumnIndex(ContactsContract.

CommonDataKinds.Email.DATA));
recipient.setText(email, TextView.BufferType.EDITABLE);
emailCursor.moveToNext(); }

Fig. 3.5 – Meniul, împreună cu activitățile lansate

Odată ce datele au fost introduse iar operațiunile de trimitere a mesajelor au fost declanșate, la finalul lor se verifică ramura din meniu de pe care informațiile au fost preluate sau dacă ele au fost introduse manual. În primul caz, când a fost utilizată agenda telefonului, se face testul existenței unui contact cu același număr în baza de date și dacă rezultatul este negativ, contactul este introdus cu numele din agendă. În al doilea caz, se verifică de asemenea existența unui alt contact cu același număr în baza de date, iar dacă raspunsul este negativ, se va adăuga în baza de date cu numele generic “Unassigned blink! contact”.

În plus, există opțiunea de căutare din interiorul clasei, fără a mai fi nevoie să fie accesat meniul. Atunci când utilizatorul apasă butonul de căutare din bara de stare, aceasta se va modifica, afișând interfața de căutare. Odată introdus numele contactului căutat și se apasă butonul “Enter”, dacă există un contact cu acel nume, datele sale vor fi afișate. În caz contrar, se va deschide o listă vidă și va fi afișat mesajul “No such contact”. De altfel, dacă sunt introduse doar porțiuni din nume, va fi afișată o listă cu toate contactele al căror nume conțin acel șir de caractere. De menționat este faptul că după ce a fost stabilită o listă de afișat, rezultatele căutării vor fi afișate în timp real.

Atunci când un utilizator dorește să părăsească aplicația, apăsarea butonului de înapoi o singură dată atunci când se află în ecranul principal, va duce la afișarea mesajului “Press back again to leave”. Așadar, este nevoie de două apăsări consecutive ale butonului de “Înapoi”, într-un interval de 2 secunde, lucru realizat prin supra-scrierea metodei onBackPressed().

@Override
public void onBackPressed() {
if (doubleBackToExitPressedOnce) {
moveTaskToBack(true);
super.onBackPressed();
return;}
this.doubleBackToExitPressedOnce = true;
showToast("Press back again to leave");
new Handler().postDelayed(new Runnable() {
@Override
public void run() {doubleBackToExitPressedOnce=false}},2000);}

ContactsMain

Fig. 3.6 – Interfața clasei ContactsMain.java

Opțiunea de căutare în baza de date coincide de fapt cu lansarea în execuție a clasei ContactsMain.java. Așadar, vor fi afișate toate contactele memorate corespunzătoare utilizatorului curent, sub forma unei liste, în ordinea în care au fost adăugate.

De menționat este faptul că atunci când ecranul este apăsat pentru o perioadă mai îndelungată, datele contactului respectiv sunt încărcate în câmpurile de text ale clasei MainActivity, pentru a putea fi folosite ca destinatar. Acest lucru a fost realizat prin implementarea metodei onActivityResult în clasa MainActivity și utilizarea unei intenții de revenire (return intent) în interiorul clasei ContactsMain.

Intent returnIntent = new Intent();
returnIntent.putExtra("result", phone);
returnIntent.putExtra("result2", email);
returnIntent.putExtra("result3", email2);
returnIntent.putExtra("result4", email3);
setResult(Activity.RESULT_OK, returnIntent);
finish();

Gestul printr-o singură apăsare a fost rezervat afișării datelor de contact pe un nou ecran. Așadar, când un contact este selectat pentru a fi afișat, este lansată o intenție către clasa DisplayContact, ce va conține ca parametru adițional ID-ul din baza de date, urmând ca pe baza lui să se preia informațiile relevante.

Bundle dataBundle = new Bundle();
dataBundle.putInt("id", id_To_Search);

Intent intent = new Intent(getApplicationContext(), DisplayContact.class);

intent.putExtras(dataBundle);
startActivity(intent);

Prin intermediul meniului se pot adăuga noi contacte sau șterge toate contactele, caz în care se va afișa o fereastră de dialog cu mesajul: “Are you sure you want to delete all contacts?”, precum și opțiunile: “Yes” și “No”. De asemenea, această clasă implementează interfața SearchView.OnQueryTextListener, pentru caracterisica de căutare, care se face apăsând butonul specific din bara de stare, rezultatele fiind afișate în timp real.

Fig. 3.7 – Interfața de căutare

ContactsMain2

ContactsMain2.java prezintă mici modificări la nivelul metodelor față de clasa ContactsMain.java, ea fiind folosită pentru a gestiona rezultatele căutarilor provenite din MainActivity.java. A fost adoptată această strategie deoarece contactele afișate în urma acestor căutări sunt doar pentru vizualizare sau editare, nu și pentru selectare ca destinatari. Ca atare, gestul de a apăsa lung pe ecran nu va avea niciun efect în interiorul acestei clase.

DisplayContact

Clasa DisplayContact.java este o extindere a clasei ContactsMain, ea putând fi accesată numai prin intermediul acesteia. Este folosită pentru a afișa pe ecran toate datele corespunzătoare unui contact selectat. Pentru a realiza acest lucru, se preia parametrul din intenție corespunzător ID-ului din baza de date. Apoi, pe baza acestuia, se memorează într-un cursor toate informațiile necesare. Odată finalizat procesul de încărcare a datelor, acestea sunt încărcate în câmpurile de text și sunt afișate pe ecran. De asemenea, cu ajutorul meniului se pot edita datele contactului sau șterge contacul.

Fig. 3.8 – Afișarea tuturor datelor de contact, clasa DisplayContact.java

DBHelper

Clasa DBHelper.java reprezintă implementarea bazei de date SQLLite în Android. Acest sistem de gestionare baze de date este folosit în mod special pentru stocarea pe plan local a datelor unui client. De asemenea, sintaxa interogărilor este aproape identică cu cea din MySQL.

Această clasă conține așadar tabelul cu toate datele de contact, precum și metode de scriere, ștergere sau modificare contact. Tabelul folosit pentru stocarea datelor se numește “contacts” și conține următoarele coloane:

id, variabilă de tip întreg care este de altfel și cheie primară – reprezintă un număr unic atribuit fiecărei intrări;

name, variabilă de tip text – reprezintă numele cu care va fi memorat contactul în baza de date;

number, variabilă text – reprezintă numărul de telefon al contactului;

email, variabilă text – reprezintă adresa de poștă electronică a contactului;

email2, variabilă text – reprezintă adresa de poștă electronică secundară a contactului;

email3, variabilă text – reprezintă o eventuală adresa de poștă electronică terțiară a contactului;

user, variabilă text – folosită pentru a memora ID-ul atribuit de Google contului de Gmail.

Tabelul se inițializează la fiecare instalare a aplicației prin intermediul metodei standard onCreate(db).

@Override
public void onCreate(SQLiteDatabase db)

"create table" + " contacts" +
{ db.execSQL(
"(id integer primary key, name text, phone text, email text,

email2 text, email3 text, user text)"); }

Majoritatea metodelor implementate au ca parametru valoarea din coloana user, pentru a departaja în acest fel datele ce trebuie afișate, de celelalte valori din tabel.

Fig. 3.9 – Tabelul “contacts”

public Cursor getData(int id)

{
SQLiteDatabase db = this.getReadableDatabase();
Cursor res = db.rawQuery( "select * from contacts where id="+id+"", null );
return res;

}

UserData

Această clasă de tipul SharedPreferences este folosită pentru a memora date precum starea anumitor butoane, setări, și a transmite informații între clase. Fiecare intrare sau grup de intrari în baza de date trebuie să aibă atât o metodă de scriere, cât și o metoda de preluare a informațiilor. De exemplu, pentru a stoca ID-ul Google al unui utilizator a fost implementată metoda storeId(id). Asemănător principiului bazei de date SQLLite, majoritatea metodelor folosesc ID-ul Google ca parametru, pentru a putea deosebi datele diferiților utilizatori între ele.

public void storeId(String id)
{
SharedPreferences.Editor userLocalDatabaseEditor =

userLocalDatabase.edit();
userLocalDatabaseEditor.putString("userid", id);
userLocalDatabaseEditor.commit();
}

Apoi, pentru a putea prelua informația referitoare la ID, a fost implementată metoda getUserId(), având următorul cod:

public String getUserId()

{
String id = userLocalDatabase.getString("userid", "");
return id;
}

Odată finalizată implementarea clasei, se poate crea un obiect de tipul UserData în interiorul clasei în care se dorește utilizarea, prin intermediul liniei de cod (data = new UserData(this);). Apoi, se pot folosi metodele fie de scriere, fie de preluare a unor anumite informații, ca în exemplul: data.getLocationSettings(userID).

GmailSender și JSSEProvider

Această clasă a fost implementată pentru a stabili serviciul de Gmail ca serviciu de posță electronică implicit, în cadrul aplicației blink!. Pentru realizarea acestui lucru a fost nevoie de importarea a trei librării externe precum și de implementarea unei clase adiționale furnizor de securitate, JSSEProvider.

În interiorul clasei GmailSender, se setează mai întâi parametrii clasei de proprietăți, după care se încearcă operația de autentificare în contul de Gmail, prin intermediul clasei javax.mail.Authenticator.

Properties props = new Properties();
props.setProperty("mail.transport.protocol", "smtp");
props.setProperty("mail.host", mailhost);
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.port", "465");
props.put("mail.smtp.socketFactory.port", "465");
props.put("mail.smtp.socketFactory.class",
"javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.socketFactory.fallback", "false");
props.put("mail.smtp.starttls.enable", "true");
props.setProperty("mail.smtp.quitwait", "false");

session = Session.getInstance(props, new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(user, password);
}
});
session = Session.getDefaultInstance(props, this);

La inițializarea aplicației, în cadrul metodei onCreate() din clasa principală, se crează un obiect GmailSender, având ca parametru adresa implicită pentru trimiterea mesajelor precum și parola.

sender = new GMailSender("blink.message@gmail.com", "***********");

Apoi, metoda sendMail din interiorul clasei GmailSender, definită mai jos, este apelată prin intermediul acestui obiect de fiecare dată când destinatarul mesajelor are ca adresă și o adresă de poștă electronică.

public synchronized void sendMail(String subject, String body,
String sender, String recipients) throws Exception

{
MimeMessage message = new MimeMessage(session);
DataHandler handler = new DataHandler(new ByteArrayDataSource(
body.getBytes(), "text/plain"));

message.setSender(new InternetAddress(sender));
message.setSubject(subject);
message.setDataHandler(handler);

if (recipients.indexOf(',') > 0)
message.setRecipients(Message.RecipientType.TO,
InternetAddress.parse(recipients));
else
message.setRecipient(Message.RecipientType.TO, new

InternetAddress(recipients));
Transport.send(message);
}

Clasa JSSEProvider (Java Secure Socket Extension Provider) este folosită pentru a face legătura între versiunile modificate de SSLContext, KeyManagerFactory pentru certificatul X509, TrustManagerFactory pentru certificatul X509 și AndroidCAStore.

public class JSSEProvider extends Provider {
public JSSEProvider() {
super("HarmonyJSSE", 1.0, "Harmony JSSE Provider");
AccessController
.doPrivileged(new java.security.PrivilegedAction<Void>() {
public Void run() {
put("SSLContext.TLS",
"org.apache.harmony.xnet.provider.jsse.SSLContextImpl");
put("Alg.Alias.SSLContext.TLSv1", "TLS");
put("KeyManagerFactory.X509", "org.apache.harmony.xnet.provider.jsse.KeyManagerFactoryImpl");
put("TrustManagerFactory.X509", "org.apache.harmony.xnet.provider.jsse.TrustManagerFactoryImpl");
return null;
}
});
}
}

NetworkChangeReceiver

Deoarece în afară de transmiterea mesajelor SMS, toate celelalte mesaje sunt transmise prin intermediul conexiunii la internet, a fost necesară implementarea unei clase care să monitorizeze starea acesteia și să alerteze utilizatorul în cazul în care a fost întreruptă. Ca atare, similar procesului de verificare rețea făcut înaintea oricărei autentificări, cu ajutorul manager-ului de conexiune a fost implementată metoda isNetworkAvailable. În cazul în care conexiunea a fost pierdută, se va afișa o fereastră de dialog în timp real.

Fig 3.10 – Mesajul de alertă conexiune întreruptă

LogoutActivity

Clasa LogoutActivity.java este lansată în execuție de fiecare dată când butonul din mijlocul barei de acțiuni este apăsat. Pe lângă rolul în procesul de dezautentificare, ea mai îndeplinește rolul de pagină de Profil și de Setări.

Partea de sus a interfeței constă în avatarul utilizatorului care este preluat de pe contul de Gmail, sau o imagine generică, dacă acesta nu are un avatar setat. În dreapta imaginii, se află numele precum și adresa de Gmail a utilizatorului.

Fig. 3.11 – Interfata clasei LogoutActivity.java

De asemenea, se poate seta o semnătură care să fie adăugată automat la finalul oricărui mesaj, în cazul în care câmpul respectiv de text este completat. În plus, se poate bifa dacă locația să fie inclusă sau nu în mesaj, ori dacă utilizatorul dorește să primească notificări cu privire la noi versiuni ale aplicației.

În partea de jos a ecranului, există un buton cu textul “Get download link”, care apăsat, copiază în clipboard o legătură către un site de unde se poate descărca aplicația.

Atunci când un utilizator autentificat accesează clasa, se preiau date precum numele sau avatarul contului de Gmail, pentru a putea fi afișate, și se salvează în baza de date SharedPreferences adresa de email și ID-ul Google.

GoogleSignInAccount acct = result.getSignInAccount();

mStatusTextView.setText(acct.getDisplayName());
data.storeEmail(acct.getEmail();, acct.getDisplayName());
data.storeId(acct.getId(););
mEmailTextView.setText(personEmail);

Apoi, cu ajutorul bibliotecii externe Glide, se setează imaginea utilizatorului din adresa URL alocată de Google avatarului.

Glide.with(getApplicationContext())
.load(acct.getPhotoUrl())
.placeholder(R.drawable.photo_default)
.into(imgView);

Pentru a putea sesiza când anume sunt introduse caractere în câmpul de text pentru semnătură, a fost implementat un ascultător care face vizibil butonul de memorare de fiecare dată când textul memorat este modificat. Odată apăsat butonul, semnătura este memorată în baza de date SharedPreferences iar butonul devine invizibil, din nou.

data.storeSignature(signature.getText().toString(), email.getUserId());
showToast("Saved");
save_signature.setVisibility(View.INVISIBLE);

Similar Posts