Asistent personal de fitness [604268]
UNIVERSITATEA POLITEHNICĂ BUCUREȘTI
FACULTATEA DE ELECTRONICĂ, TELECOMUNICAȚII ȘI TEHNOLOGIA
INFORMAȚIEI
Asistent personal de fitness
Proiect de diplomă
prezentat ca cerință parțială pentru obținerea titlului de Inginer în domeniul
Electronică, Teleco municații și Tehnologia Informației programul de studii
de licență Calculatare și tehnologia informației
Coordonator științific: Absolvent: [anonimizat]. Dr .Ing. Bogdan Emanuel IONESCU Alexandra BUGA
2020
2
3
4
5
6
7
Cuprins
LISTA FIGURILOR ………………………….. ………………………….. ………………………….. …………………………. 9
LISTA TABELELOR ………………………….. ………………………….. ………………………….. ……………………… 11
LISTA ACRONIME LOR ………………………….. ………………………….. ………………………….. ……………….. 13
Introducere ………………………….. ………………………….. ………………………….. ………………………….. ………… 15
Context ………………………….. ………………………….. ………………………….. ………………………….. …………… 15
Scopul lucrării ………………………….. ………………………….. ………………………….. ………………………….. …. 15
Aplicații existente ………………………….. ………………………….. ………………………….. ………………………… 15
Structura lucrării ………………………….. ………………………….. ………………………….. ………………………… 16
Capitolul 1 – Partea teoretică ………………………….. ………………………….. ………………………….. …………… 19
1.1 Tehnologii folosite ………………………….. ………………………….. ………………………….. ………………. 19
1.1.1. Android ………………………….. ………………………….. ………………………….. ………………………….. ………. 19
Caracteristici Android ………………………….. ………………………….. ………………………….. ……………………….. 19
Versiuni ………………………….. ………………………….. ………………………….. ………………………….. ………………… 20
Arhitectura pe niveluri a sistemului Android ………………………….. ………………………….. …………………… 21
Elementele componete ale unei aplicații Android ………………………….. ………………………….. ……………… 24
1.1.2. Android Studio ………………………….. ………………………….. ………………………….. ………………………… 31
1.2. Senzori ………………………….. ………………………….. ………………………….. ………………………….. ….. 33
1.2.1 Sensor Framework ………………………….. ………………………….. ………………………….. ………………………… 34
Senzori de mișcare ………………………….. ………………………….. ………………………….. ………………………….. ….34
Accelerometrul ………………………….. ………………………….. ………………………….. ………………………….. ………. 35
Step Detector ………………………….. ………………………….. ………………………….. ………………………….. …………. 36
Step Counter ………………………….. ………………………….. ………………………….. ………………………….. …………. 37
Capitolul 2 – Implementarea și utilizarea aplicației ………………………….. ………………………….. ……….. 39
2.1 Structura Aplicației ………………………….. ………………………….. ………………………….. ……………. 39
2.2 Funcționalitatea aplicației ………………………….. ………………………….. ………………………….. ….. 40
MainActivity ………………………….. ………………………….. ………………………….. ………………………….. …………….. 40
PersonalNotes ………………………….. ………………………….. ………………………….. ………………………….. ……………. 42
DbHelper ………………………….. ………………………….. ………………………….. ………………………….. ………………….. 44
StepCounterActivity ………………………….. ………………………….. ………………………….. ………………………….. …..45
Metoda propus ă 1 – Accelerometrul ………………………….. ………………………….. ………………………….. …….45
Metoda propusă 2 – StepCounter ………………………….. ………………………….. ………………………….. ……….. 47
8
Metoda propusă 3 – StepDetector ………………………….. ………………………….. ………………………….. ……….. 48
CalculatorBMI ………………………….. ………………………….. ………………………….. ………………………….. ………….. 48
Counter ………………………….. ………………………….. ………………………….. ………………………….. …………………….. 49
VideoExercises ………………………….. ………………………….. ………………………….. ………………………….. ………….. 52
Capitolul 3 – Rezultate experimentale și discuții ………………………….. ………………………….. …………… 53
Capitolul 4 – Concluzii și posibilități de dezvoltare ………………………….. ………………………….. ………. 55
4.1 Concluzii ………………………….. ………………………….. ………………………….. ………………………….. ……. 55
4.2 Posibilități de dezvolt are ………………………….. ………………………….. ………………………….. …….. 55
Bibliografie ………………………….. ………………………….. ………………………….. ………………………….. ………… 57
9
LISTA FIGURILOR
Figura 1.1 – Arhitectura Sistemului Andro id………………………………………………………………………………. 21
Figura 1.2 – Arhitectura SQLite ……………………………………….. ………………………………………………………. 23
Figura 1.3 – Tipuri de Intent …………………………………………………………………………………………………….. .25
Figura 1.4 – Utilizarea intentului implicit ………………………………………………………. …………… ……………… 26
Figura 1.5 – Ciclul de viață al unei Activități(Activity) …………………………………………………………………. 28
Figura 1.6: Utilizarea fragmentelor ………………………………………………………. …………………………………… 29
Figura 1.7: Ciclul de viață al unui fragment ………………………….. ……………………………………………………. 30
Figura 1.8 – Mediul de dezvoltare Android Studio ………………….. …………………………………………………… 31
Figura 1.9 – Crearea unui dispozitiv virtual …………………………………………………………………………………. 32
Figura 1.10 – Interactiv e Previw …….. ……….. ……………………………………………………………………………… .32
Figura 1.11 – Tipuri de senzori ……………………………………… …………………………………………………….. ……3 3
Figura 1.12 – Sistemul de coordonate folosit de senzor …………………………………………………………………3 5
Figura 2.1 – Pagina principală a aplicației și fișierul său xml ………………………………………………………….4 0
Figur a 2.2 – Crearea butoanelor ………………………………………………………………………………………… ………4 1
Figura 2.3 – Deschiderea activităților cu ajutorul Intent -urilo r……………………………………………. ………… 42
Figura 2.4 – Încărcarea bazei de date ……………………………………………………………………43
Figura 2.5 – Ștergerea informațiilor din baza de date …………………………………………………..43
Figura 2.6 – Definirea bazei de date …………………………………………………………………….44
Figura 2.7 – Inserarea unui tas k în baza de date …………………………………………………………44
Figura 2.8 – Lucrul cu baza de date ……………………………………………………………………..45
Figura 2.9 – Definirea tipului de senzo r folosit – accelerometru …………………………………………………….4 5
Figura 2.10 – Codul ce calcuează numărul de pași ………………………………………………………………………. 46
Figura 2.11 – Filtru trece jos pentru eliminarea forței gravitaționale ……………………………………46
Figura 2.12 – Definirea tipului de senzor folosit – stepcounter ………………………………………….47
10
Figura 2.13 – Definirea tipului de senzor folo sit – StepDetector ……………………………………….48
Figura 2.14 – Colectarea numărului de pași …………………………………………………………………………………. 48
Figura 2.15 -Calculul indicelui de masă corporal ………………………………………………………………………….. 49
Figura 2.16 – Introducerea unui input …………………………………………………………………………….. …………..5 0
Figura 2.17 – Buton de start/pauză ………………………………………………………….. …………………………………. 50
Figura 2.18 – Metoda StartTimer() ……………………………………………………. ………………………………………. 51
Figura 2.19 – Metoda updateCountDownTe xt()……………………………………………………………………………5 1
Figura 2.20 – Metoda updateWatchInterface ………… …………………. …………………………………………………. 52
11
LISTA TABELELOR
Tabel 1.1 – Versiuni de Android …………………………………………………………………………….. ………………….. 21
Tabel 3.1 – Rezultate experiment 1 …………………………………………………………………………………………….5 3
Tabel 3.2 – Rezultate experiment 2 ………………………………………………………………………………………. …….54
Tabel 3.3 – Acutatețea aplicațiilor …………………………………………………………………………………………….. .54
12
13
LISTA ACRONIMELOR
2D – Two Dimensional
3D – Three Di mensional
3GP(3GPP ) – Third Generation Partnership Project
API – Application program interface
ARM – Advanced RISC (Reduced Instruction Set Computer) Machine
ART – Android R untime
CPU – Central processing unit
GPL – General public license
IDE – Integrated development environment
JVM – Java Virtual Machine
MIDI – Musical Instrument Digital Interface
MP4 – Moving Picture E xpert Group -4
MPEG4 – Moving Picture Experts Group 4
SDK – Software Development kit
SQL – Structured Query Language
VM – Virtual Machine
14
15
Introducere
Context
Tehnologia a evoluat tot mai rapid în ultimele decenii, ajungând să facă parte din viața fiecăruia
dintre noi, indiferent dacă lucrăm în domeniu sau nu. Astfel, indiferent de vârstă sau categorie socială,
oricine deține cel puțin un telef on smart.
Deși am crede că odată cu evoluția tehnologiei, menită să facă viața mai ușoară, omul modern ar avea
mai mult timp pentru activitați personale . Însă acest lucru nu este întodeauna adevărat. Omul modern,
atât de preocupat de angajamentele profesio nale, uită de cele mai multe ori să aibă grijă și de el însuși.
Astfel, pentru a veni în ajutorul lui, au apărut o serie de aplicații menite sa -l ajute să aib ă un stil de
viață sănatos , fără a -l împie dica să -și reali zeze activitățile profesionale.
Scopul lucrării
Scopul acestei lucrări este acela de a dezvolta o aplicație ce poate rula pe sistemul de operare Android.
Funcția principală a acestei lucrăr i este acela de veni în ajutorul persoanelor car e doresc să aibă un
stil de viață sănatos . În urma studi erii aplicațiilor de pe magazinul virtual Google Play , am observat că
deși sunt multe aplicații de acest gen, cele mai multe dintre ele fie nu au toate aceste funcționalități într –
o singură aplicație, fie trebuie să plătești pentru a le putea acces a.
Aplic ația pune la dispoziție utilizatorului următoarele funcționalități:
• Contorizarea numărului de pași astfel încât utilizatorul să știe cât de activ a fost într-o zi. Această
funcționalitate este destina tă atât persoanelor care nu au o activitate fizică prea solicitantă, dar și celor
care d oresc să alerge.
• Calcularea indicelui de masa corporala, pentru ca utilizatorul să poate avea o imagine asupra greutătii
sale și aceea ce înseamnă pentru corpul său. În funcție de acest indice, fiecărui utilizator i se va re comanda
o dieta personalizată ce constă într -o alimenție potrivită, dar și o serie de exerciții fizice.
• Introducerea progresului făcut de utilizator, pr ecum și a unor note personale.
Aplicații exist ente
La momentul actual, pe piață există o gama variat ă de aplicații de tip fitness și pe care le voi
compara cu aplicația prezentată în acestă lucrare. În continuare voi prezenta câteva dintre acestea :
16
1. Google Fit
Google Fit este o aplicație de fitne ss dezvoltată de Google și este compatibilă atât cu sist mul de
operare Android, cât și cu IOS. Această aplicație poate colecta informații de la mai multe dispozitive,
precum ceasuri smart, brățări de fitness , iar toate funcționalitările sale sunt gratuite.
Principalele funcționalități:
• Măsoară numărul de pași pe care utiliza torul îi face într -o zi și calculează numărul de calorii pe
care le arde cu ajutorul senzorilor incorporați în telefon .
• Adăugarea diferitelor activități fizice și monitorizarea timpului de execuție al acestora in vede rea
calculării numărului de calorii ars e.
• Păstrarea într -un jurnal toate activitățile utilizatorului.
Deoarece aplicația folosește pedometrul incorporat în telefon sau tabletă, aceasta nu va oferi
întotdeauna cele mai bune rezultate. Pentru a avea parte rezultate precise, aplica ția trebuie con ectată la o
brătară fitness sau la un ceas smart .
2. Walking & Running Pedometer for Health & Weight – Pacer
Pacer este o aplicație de fitness compatibilă atât cu sistmul de operare Andr oid, cât și cu IOS.
Spre deosebire de Google Fit aceasta nu poate fi conectată la brățări sau ceasuri smart.
Acestă aplicație dispune urmatoarele funcționalități:
• Măsoară numărul de pași pe care utilizatorul îi face într -o zi și calculează numărul de calor ii pe
care le arde cu ajutorul senzorilor incorporați în telefon.
• Propunerea unui program de recuperare a utilizatorului, însă pentru a avea acces la această
funcționalitate utilizatorul trebuie să cumpere varianta premium.
• Poate interacționa cu alți utili zatori și să intre în competiții cu aceștia
Structura l ucrării
În cadrul acestei lucrări vor fi abordate toate noțiunile teoretice necesare pentru a indeplini
obiectivul propus, acela de a dezvolta o aplicație de fitness ce va rula pe sistemul de operare Android.
Astfel, în următorul capitol va fi prezenta tă partea te oritică a acestei lucrări, care va consta în
descrierea sistemului de operare, a tehnologiilor folosite în vederea realizării aplicaței. Toate aceste
tehnologii vor fi abordate prin intermed iul studierii decumantației oficiale, dar și a literat urii de
specialitate.
17
Al doilea capitol constă în partea practică a aplicaței. Vor fi detaliate structura aplicației, procesul
de dezvoltare al acesteia și modalitatea de implementare a noțiunilor prez entate în partea teoretică.
În ultimul capitol al luc rării va consta în concluziile la care am ajuns în urma dezvoltării acestei
aplicații, dar și câteva posibile dezvoltări ulterioare ale acesteia.
18
19
Capito lul 1 – Partea teoretică
1.1 Tehnologii folosit e
În cele ce urmează vor fi detaliate tehnologiile folosite pentru a dezvolta aplicația prezentată.
Proiectul a fost realizat folosind tehnologii si tool -uri open -source și bine documentate. Aceasta
decizie a fos t făcută deoarece astfel de tehnologii prezintă c âteva avantaje, cum ar fi:
• Din punct de vedere al dezvoltării aplicației costul este redus, deoarece nu este necesară achiziționarea
unor licențe.
• Datorită faptului c ă exist ă comunități mari de utilizatori și dezvoltatori care lucrează la aceste tehnologii
înseamnă că va exista întotdeauna suport din partea acestor comunități, dar si acces la diverse librării
specializate.
Aplicația este destinată dispozitivelor mobile ce ruleaza sistemul de operare An droid , aceasta fiind
realizată astfel cu ajutorul kitului de dezvoltare software Android SDK. Mediul de dezvoltare ales este
Android Studio, IDE – ul oficial al Android. Codul sursă a fost scris în limbajul de programare Java.
1.1.1. Android
Caracteristici Andro id
Android este o arhitectura software de tip open so urce oferită de Open Handset Alliance și
Google . Platforma Android include un sistem de operare , middleware și aplicații cheie pentru
funcționarea sistemului . Din punct de vedere al funcționalităților , Android incorporează diverse
caracteristici ce se găse sc în toate telefoanele din z ilele noatre, precum: un browser integrat, grafică
optimizată, framework -uri de aplicație , media suport, tehnologii de rețea, etc .
Platforma Android este un produs open sour ce și ofer ă dezvol tatorilor libertatea de a modifica
conținutul sau nu și de a -l distribui mai departe fară a fi nevoie să fie sub licența Apache . Excepție face
nucleul de Linux, care se afla sub licentă GPL versiunea 2.6, și care presupune că orice modifi care a
surselor trebuie făcută publică și distribuită tot gratuit și se află sub licența GPL versiunea 2.6 . Un avantaj
al faptul ca este un produs open source es te acela că dezvoltatorii aduc adesea fucntionalități noi și
actualizări pentru dispozitive car e nu mai primesc actualizări oficiale.
Suportă diferit e tipuri de formaturi cum ar fi: MP4, 3 GP, MPEG4, MIDI, ceea ce înseamnă că nu
este necesara convertirea unui format într-un alt timp de format pentru a putea fi complatibile cu
platforma. De asemenea , oferă suport pentru grafică 2D și 3D .
Datorită faptulu i că toate progr amele sunt scrise în Java , portabilitatea codului este un avantaj
major , deoa rece există posibiltatea portării codului pe diferite arhitecturi(ARM, x86).
20
Versiuni
Fiecare versiune de A ndroid reprezintă un nivel API ce constă în comunicați a dintre codul scris
și resursele (funcții și funcționalități ) dispozitivului pe care rulează și este unic .
Sistemul Android de niveluri API ajută Android să stabilească dacă o aplicație este compatibil ă
cu sistemul înainte ca aceasta să fie instalata pe d ispozitiv. Astfel, este trebuie ținut cont de acest nivel
API atunci când proiectăm o aplicație. Cu cât nivelul API al unei aplicații este mai ma i mic cu atât el va
fi mai compatibil cu mai multe versiu ni de Android.
În următoar ul tabel sunt enumerate toat e versiuni le de Android până la momentul actual.
Denumire Versiune API LEVEL
Base 1.0,1.1 1-2
Cupcake 1.5 3
Donut 1.6 4
Eclair 2.0,2.0.1,2.1.𝑥 5−6−7
Froyo 2.2 8
Gingerbread 2.3−2.3.2,2.2.3−2.3.4 9−10
Honeycomb 3.0.𝑥,3.1.𝑥,3.2 11−12−13
IceCr eam
Sandwich 4.0−4.0.2,4.0.3−4.0.4 14−15
Jelly Bean 4.1−4.1.1,4.2−4.2.2,4.3 16−17−18
KitKat 4.4 19
KitKat Watch 4.4W 20
Lollipop 5.1,5.1 21−22
Marshmallow 6.0 23
Nougat 7.1,7.1 24−25
21
Oreo 8.0, 8.1 26−27
Pie 9.0 28
Tabel 1.1 [1]
Arhitectura p e niveluri a sistemului Android
Sistemul Android este compus din cinci nive luri: Applications, Application Framework, Librarii,
Android Runtime și Linux kernel , fiecare depinzând de funcționali tățile oferite de nivelul inferior
acestuia, așa cum se poate observa în figura 1.1:
22
Figură 1.1– Arhitecura sistemului Android [2]
La baza arhitecturii Android stă Linux K ernel 2.6 cu aproximativ 115 straturi și asigură
funcționalitatea de bază a sistemului cum ar fi: managementul proceselor, managementul memoriei,
managementul dispozitivelor precum camera, tastatură, display, etc . De asemenea , kernerul se ocupă și
cu gestionarea rețelei și a driverelor, astfel kernerul acționează ca un strat de abstractizare hardware î ntre
hardwar e și software -ului Android. [3]
Nivelul Runtime este timpul de lucru folosit de c ătre aplicații si unele servicii de sistem pe
Android . Include, de asemenea, un set de librării care susțin o mare parte din fun cționalităț ile limba jului
Java și un VM (Virtual Machine) . Acestea au fost optimizate și modificate de către Google pentru a fi
compatibile cu platforma Android și astfel a luat naștere Dalvik. Dalvik a fost creat de la zero și optimizat
în special pentru dispozitive cu memorie și CPU limitate . Spre deo sebire de JVM, care este o mașină de
tip stivă , Dalvik este o mașină de tip registru infinit. Acest lucru un avantaj față de mașinile de tip stivă :
necesită cu 30% mai puține instrucțiuni fată de o mașină de tip stivă pentru a realiza același calcul
cauzân d astfel o expediere de instrucțiuni mai redusă și accesul la memorie se face mai rar. Odată cu
apariția versiunii 5.0, Dalvik este înlocuită cu ART. [3]
Nivelul Libraries include un set de librării C/C++ ce sunt folosit e de diferite componente ale
sistemul ui Android și care asigură suport pentru application framework.
Un exemplu de astfel de librărie este SQLite, librărie folosită și în aplicația prezentată în aceast ă
lucrare.
SQLite este o bază de date SQL integrată și nu are un server de procesare separa t precum alte
baze de date SQL. SQLite scrie și citește date direct pe disk. Este o bibliotecă compactă, astfel
dimensunea librăriei poate fii mai mică de 500KiB , însă acest lucru depinde și de platforma pe care este
folosit dar si de setările de optimiza re ale compilatorului.
23
Figura 1.2 – Arhitectura SQLite [4]
Clasa SQL iteOpenHelper este cea mai importantă clasa a sistemului Android care prelucrează
date ce trebuiesc stocate și este prezentă în namespace -ul andr oid.database .SQLite .
SQLiteOpenHelper este o clasă ajutătoare(helper) ce a fost proiectată pentru extinderea și
implementarea unor sarcini sau acțiuni importante atunci când se creaz ă, deschide sau folosește o bază
de date. [5]
Nivelul Application Framewo rk stă la baza funcționării tuturor ap licațiilo r și pune la dispoziție
framework -ul API(Ap plication Programming Interface) și un set de servicii care asigură accesul la
funcționalitațile nivelurilor cele mai de jos, precum componetentele grafice, managere de schimb de
informație, managere de a ctivităti, etc. Câteva exemple de astfel de mecanism exemplificate :
• Views – este folosit pentru a a crea interfața grafică. Poate conține liste, butoane, browser web
integrat, etc.
• Content Providers – asigură accesul l a datele altor apli cații.
24
• Resource Man ager – asigură accesul la resursele non -nucelu (non-core) , precum string -urile,,
layout -urile, etc.
• Notification Manager – permite aplicațiilor să trimită diferite modalitați de notificare
utilizatorilor
• Activity Manage r – este responsabil cu controlul cicl ului de viață al aplicațiilor .
• Window Manager – se ocupă cu crearea unor noi ferestre și layout -urilor.
Nivelul Application este ultimul nivel și este reprezentat de aplicațiile propriu zise.
Elementele componete ale unei aplicații Android
1. Intents
Inten țiile(Intents) reprezintă mediul de comunicare prin care componetele aplicației solicită o
acțiune de la altă compontă a aplicației , în timpul rulării. Există 3 modalități prin care este
facilitată această comunicare:
• Pornirea unei activități
O activitate (Activity) este un singur ecran al aplicației. Pentru a începe o nouă instanță a
activității se folosește funcția startActivity() care are ca argument o intenție(intent).
Această functie are ca rezultat pornirea noii activități ce conține toat e datele nec esare.
• Pornirea unui serviciu
Un serviciu este o componentă care efectuează operații în fundal fără sa fie nevoie de o
interfață grafică. Odată cu Android 5.0 serviciile pot fi pornite cu JobScheduler.
Dacă serviciul este proiecta t cu o inter față client -server , aplicația se poate conecta la un
serviciu al unei alte componente pasând un intent metodei bindService()
• Transmiterea de tip broadcast
Broadcastul reprezintă mesajul pe care orice aplicație îl primește. Sistem ul transmite
mesaje de bro adcast pentr u diferite eventimente ale sistemului, de exemplu atunci cand un
sistem porneste sau cand un dispozitiv începe să se încarce.
Modalitatea de transmitere a unui mesaj de broadcast catre alte aplicații este prin pasarea
unei intenții(Intent) se face prin urm ătoarele două metode: sendBroadcast() și
sendOrderedBroadcast().
25
Există două tipuri de intenții(intents):
Figura 1.3 – Tipuri de Intent [6]
• Intent Explicit
Acestea au rolul de a specifica ce componentă a aplicaț iei trebuie pornită. Astfel este
folosit un intent explicit pe ntru porni o componenta(o activitate sau un serviciu) din cadrul
aceleași aplicații.
• Intent Implicit
Nu definește o componentă specifică, ci declară o acțiune generală ce urmează să fie
realizat ă de compone nte dintr -o altă aplicați e. [7]
Atunci când un intent implicit este folosit sistemul caută o componentă specifică, acest lucru se fac prin
compararea conținulului cu filtrele de intenție(intent filters) ale altor aplicații de pe dispozitiv.
26
Figura 1.4 – Utilizarea intentul ui implicit [ 7]
In figura 1.4 este ilustrată modalitatea prin care un intent implicit este pasat sistemului pentru a
începe o noua activitate. Activitatea A creaza un nou intent ce conține o descriere a acțiunii de realiz at și
îl pasează metodei startAct ivity(). Sistemul caută ăn toate aplicațiile un intent filter ce se potrivește cu
intentul primit. Câand o potrivire este găsită sistemul pornește activitatea B prin invocarea metodei
onCreate().
Un intent filter est e o expresie care specifică tipul de i ntent pe care o componentă poate s ă-l
primească, acestea de regulă se află în fișierul manifest al aplicației. Atunci când nu este declarat niciun
intent filtru, activitățile sunt pornite explicit. Pentru a asigura sec uritate aplicației este necesar sa se
folosească un intent explicit pentru p ornirea serviciilor.Intentul implicit nu este sigur deoarece nu se știe
ce serviciu va răspunde și va prealua intentul. Începând cu Android 5.0, sistemul arunc ă o excepție atunci
când metoda bindService() este apelată. [7]
2. Activități (Activities)
O activitate este o fereastră (ecran) a aplicației c u care utilizatorul interacționează în mod direct
cu scopul de a realiză o acțiune. De cele mai multe ori ele sunt reprezentate ca o fe reastră ce ocupă tot
ecranul, insă pot avea diverse forme și mărimi, de exem plu poate fi o fereastră de tip pop -up.
27
O aplicație poate avea una sau mai multe componente de tip Activity, însă una dintre aceste
activități trebuie să fie marcată ca activitate principală a aplicaț iei. Datele privi nd starile componentelor
sunt stocate într -o structură de date numită stivă de activități(back -stack) și este gestionată de sistem.
De-a lungul ciclului său de viață, o activitate poate lua mai multe stări prin inter mediul unor
metode. Aceste metode urme ză a fi descrise în continuare:
a) onCreate()
Această metodă este apelată atunci când este creată activitatea. În cadrul acestei metode sunt
inițializate componentele de baza ale activității.
b) onStart ()
Când metoda onCrea te() este apelată, activitatea intră î n starea de Start( Started ) și devine
vizibilă pentru utilizator
c) onResume()
Sistemul apelează această metodă chiar înainte ca activitatea să inceapă să interacționeze cu
utilizatorul și încep e să colecteze date de la utilizator.
d) onPause()
Sistemul apelea ză acestă metodă când utlizatorul a părăsit activtitatea curentă .[8]
28
Figura 1.5 – Ciclul de viață al unei Activități(Activity) [9]
3. Fragments
Un fragment este un comportament sau o porțiune dintr -o interfață grafic ă dintr -o activitate de
tip fragm ent (FragmentActivity). Un fragment trebuie întotdeauna să facă parte dintr -o activitate, iar
ciclul de viață al fragmentului este afectat în mod direct de ciclul de viață al activity -ului.
Fragmentele au fost introduse o dată cu Android 3.0, în principal pentru a suporta interfețe grafice
mult mai dinamice și flexibile pe ecrane de dimensiuni mai mari, precum tablele. Cu ajutorul
fragmentelor se pot proiecta astfel de aplicații fără a mai f ace modificări în ierarhia ferest rei.
În figura de mai jos este un exempl u de doua obiecte de tip fragment. [10]
29
Figura 1.6: Utilizarea fragmentelor [10]
Aplicația poate integra două fragmente în activititatea A când aceasta rulează pe o tabletă, însă, atunci
când rulează pe un dispo zitiv cu un ecran mai mic, cum ar fi un telefo n, cele doua fragmente nu pot fi
afișate simultan. Astfel, soluția este ca în activitatea A să fie afișat primul fragment, iar în actitvitatea B
sa fie afișat al do ilea fragment. [10]
Clasa Fragment seamană din punct de vede al codului destul de mult cu clasa Activity și folosește metode
asemantoare cu Activity precum, onCreate(), onStart(), onPause(), onStop() .[10]
La fel ca și Activity, Fragment poate exista în 3 stări:
• Resumed
Fragmentul este visibil când act ivitatea este pornită.
• Paused
Altă activ itate(acti vity) este în prim plan, dar activitatea în care se află acest fragment este încă
activă.
• Stopped
Fragmentul nu mai este vizibil. Ori activitatea gazdă a fost oprită, ori fragmentul a fost șters din
activit ate(activity), dar a fost adăugat în sti va de activi tăți. [11]
30
Figura 1.7: Ciclul de viață al unui fragment [12]
4. Servicii
Un serviciu este o componentă a aplicației care poate efectua ope rații de funcționalitate în fundal
și nu oferă o înterfață grafică care să interacționeze cu utilizatorul. Odată ce serviciul a porn it, acesta
poate continua să funcționeze în fundal și după ce utilizatorul a deschis altă aplicație.
Există 3 tipuri de servicii:
• Foreground (Prim -plan)
Acest tip de servici u execută operații care pot fi observate de utilizator. De exemplu, o aplicație
audio folosește un serviciu de tip foreground pentru a reda o melodie. Serviciile de tip
31
foreground afișează notoficări și continuă să ruleze în fundal chiar dacă utilizatorul nu
interacționează cu aplicația.
• Backgroun d(Fundal )
Acest tip de serviciu execută operații care nu sunt observate de utilizator.
• Bound
Un serviciu este legat(bound) atunci când o componentă a aplicației se leagă de el cu prin
apelarea metodei bindServic e(). Acesta oferă o interfață client – server care permite
componentelor aplicați ei să interacționeze cu serviciul, să trimită request -uri(cereri), să
primească răspunsuri. Un ser viciu de tip bound rulează doar atât timp cât o componentă a
aplicației este legată de el . [13]
1.1.2. Android Studio
Android Studio este un mediu de dezvoltare bazat pe InteliJ IDEA și este IDE – ul oficial al Android , iar
aplicația poate fi scrisă în două limbaje de programare, Java și Kotlin. În cele ce urmează voi prezentă
câtev a dintre funcționalitățile IDE -ului.
Figura 1.8 – Mediul de dezvoltare Android Studio
32
• Conține un Emulator . Aplicația poate fi rulată direct din Android Studio și este compatibil
cu toate API – urile lansate până la momentul actual .
Figura 1.9 – Crearea unui dispozitiv virtual
• Interactive preview. Cu ajutorul acestui mod programatorul poate interacționa cu interfața
grafică a aplicatie i.
Figura 1.10 – Interactive Previw
33
1.2. Senzori
Un se nzor măsoară o cantitate fizică cu scopul de a o trans forma într -un semnal ce poate fi citit
de un inst rument , în cazul nostru un telefon mobil. Aceștia po t fi atât senzori fizici, hardware, cât și
software . Cei hardware sunt componente fizice integrate în arhitectura dispozitivului mobil . Aceștia
colect ează date prin măsurarea unor proprietăți specifice de mediu , precum acelerearea, campul
geomagnetic, etc. Senzorii software nu sunt componente fizice, dar ei își pot lua datele de la unul sau
mai mulți senzori fizici . Aceștia mai sunt denumiți și senzori virtuali sau senzori sintetici.
Există mai multe tipur i de senzori :
• Senzori de locație – oferă locația di spoziti vului
• Senzori de poziție – aceștia la rândul lor sunt de mai multe feluri: senzor de orientare –
determină dacă dispozitivul este în modul por tret sau în modul panoramic(landscape) ;
senzorul de pr oximitate – determina prezența obiectelor din apropiere
• Senziori de mișcare – masoară mișcarea dispozitivilui în direcții multiple și aceștia sunt de
două feluri: acelerometru și giroscop
• Senzori de me diu – măsoară condi țiile ambientale ale dispozitivului cum ar fi temperatura
ambientală, presiunea atmosferică, etc. (Sensors on Android Phones – Keerthi Kumar )
Figura 1.11 – Tipuri de senzori [14]
34
1.2.1 Sensor Framework
Datele pe care senzorii le c olectează pot fi accesați cu ajutorul unui framewor k pe care Android îl pune
la dispoziție. Acesța face parte din pachetul android.hardware și are urmatoarele clase și interfețe :
• Sensor Manager
Acestă clasă cuprinde o multitudine de metode cu ajutorul căr ora se pot acce sa și lista sen zorii,
înregistra și neînregistra senzorii de event listeners și pot extrage informații legate de orientarea
dispozitivului
• Sensor
Această clasă este folosită pentru a crea o instanță a unui anumit s enzor și oferă câteva meto de
care ajută la determinarea capacit ăților senzori lor.
• Senso rEvent
Aceasă clasă este folosită de către sistem pentru a creea un obiect de tip sensor event care oferă
informație despre un eveniment. Un obiect de tip sensor event oferă urmatoarele inform ații: date
neprelucra te preluate de la senzor , tipu l senzorului care a generat evenimentul , acuratețea datelor
și timpsta pe-ul evenimentului
• SensorEventList ener
Această interfață este folosită pentru a crea două metode ce primesc notificari( sensor events ) când
valoarea sau acuratețea unui senzor se schim bă.[15]
Senzori de mișcare
Sensor Framework folosește sistemul de coordonate cu 3 axe pentru a aduna date. Cei mai mullți senzori
sistemul de coordonate este definit relativla ecranul dispozitivului atu nci când acesta este așsezat
orizontal, după cum se poate vedea în Figura 1.12
35
Figura 1.12 – Sistemul de coordonate folosit de senzor [15]
Când un dispozitiv este ținut orizontal(poziția prestabilită), axa X este orizontală și arată spre dreapta,
axa Y este veriticală și orientată în sus , iar axa Z est e orientată spre exteriorul ecranului(in spatele
ecranului valorile de pe aceas tă axa vor fi negative).
Acest sistem de coordonate este folosit de către următorii senzori:
• Senzorul de accelerare
• Senzorul d e gravitație
• Senzorul de accerelare liniară
• Girosco pul
• Senzorul de câmp geomagnetic
Un lucru important este acela că orientarea a xelor nu se modifică, chiar dacă orientarea ecranului se
schimb ă ceea ce înseamnă ca sistemul de coordonate nu se schimbă pe m ăsură ce dispozitivul se
mișcă. [15]
Accelerometrul
Sensorul de accelerare m ăsoară accelerarea aplicată unui dispozitiv, inclusiv forța de gravitație,
după următoarea formulă:
36
AD = – g – 1
𝑚𝑎𝑠ă – ∑ F S
Unde :
AD – reprezintă accelerarea aplicată dis pozitivului
FS – reprezintă forțele aplicate senzorul ui
g = 9.81 m/s2 – reprezintă forța gravitațională
Forța gravitațională trebuie scăzută doarece atunci când telefonul se află în cădere liberă iar g este
9.81 m/s2, accelerometrul măsoară o magnitudin e de 0 m/s2, insă atunci când se află în stare stațio nară
accelerometrul măsoară o magnitud ine de 9.81 m/s2. Astfel, pentru a scăpa de forța de gravitație trebuie
folosit un filtru trece sus, iar pentru a o izola este nevoie să folosim un fittru trece jos.
Așa cum am mentționat mai sus accelerometrul foloses te sistemul de coordonate. În practică, a cest lucru
înseamnă că unui dispozitiv aflat așezat pe masă are urmatoarele proprietăți:
• Dacă dispozitivul este mutat catre dreapta, accelerarea x este pozitivă
• Daca dispozitivul este mutat în sus, valoarea lui y e ste pozitivă
• Dacă dispozitivul este ridicat cu o accelerare A m/s2 atunci accelerația de pe axa z va fi egală cu
A+9.81.
• Dacă dispozitivul este în stare staționară atunci va avea o accelerație de 9.81 m/ s2.
Avantajul în a folosi un accelerometru este acela că folosește de 10 ori mai puțină putere decât ceilalți
senzori de mișcare, însă pentru a elimina forțele gravitaționale și zgmotul trebuiesc implementate filtre
trece sus și trece jos. [16]
Implementare a acestuia în Android Studio:
private SensorManager s ensorManager;
private Sensor sensor;
…
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
sensor = sensorManager.getDefaultSensor( Sensor.TYPE_ACCELEROMETER);
Step Detector
Senzorul de detectare a pașilor declașează un evenime nt de fiecaredată când un utiizator face un pas.
Are o lanteță de aproximativ 2 secunde. [16]
Implementarea acestuia în Android Studio:
private SensorManag er sensorManager;
private Sensor sensor;
…
sensorManager = (SensorManager) getSystemService(Context. SENSOR_SERVICE);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_STEP_DETECTOR);
37
Step Counter
Acest senzor calculează numărul de pași de la ultimul restart la telefonului, implicit al senzorului. Step
counter – ul are o latență mult mai mare decat step detecter, de aproximativ 10 secunde, însă are o
acuretețe mai bună decât acesta. [16]
Implementarea acestuia în Android Studio:
private SensorManager sensorManager ;
private Sensor sensor;
…
sensorMa nager = (SensorManager ) getSystemService (Context.SENSOR_SERVICE );
sensor = sensorManager .getDefaultSensor (Sensor.TYPE_STEP_COUNTER );
38
39
Capitolul 2 – Imple mentarea și utilizarea aplicației
În acest capi tol urmează să prezint modul în care funcționeză aplicația dezvoltată, structura acesteia,
elementele folosite în dezvoltarea ei. De asemenea voi compara rezultatele date de aceasta cu aplicații
asemanătoare deja existente pe piață.
2.1 Structura Aplicație i
Aplicația este formată din mai mul te ferestre, numite activități. Meniul principal al aplicației este și
activitatea principală, aflată sub denumirea de MainActivity, si este fereas tra cu care aplicația se
deschide. Celelalte ferestre pot fi accesate c u ajutorul unor butoane ce apelează o metodă cu scopul de a
deschide alte ferestre, modul în care aceste metode și butoane funcționeză voi explica în cele ce
urmează.
Pentru ca aplicați a să poată rula diversele clase folosite în implementarea acesteia este necesar sa
conțină un fișier Android Manifest.xml în rădăcina priectului. Acest fișier conține următoarele lucruri:
• Numele pachetului Java, acesta ține locul unui identificator unic al aplicației:
<manifest xmlns:android=”http://schemas.android.com/apk/res /android ”
package=”com.example.li centav1 ”>
• Perimsiunile pe care aplicația ar trebui să le aibă pentru a putea funcționa corect:
<uses-permission android:name=”android.permission.INTERNET ” />
<uses-permission android:name=”android.permission.ACCESS_NETW ORK_STATE ” />
<uses-permission android:name=”android.permission.WRITE_EXTERNAL_STORAGE ” />
<uses-permission android:name=”android.permission.ACCESS_WIFI_STATE ” />
<uses-permission android:name=”android.permission.ACTIVITY_RECOGNITION ” />
• Declararea claselo r/activitaților folosite în realizare a aplicției:
<activity android:name=”.MainActivity ”>
<intent-filter>
<action android:name=”android.intent.action.MAIN ” />
<category android:name=”android.intent.category.LAUNCHER ” />
</intent -filter>
</activity>
Pentru activitatea principală este necesar să specificăm faptul că acesta este principală și că din ea
rezultă și alte activități.
• Caracteristicile aplicației precum nume, forma și aspectul iconitei, etc.
În figur a de mai jos este prezentat a fereastra principală și modul d e navigare. În continuare voi detalia
modul în care activitățile și clasele funcționează și rolul acestora.
40
Figura 2.1 – Pagina principală a aplicației și fișierul său xml
2.2 Funcționalitatea aplicației
MainActi vity
Activitatea MainActivity este activ itatea principală a aplicației și este lansată prima atunci cand
utilizatorul deschide aplicația. Din cadrul acesteia utilizatorul poate selecta prin intermendiul a patru
butoane, urmatoarele patru funcționalități: ac tivitatea de numă rare a pașilor – Step Counter , activitatea
de introducere a progresului – Personal Notes , activitatea de calcul al indicelui de masă corporală – BMI
41
Calculator și activitatea de sugera re a unor activit ăți menite să aiba grijă de sănatatea utilizatorului –
LifeStyle .
Pentru a p utea deschide aceste patru activități ne folosim de următoarele butoaneȘ butone.
Figura 2. 2 – Crear ea butoanelor
În figura 2. 2 este făcută legătura dintre clasa MainActivity și activitatea main_activity. Tot aici se cr eează
butoanele ce urmează a fi folo site pentru a deschide ferestrele.
Cu ajutorul interfeței View.OnClickListener se fa ce schimbarea î ntre ferestrele aplicației. Aceasta
dispune de metode c e facilitea ză acest lucru. Astfel cu ajutorul metodei setOnClickListener() verificăm
dacă variabila ca re o a pelează reprezint ă un bu ton, dacă a cest lucru este indeplinit, atunci folosind metoda
onClick() putem face schimbarea schimbarea între ferestre.
42
Figura 2. 3 – Deschiderea activităților cu ajutorul Intent -urilor
În figura 2. 3 este prezentat modul în c are sunt deschise noile activități. Cu ajutorul intent -ului și al
metodei startActivity(). Astfel, intent -ul creat conține cla sa din care este apelat intent -ul respectiv, adică
MainActivity, și clasa căruia sistemul transmite intentul, de exemplu StepCount erActivity. Astfel
sistemul primește apelul metodei si pornește o instanță a activity -ului specificat de intent. Cu ajutorul
metodei startActivity(intent) este lansată o nouă activitate.
PersonalNo tes
Această clasă se folosește de o bază de date SQLite pentru a putea salva datele pe care utilizatorul le
introduce.
43
Figura 2. 4 – Încărcarea bazei de date
În figura 2. 4 este prezentat modul în care este inserat un nou task cu ajutorul metodei insertNewTask() .
Variabila dbHelper este de tip DbHelper care e ste o clasă ajutătoare, acesta extinde SQLiteOpenHelper
și care are rolul de a crea baza de date și de a o actualiza.
Se crează o fereastră de tip AlertDialog, unde utilizatorul va putea să ins ereze informa țiile pe care le
dorește. De asemenea, utilizatoru l are posibilitatea de a șterge informațiile pe care le -a introdus în baza
de date . Acest lucru îl face metoda deleteTask().
Figura 2. 5 – Ștergerea informațiilor din baza de date
Însă pentru ca utilizatorul să intoducă aceste informații și aceastea să s e salveze ele trebuie introduse
într-o bază de date. Cum am spus și în capit olul anterior , Android dispune de o librărie integrata care
oferă dezvoltatorului posibiltatea de a folosit o b aza de date fără să mai fie nevoie să se contecteze la
un server sepa rat.
44
Astfel, pentru a se putea stoca informațiile am creat o clasă cu denumi rea DbHelper. Cum am spus și mai
sus aceasta exinde SQLiteOpenHelper. În cadrul acestei sunt definite toate acț iunile asupra bazei de date,
acțiuni ce sunt preluate apoi de clasa PersonalNotes .
DbHelper
În cadrul acestei clase definim baza de date, îi at ribuim un nume și o versiune, definim tabele, coloane,
dar se și fac acțiuni asupra acesteia.
Figura 2. 6 – Definirea bazei d e date
Baza de date conține o singură tabelă cu denum irea de Task ce conține coloana NumeTask . Pentru a fi
creată tabela s -a folo sit metoda OnCreate iar in interiorul acesteia au fost executate comenzi SQL –
db.execSQL() . Inserarea în tabelă se face cu ajutorul metodei insertNewTask(). În interiorul acesteia ne
folosim de comanda db.insertWithoutConflict() pentru a introduce în baza de date informația. In variabila
values punem task -ul pe care utilizatorul il introduce, iar această variabila este folosită mai departe pentru
a fi introdusă cu comanda de mai su s în tabela definită la început.
Figura 2. 7 – Inserarea unui task în baza d e date
45
Figura 2. 8 – Lucrul cu baza de date
În figura 2. 8 este prezentat modul în care se stochează o interogare într -o variabilă de tip Cursor . Datele
de tip cursor permit aces t lucru deoarece clasa Cursor folosește un API care permite aplicației să ci tească
coloanele care sunt returnate de interogare. Astfel, un cursor reține datele returanate de interogare dar și
poziția in tabelă care arată lo cul unde se află acestea . Este fo losită bucla while pentru a itera peste
randurile tabelei ce sunt returnate de variabila cursor cu ajutorul metodei din clasa Cursor,
moveToNext. .În momentul în care variabila cursor indică către randul dorit, atunci coloan ele aferente
acelui rând pot fi c itite. Pentru a citi datele m -am folosit de doua metode de care clasa Cursor dispune:
getColumnIndex () și getString() . Metoda getColumnIndex () primește un parametru de tip String care
indică din ce coloană să facă citirea., astfel valoarea de tip String tr ebuie să corespundă cu una dintre
valorilece au fost returnate din tabelă. Când activitatea ce folosește această bază de date nu mai are
nevoie de informații din aceasta este necesar să inchidem conexiunea la baza de date pentru a nu avea
probleme cu memo ria, acest lucru se face cu ajutorul metodelor cursor.close() și db.close()
StepCounterActivity
Metoda propus ă 1 – Accelerometrul
Această clasă are rolul de a calcula numărul de pași pe care utilizatorul îi realizează în decursul unei zile.
Pentru a re aliza acest lucru am folosit unul dintre senzorii pe care orice dispozitiv in teligent îl posedă, și
anume accelerometrul.
Figura 2. 9 – Definirea tipului de senzor folo sit – accelerometru
46
Figura 2. 10 – Codul ce calcuează numărul de pași
In variabila valoarex este stocată forta de accelerare de -a lungul axei x, în variabila valoarey este stocată
forța de accelerare de-a lungul axei y, iar în variabila valoarez este stocată forța de accelerare de -a lungul
axei z. La fiecare dintre aceste forțe de accelera re se adaugă și forța gravitațională. Se calculează
magnitudinea celor trei forțe după următoarea formulă:
magnitudine = √𝑥2+𝑦2+𝑧2 [17]
Valoarea magnitudinii reprezintă vibrația pe cele trei axe de coordonate. Însă, cum am spus și mai sus,
aceste valori conțin nu numai forța de accelerație, ci și forța gravitațională , astfel, pentru a o exclude pe
cea din urmă calculăm valoarea medie a mag nitudinii după care fiecare magnitudine este calculată ca
diferența dintre magnitudinea curentă și media m agnitudinilor, după urmatoarea formulă:
magnitudineFinală = magnitu dineInitiala – deltaM agnitudine [17]
O altă modalitate de a elimina forța gravitaț ională este prin aplicarea unui filtru trece jos.
Figura 2. 11 – Filtru trece jos pentru eliminarea for ței gravitaționale
47
Pentru a putea obține valorile forței de accelerare prin eliminarea forței de graviție folosind un filtru trece
jos, avem nevoie fa ctorul de netezire, alpha, care în cazul nostru are valoarea 0.8, după care aplicăm
formula pentru un filt ru trece jos discret în timp:
yi = alpha*x i + (1-alpha)*y i-1 [18]
Unde:
• xi este forța gravitațională ce dorim să o eliminam
• yi-1 este accelerarea
După ce obținem valoarea finală, fără forța gravitațională este necesar să găsim un prag pentru care
aplicația să înceapă să numere pașii. Mișcarea de către utilizator a telefonului produce v ariații a forțelor
accelerometrului, astfel atunci câ nd acesta ridică piciorul, valorile de pe axa Z se modifică. Prin
modificarea acestor valori se formează anumite vârfuri ș i cu ajutorul acestora putem determina dacă
utilizatorul a făcut un pas sau nu. Pentru a putea determina dacă o valoare este punct de maxim, sau de
vârf, acesta trebuie să fie mai mare decât o anumită valoare de prag, de threshold. Pentru a putea
determina acestă valoare de prag sub care pașii nu ar trebui luați în considerare, s -au fâ cut câteva teste
experimentale. În urma acestor teste s-a constat că valoarea sub care valoarea de vârf/threshold nu ar
trebui să scadă este 4. Astfel, de fiecare dată când se găsește o magnitudine care se află sub această
valoare , aplicația nu întergistre ază pasul, însă dacă acest prag este depășit variabil a stepCounter este
incrementată cu 1.
Metoda propusă 2 – StepCounter
Pentru a putea face o comparație între cei doi senz ori, dar și pentru a determina care este cea mai bună
metodă de a numara pașii pe care un utilizator î i face, această lucrare îsi propune să împlementeze și un
program care se folosește de senzorul de mișcare StepCounter . Acest senzor, în comparație cu
accelerometrul, returnează direct numărul de pași, fără să mai fie nevoie de aplicare a unei formule. Un
alt ava ntaj este faptul că aplicația ce utilizează acest senzor este acela că nu consumă baterie și rulează
în fundal , înreginstrând pași fără ca aplicația să fie pornită .
48
Figura 2.1 2 – Definirea tipului de senzor folosit – stepcount er
Un dezavantaj al acestei metode este faptul că are o întarziere a înregistrarii pașilor de pâna la 10 secunde ,
dar și faptul că acesta returnează numarul total de pași la ultimul restart al telefonului. Colectarea datelor
se face cu ajutorul event. value[0], în metoda onSensorChanged() .
Metoda propusă 3 – StepDetector
Acest senzor este, comparatv cu StepCounter are o latență mult mai mică, iar din punct de vedere al
detect ării pașilor nu are o acuratețe prea bună, înregistrandu -se mai multi pași decât a u fost facuți. De
asemenea, în timp ce StepCounter preia numarul total de pași d e la ultimul restart, StepDetector
procesează numărul de pași pe masură ce aceștia sunt înregi strați.
Figura 2.1 3 – Definirea tipului de senzor folosit – StepDetector
Figura 2.1 4 – Colectarea numărului de pași
CalculatorBMI
Această clasă are rolul de a calcul indicele de masă corporal (IMC). Acesta se calculează după următoarea
formulă :
49
IMC = greutate
inălțime ∗inălțime [19]
Utilizatorul își introduce greutatea și înalțimea( în cm) și în funcție de rezultat ii este atribuită o valoare
după cum se poat e observa în figura 2.1 5
Figura 2.1 5 -Calculul indicelui de masă corporal
În funcție de rezu ltatul variabilei BMIrezultat utilizatorului îi este atribuită o dietă.
Recuperarea u tilizatorului
Acestuia i se vor atribui câteva diete alimentare și câteva exerciții fizice menite să -l ajute în recuperarea
sa. Acest lucru se va face cu ajut orul cla selor implementate ce urmeaz ă să fie prezentate.
Counter
Deoarece utilizatorului îi sunt propuse câteva exerciții fizice este necesar ca acesta să aibă la dispoziție
un crono metru pentru a ști cât timp să lucreze. Astfel, clasa Counter a fos t creeată pentru a cest lucru.
50
Figura 2.1 6 – Introducerea unui input
Figura 2.1 6 prezintă partea de cod care se ocupă cu introducerea unui input. Astfel utilizatorul iși va
putea introduce timpul în care vrea să realizeze exercițiile fizice .
Deoarece pe p arcursul programul ui vom lucra cu metoda System.currentTimeMills () care returnează
timpul curent în milisecunde, este necesar ca inputul nostru care este dat în minute să fie converit în
secunde. Acestul l ucru se face prin linia de comandă: long millisInput = Long.parseLong (input) * 60000 ;
Figura 2.1 7 – Buton de start/pauză
În figura 2.13 este creată o metodă onCli ck ()care pornește sau pune pe pauză timerul atunci când butonul
este apăsat. Metodele pauseTimer() și startTimer () vor fi detaliate în cele ce urmează.
În figur a 2.1 7 este prezentat modul de funcționare al metodei startTimer() . Cu ajutorul metodei
System.currentTimeMills () preluăm timpul curent al dispozitivului la care adaugăm t impul râmas.
Cu ajutorul metodei CountDownTimer() actualizăm timpul care mai rămane pâna la 0, astfel, variabila
ramasMili este decrementată cu 1000 de milisecunde, adică cu o secunda. În interiorul metodei onTick
calculâm numarul de milisecunde până cand metoda CountDownTimer sa se oprească, de asemenea
trebuie actualizată și metoda upda teCountDownText(). În momenul în care timpul pe care utilizatorul l -a
stabilit se scurge, variabila mTimerRunning primeste valoarea booleană false iar interfata
updateWatch Interface se actualizarează. Concluzionând, ceea ce face metoda startTimer() este să
pornească timpul prin apasarea butonului de start.
51
Figura 2.1 8 – Metoda StartTimer()
În înterioul clasei update CountDownText () definim formatarea counterului, astfel în funcție de ceea ce
introduce utilizatorul de la tastatură, programul decide dacă acest input este de tip ore sau minute după
care începe numărătoarea inversă. Tinând cont ca toate variabilele din această clasă lucr ează cu metoda
System.currentTimeMills (), pentru a putea determina care sunt orele, care sunt minutele si care sunt
secunde le trebuie să imparțim orele la 1000 pentru a putea deternima numarul de secunde, după care
împarțim la 3600 pentru a ajunge la numar ul de ore, iar pentru minute se proced ează aproximativ ca la
ore, ex ceptând faptul că restul împărții la 3600 se imparte la 60.
Figura 2.1 9 – Metoda updateCountDownText()
52
În figura 2.1 9 este prezentat modul de afișare al butoanelor în funcție de starea în care se află counterul
la momentul re specitv . Dacă counterul merge, butoanele de reset, de start și posibilitatea de a int roduce
o altă valoare sunt invisibile sau indisponibile pentru utilizator. Singurul buton vizibil o să fie cel de
Pauză. Dacă counter ul nu funcționează , butoanul de start si opțiunea de a introduce o nouă valoare vor fi
din nou vizibile și disponiblile pen tru utilizator. Dacă timpul afiș at pe ecran (ramas Millis ) este mai mic
decât timpul introdu s inițial de c ătre u tilizator (startMill is), atunci și butonul de rese t va fi funcțion al.
Figura 2. 20 – Metoda updateWatchInterface
Vide oExer cises
Aceast ă clasă pr eia anumi te videoclip uri de pe Youtube și le inse rează în aplicație . Pentru a putea face
acest lucru a fost declarat în preala bil în fișierul Manifest.xml permisiunea de acces la internet și
permisiu nea de acces la wi fi: uses-permission android:name="andro id.permission.INTERNET" și uses-
permission android:name="android.permission.ACCESS_WIFI_STATE" . A dăugarea acestor
videoclipuri se face cu a jutorul unui vector de tip YoutubeVideo , clasă ce va fi prezentă în Anexa 1.
53
Capitolul 3 – Rezultate experimentale ș i discuții
Pentru a putea determina care dintre cei trei senzori folosiți în cadrul aplicației este mai eficient și are o
marjă de eroare mai mică, voi compara rezultatele obținute cu fiecare dintre acestea pe anumite
distanțe. A ceste rezultate vor fi com parate apoi cu două apl icații populare , Pacer și GoogleFit.
În următorul tabel se pot observa rezultatele obținute:
Experimentul 1:
Distanță (m)
Aplicație ~100 ~500 ~1000
Licență –
Accelerometru 167 541 1259
Licență – StepCounter 164 520 1212
Google Fit 164 520 1212
Pacer 164 520 1212
Numărătoare 165 533 1240
Tabel 3.1 – Rezultate experiment 1
Deoarece pentru măsurarea distanței m -am folosit de aplicația Google Maps, valorile de 100, 500 și
respectiv 1000 de metri sunt aproximative, nu exacte. Astfe l, pentru a mă asigura că experimentul facut
are valori relevante, l -am refăcut încă o data.
Experimentul 2:
Distanță(m)
Aplicație ~100 ~500 ~1000
Licență –
Accelerometru 133 600 1315
Licență – StepCounter 128 586 1298
Google Fit 128 586 1298
54
Pacer 128 586 1298
Numărătoare 132 590 1309
Tabel 3.2 – Rezultate experiment 2
Rezultatele atât pentru cele două aplicații de pe GooglePlay, Pacer și GoogleFit, cât și pentru aplicația
dezvoltată în cadrul acestei lucrări folosind metoda propusă 2 sunt identic e, deoarece în dezolvol tarea
acestora s -a folosit acela și tip de senzor și anume senzorul StepCounter. În dezvoltarea aplicației Licentă
– Accelerometru s -a folosit metoda propusă 1 , adică accelerometru.
Compararea acestor rezultate se va face cu o valoare de referință, numită n umărătoare. Această valoare
reprezintă numărul reali de pași realizat de un utilizator, în cazul de față, de către mine , pe diferite
distanțe.
Astfel, nicinul dintre cele 5 aplicații nu au o precizie de 100%, nici pe distanțe scurte, nici pe distanțe
mai l ungi. În cele ce urmează o să calculez precizia pașilor pentru fiecare aplicație,pe fiecare dintre cele
3 distanțe.
Distanță(m)
Aplicație 100 500 1000
Licență –
Accelerometru 99,88% 98.70% 98.49%
Licență – StepCounter 99.93% 97,56 % 97.74%
Google Fit 99.93% 97,56% 97.74%
Pacer 99,93% 97,56% 97.74%
Numărătoare 165 533 1240
Tabel 3.3 – Acuratețea aplicațiilor pentru primul experiment
Din câte putem observa din tabel, p e măsură ce distanța cre ște, scade și acuratețea măsuratorilor . Pentru
aplicația Lice nță-Accelerometru o explicație pentru acest lucru ar fi faptul că se înregistează mai multe
valori fals -pozitive , adică găse sc mai multe valori de “vârf” decât sunt de fapt. Totuși, diferențele dintre
valori sunt relativ mici, ceea ce înseamnă ca oricare d intre acești senzori pot fi folosiți intr -o aplicație de
acest ge n.
55
Capitolul 4 – Concluzii și posibilități de dezvoltare
4.1 Concluzii
Sistemul de operare Android este cel mai popular sistem pentru dispozitivele mobile, iar de zvoltarea
acestei aplicații mi -a oferit oferit ocazia studierii acestei tehnologii. Am reușit, astfel să înteleg cum
funcționează acest sistem și cum să folosesc res uresele puse la dispoziție de către acesta.
Prin urmare, în ace astă lucrare a fost prezenta t procesul de dezvoltare a unei aplicații android menită să
vină în ajutorul omului modern, mult prea puțin preocupat de sănătatea sa. În forma actuală ei actuală,
acestă aplicație poate fi folosită de către utilizato ri. Aceștia pot, cu ajutorul aplicației prezentate să își
calculeze indicele de masă corporal, iar pe baza acestui rezultat să-i fie oferit un program de recuperare
potrivit greutății sale, de asemenea ut ilizatorul își poate loga progresul făcut, acest ea salvându -se într -o
bază de date și nu în ultimul rând au posibilitatea să își masăare numarul de pași pe care acesta îi face pe
parcursul unei zile cu ajutorul unui s tepcounter. În implementarea acestui st epcounter m -am folosit de
trei tipuri de senzori de care un orice dispozitiv mobil intelige nt dispune și anume: stepcounter -ul,
stepdetector și accelerometru. În urma lucrului cu aceștia am reușit să înțeleg cu funcționează aceștia și
cum se transmit datel e, pe care senzorii îi generază, de la o componentă hardware(senzorul) către un
program sof tware.
În concluzie, consider că am reușit să îndeplinesc obiectul care a fost prezentat la începutul acestei lucrări,
iar aplicația prezentată conține funcționalită țile enumerate.
4.2 Posibilități de dezvoltare
Versiunea aplicației “Asistent Personal de F itness ” prezentată în această lucrare nu este cea finală,
ci doar o primă versiune. Aceasta poate fi imbunatățită , adăugând noi funcționalități , precum:
• Salvarea n umărului de pași realizați în fiecare zi într -o bază de date si afișarea progresului făcut
de utilizator într -un anumit interval d e timp
• Introducerea unei noi opți uni prin care utilizatorul va putea vizualiza distanța pe care a parcus -o,
dar și timpul în care a făcut acest lucru.
• Calcularea numarului de calorii pe care utilizatorul le arde în urma activitații fizice.
Acestea sunt doar câteva idei de dezvoltare ale aplicației Asistent Personal de Fitness, însă având în
vedere modul în care evoluează tehnologia, mai pot apărea și altele.
56
57
Bibliografie
[1] https://developer.android.com/guide/topics/manifest/uses -sdk-element , accesat la data 16.06.2020
[2] http://rajandroindian.blog spot.com/2015/09/android -architecture.html , accesat la data 16.06.2020
[3] Shaheen, J.A., Asghar, M.A., Hussain, A., “ Andoid OS with its Arhitectur e and Android
Application with Dalvik Virtual Machine Review”, pp 20-22
[4] https://www.sqlite.org/arch.html , accesat la data 17.06.2020
[5] Aditya, S.K, Karn, V.K, Android SQLite Essentials, pp 160 -164
[6] https:// tutorial.eyehunts.com/android/types -implicit -intent -explicit -intent -android , accesat la data
17.06.2020
[7] https://developer.android. com/guide/components/intents -filters , accesat la data 17.06.2020
[8] https://developer.android.com/guide/components/activities/intro -activities ,accesat la data
17.06.2020
[9] https://data -flair.training/blogs/android -activity/ accesat la data 17.06.2020
[10] https://developer.android.com/guide/components/fragments/, accesat la data 17.06.2020
[11] https://developer.android.com/guide/components/fragments#Lifecycle , accesat la data 17.06.2020
[12] https://developer.android.com/guide/co mponents/fragments , accesat la data 17 .06.2020
[13] . (https://developer.android.com/guide/components/services , accesat la data 18.06.2020
[14] https://www.researchgate.net/figure/Built -in-sensors -in-a-typical -present -day-
smartphone_fig2_332973899 , accesat la data 18.06.2020
[15] https://developer.android.com/guide/topics/sensors/sensors_overview , accesat la data 18.06.2020
[16] https://developer.android .com/guide/topics/sensors/sensors_overview , accesat la data 18.06.2020
[17] Abadkeh, A., Step Detection Algorithm For Accurate Distance Estimation Usi ng Dynamic Step
Length , pp 4 -6
[18] https://en.wikipedia.org/wiki/Low -pass_filter , accesat la da ta 20.06.2020
[19] https://www.medlife.ro/artic ole-medicale/vitmatina -cum-se-calculeaza -indicele -masei –
corporale.html , accesat la da ta 20.06.2020
58
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Asistent personal de fitness [604268] (ID: 604268)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
