PROGRAM DESTINAT DISPOZITIVELOR MOBILE PENTRU [617990]

Universitatea “Politehnica” din București
Facultatea de Electronică, Telecomunicații și Tehnologia Informației

PROGRAM DESTINAT DISPOZITIVELOR MOBILE PENTRU
MANAGEMENTUL DIABETULUI

Proiect de diplomă
prezentat ca cerință parțială pentru obținerea ti tlului de
Inginer în domeniul Electronică și Telecomunicații
programul de studii de licență Electronică aplicată

Conducător științific Absolvent: [anonimizat] 2017

Cuprins

Lista figurilor ………………………….. ………………………….. ………………………….. ………………………….. ………………. 11
Lista acronimelor ………………………….. ………………………….. ………………………….. ………………………….. …………. 13
Introducere ………………………….. ………………………….. ………………………….. ………………………….. ……………………. 1
1. Diabet zaharat ………………………….. ………………………….. ………………………….. ………………………….. ………… 3
1.1 Tipuri de diabet ………………………….. ………………………….. ………………………….. ………………………….. .. 3
1.2 Diabet zaharat de tip 2 ………………………….. ………………………….. ………………………….. ………………….. 3
1.2.1 Simptome ………………………….. ………………………….. ………………………….. ………………………….. … 3
1.2.2 Cauze ………………………….. ………………………….. ………………………….. ………………………….. ……… 4
1.2.3 Factori de risc ………………………….. ………………………….. ………………………….. ………………………. 5
1.2.4 Prevenirea ………………………….. ………………………….. ………………………….. ………………………….. .. 6
1.2.5 Testarea ………………………….. ………………………….. ………………………….. ………………………….. …… 7
1.2.6 Management ………………………….. ………………………….. ………………………….. ………………………… 8
1.2.7 Monitorizarea glucozei ………………………….. ………………………….. ………………………….. ………….. 9
1.2.8 Insulina, medicamente si alte tratamente ………………………….. ………………………….. …………….. 10
1.2.9 Regim alimentar, alimentație si activitate fizică ………………………….. ………………………….. …… 11
2. Tehnologii utilizate ………………………….. ………………………….. ………………………….. ………………………….. .. 15
2.1 Android ………………………….. ………………………….. ………………………….. ………………………….. ………… 15
2.2 Android Studio ………………………….. ………………………….. ………………………….. ………………………….. 16
2.2.1 Structura proiectului ………………………….. ………………………….. ………………………….. ……………. 16
2.2.2 Interfața cu utilizatorul ………………………….. ………………………….. ………………………….. ………… 18
2.3 OCR ………………………….. ………………………….. ………………………….. ………………………….. …………….. 19
2.3.1 Istorie ………………………….. ………………………….. ………………………….. ………………………….. ……. 19
2.3.2 Aplicații ………………………….. ………………………….. ………………………….. ………………………….. … 20
2.3.3 Tipuri ………………………….. ………………………….. ………………………….. ………………………….. ……. 20
2.4 Tesseract ………………………….. ………………………….. ………………………….. ………………………….. ………. 20
2.4.1 Caracteristici ………………………….. ………………………….. ………………………….. ………………………. 21
2.5 SQLite ………………………….. ………………………….. ………………………….. ………………………….. ………….. 21
3. Implementare ………………………….. ………………………….. ………………………….. ………………………….. ……….. 25
3.1 Interfața de utilizare ………………………….. ………………………….. ………………………….. ……………………. 25
3.1.1 Organigramă ………………………….. ………………………….. ………………………….. ………………………. 25
3.1.2 Selecția elementelor ………………………….. ………………………….. ………………………….. …………….. 25
3.1.3 Selecția butoan elor ………………………….. ………………………….. ………………………….. ……………… 27
3.1.4 Selecția meniului ………………………….. ………………………….. ………………………….. ………………… 28
3.2 Implementare OCR ………………………….. ………………………….. ………………………….. …………………….. 29

3.2.1 Descriere ………………………….. ………………………….. ………………………….. ………………………….. .. 29
3.2.2 Schemă bloc ………………………….. ………………………….. ………………………….. ……………………….. 29
3.3 Implementare alarmă ………………………….. ………………………….. ………………………….. ………………….. 30
3.4 Implementare baza de date SQLite ………………………….. ………………………….. ………………………….. .. 31
4. Utilizarea aplicației ………………………….. ………………………….. ………………………….. ………………………….. .. 33
4.1 Descrierea aplicației ………………………….. ………………………….. ………………………….. …………………… 33
4.2 Rezultate ………………………….. ………………………….. ………………………….. ………………………….. ………. 33
Concluzii ………………………….. ………………………….. ………………………….. ………………………….. …………………….. 43
Bibliografie ………………………….. ………………………….. ………………………….. ………………………….. …………………. 45

Lista figurilor

Figura 1.1 – Metoda farfuriei ………………………….. ………………………….. ………………………….. ………….. 13

Figura 2.1 – Fișierele din proiect în vizualizarea Android ………………………….. ………………………….. . 17
Figura 2.2 – Fișierele proiectului din vizualizarea „Probleme” ………………………….. ……………………. 18
Figura 2.3 – Mediul de dezvoltare integrat Android Studio ………………………….. …………………………. 18

Figura 3.1 – Organigrama aplicației ………………………….. ………………………….. ………………………….. … 25
Figura 3.2 – Ierarhie View ………………………….. ………………………….. ………………………….. ………………. 26
Figura 3.3 – Schemă bloc OCR ………………………….. ………………………….. ………………………….. ………. 30

Figura 4.1 – Ecran principal ………………………….. ………………………….. ………………………….. ……………. 33
Figura 4.2 – Salvare valoare ………………………….. ………………………….. ………………………….. …………… 34
Figura 4.3 – Generare grafic ………………………….. ………………………….. ………………………….. …………… 34
Figura 4.4 – Deschi dere activitate scanare ………………………….. ………………………….. …………………….. 35
Figura 4.5 – Butoane respingere/acceptare fotografie ………………………….. ………………………….. …….. 35
Figura 4.6 – Afișare valori ………………………….. ………………………….. ………………………….. ……………… 35
Figura 4.7 – Baza de date glicemie ………………………….. ………………………….. ………………………….. ….. 36
Figura 4.8 – Meniu opțiuni ………………………….. ………………………….. ………………………….. …………….. 36
Figura 4.9 – Fereastră Setare alarmă ………………………….. ………………………….. ………………………….. … 37
Figura 4.10 – Setare dată ………………………….. ………………………….. ………………………….. ………………… 37
Figura 4.11 – Setare oră ………………………….. ………………………….. ………………………….. …………………. 38
Figura 4.12 – Notificare ………………………….. ………………………….. ………………………….. …………………. 38
Figura 4.13 – Bază de date alarme ………………………….. ………………………….. ………………………….. …… 38
Figura 4.14 – Fereastră Regimuri ………………………….. ………………………….. ………………………….. ……. 39
Figura 4.15 – Generare regimuri alimentare ………………………….. ………………………….. ………………….. 39
Figura 4.16 – Fereastră Medicamentație ………………………….. ………………………….. ……………………….. 40
Figura 4.17 – Afișare medicamente ………………………….. ………………………….. ………………………….. …. 40
Figura 4.18 – Baza de date medicamente ………………………….. ………………………….. ……………………… 41

Lista acronimelor

ACID – Atomicity , Consistency , Isolation , Durability
ADB – Android Debug Bridge
ANS I – American National Standard Institution
API – Application Programming Interface
ARM – Acorn RISC Machine
CGM – Continuous Glucose Monitoring
FPG – Fasting plasma glucose
GPS – Global Positionnig System
GSM – Global System for Mobile Communications( Sistem global pentru comunicații mobile)
HDL – High Density Lipoprotein
HIV – Human Immunodeficiency Virus(Virusul imunodeficienței umane)
IDE – Integrated Development Environment
KISS – Keep It Simple, S tupid
LDL – Low Density Lipoprotein
NDK – Nativ e Development Kit
OCR – Optical Character recognition(Recunoaștere optică a caracterelor)
PCOS – Polycystic Ovary Syndrome
RDBMS – Relational Database Management S ystem
RPG – Regulate partition glucose
SQL – Structured Query Language
UTF – Unicode T ransformation Format
XML – Extensible Markup Language

1

Introducere

Diabetul este una dintre cele mai răspândite boli din lume. Studiile au arătat că în anul 2015
erau 392 milioane de oameni diagnosticați cu această boală, în comparație cu cele 30 de milioane
din anul 1985. 90% din persoanele diagnosticate cu diabet, sufereau de diabet de tip 2. Conform
unui studiu din anul 2014, în România aproximativ 2 milioane de locuitori erau identificați având
această boală, astfel se arăta ca 11,6% din popula ția țării avea această afecțiune.
Această boală este o afecțiune cronică și se consideră că duce la scăderea speranței de viață
cu 10 ani, din cauza faptului că există o mulțime de complicații care pot apărea odată cu ea. Printre
acestea se află riscul de două până la patru ori mai mare de apariție a unei afecțiuni cardiovasculare,
cum ar fi accidentul vascular. O altă complicație la fel de importantă este creșterea de 20 de ori a
numărului de amputații ale membrelor inferioare, dar si creșterea numărului de cazuri de spitalizare.
Din păcate diabetul de tip 2 reprezintă și cea mai des întâlnită cauză a orbirii netraumatice.
Diabetul zaharat de tip este o boală care „nu se simte”, poate trece neobservată deoarece nu
se întâmplă nimic în exterior, dar în int erior distruge aproape orice organ, în cele din urmă această
afecțiune ajunge sa afecteze și pe exterior, de cele mai multe ori membrele inferioare. Din această
cauză este recomandat să se încerce prevenirea apar iției ei pe cât de mult posibil, prin respec tarea
unor reguli de bază.
În momentul actual există numeroase aplicații pentru persoanele diabetice, atât pe Android
cât si pe celelalte sisteme de operare, dar multe dintre ele sunt destul de complicate, mai ales pentru
persoanele mai în vârstă. Acest l ucru este esențial datorită faptului că diabetul de tip 2 debutează de
obicei la persoane de peste 30 de ani, dar cel mai frecvent la grupele de vârstă superioare.
Pentru un management corect al diabetului de tip 2 am realizat această aplicație, în care
utilizatorul își poată salva valoarea glicemie, poate crea alarme pentru diferitele activități necesare
menținerii unei glicemii cât mai corecte, poate înregistra programului de medicamentație și
generarea unor grafice care conțin valorile înregistrate.
Am ales creare a plicației pe sistemul de operare Android pentru că este unul dinte cele mai
utilizate sisteme și cu cea mai mare răspândire în întreaga lume. Aplicațiile pot fi instalate pe
hardware -ul țintă fără a fi necesar comunicarea prin fir sau fără a se utiliza un calculator. Android
permite dezvoltatorilor scrierea codului în limbaj Java.
Am ales implementarea aplicației pe Android Studio deoarece este mediul oficial de
dezvoltare pentru platforma Android. Acesta oferă un suport foarte bun pentru real izarea unor
aplicații cât mai performante.

2

3
1. Diabet zaharat

Diabetul este o boală care apare atunci când glicemia, numită și zahărul din sânge, este prea
mare. Glicemia este principala sursă de energie și provine din alimentele pe care le consumăm.
Insulina, un hormon secretat de pancreas, ajută glucoza din alimente să intre în celulele corpului
pentru a fi utilizată pentru energie. Uneori, corpul uman nu produce suficientă insulină sau chiar
deloc sau nu utilizează corect insulina, astfel g lucoza rămân e în sânge și nu ajunge în celulele
corpului.
În timp, cantitatea prea mare de glucoză din sânge, poate provoca probleme de sănătate. Deși
diabetul nu are nici un tratament, se pot lua măsuri pentru gestionarea diabetului zaharat și menținerea
sănătății câ t mai corect.
1.1 Tipuri de diabet
Cele mai frecvente tipuri de diabet sunt cele de tipul 1, de tipul 2 și diabetul gestațional.
Diabet de tipul 1
În cazul diabetului de tip 1, organismul nu produce deloc insulină. Sistemul imunitar atacă și
distruge celulele din pancreas care produc insulină. Acest tip de diabet este, de obicei, diagnosticat la
copii și adulți tineri, deși poate apărea la orice vârstă. Persoanele cu diabet de tip 1 trebuie să își
administreze insulină în fiecare zi pentru a rămâne în viață.
Diabet de tipul 2
În cazul diabetului de tip 2, organismul nu produce sau nu utilizează corect insulina. Acest tip
de diabet se poate dezvolta la orice vârstă, chiar și în copilărie. Totuși, acesta apare cel mai frecvent
la persoanele de vârstă mijlocie și superioare . Acest tip este cel mai frecvent tip de diabet.
Diabet gestațional
Diabetul gestațional se dezvoltă la unele femei când sunt însărcinate. De cele mai multe ori,
acest tip de diabet dispare după ce copilul se naște. Cu toate acestea, dacă în cazul unei persoane a
existat diabet gestațional, există mai multe șanse de a dezvolta dia bet de tip 2 mai târziu . Uneori,
diabetul diagnosticat în timpul unei sarcinii este de fapt diabetul de tip 2.
Alte tipuri de diabet zaharat
Printre cele mai puțin frecven te tipuri de diabet este inclus diabetul monogenic, care este o
formă moștenită de diabet și diabetul de fibră chistică asociată. [1]
1.2 Diabet zaharat de tip 2
Diabetul de tip 2 este de departe cea mai comună formă de diabet, a fectând 90 -95% dintre
persoanel e diagnosticate cu diabet . În cazul acestei afecțiuni , organismul produce insulină, dar fie
pentru că pancreasul nu produce suficient, fie pentru că pur și simplu nu poate utiliza insulina
suficient de bine, o persoană devine ceea ce se numește "rezistent la insulină". Se acumulează în
organism în loc să cir cule în celule , provocând o varietate de probleme. [2]
1.2.1 Simptome
Simptomele diabetului includ:
• Sete si urinare crescut ă

4
• Senzație de foame accentuată
• Oboseală
• Vedere neclară
• Amorțeală sau furnicături ale p icioarelor sau mâinilor
• Răni care nu se vindecă
• Pierdere în greutate inexplicabilă
Simptomele diabetului de t ip 1 pot începe repede, de multe ori este doar o chestiune de
săptămâni. Simptomele diabetului de tip 2 se dezvoltă adesea lent – pe parcursul mai multor ani – și
pot fi atât de ușoare încât este posibil să nu fie sesizate. Multe persoane cu diabet zaharat de tip 2 nu
prezintă simptome. Unii oameni nu află că au această boală până când nu au problemele de sănătate
care însoțesc această afecțiune .[3]
1.2.2 Cauze
Este cauzat de mai mulți factori, inclusiv genele și stilul de viață.
Supraponderalitate, obezitate și inactivitate fizică
Există mai multe șanse de a dezvolta diabet zaharat de tip 2 dacă nu există activitate din punct
de vedere fizic și persoanele sunt supraponderale sau obeze. Greutatea în plus uneori cauzează
rezistență la insulină și este frecventă la persoanele cu diabet zaharat de tip 2. De asemenea,
localizarea grăsimii corporale poate face diferența, astfel că g reutatea în zona abdominală est e legată
de rezistența la insulină.
Rezistența la insulină
Acest tip de diabet zaharat începe, de obicei, cu rezistență la insulină, o afecțiune în care
mușchii, ficatul și celulele grase nu utilizează corect insulina, având c a rezultat, necesitatea
organ ismul ui de mai multă insulină pentru a ajuta glucoza să intre în celule. La început, pancreasul
secretă mai multă insulină pentru a ține pasul cu cererea adăugată. În timp, pancreasul nu mai poate
produce insulină suficientă, iar nivelul glucozei din sânge crește.
Genele și istoria familiei
Ca și în cazul diab etului de tip 1, anumite gene pot duce probabil la dezvoltarea diabet ului de
tip 2. Genele , de asemenea, pot mări riscul apariției diabet ului zaharat tip 2 prin creșterea tendinței
unei per soane de a d eveni supraponderală sau obeză .
Alte cauze posibile
Mutațiile genetice, alte boli, deteriorarea pancreasului și anumite medicamente pot, de
asemenea, provoca această afecțiune .
Mutații genetice
Diabetul monogenic este cauzat de mutații sau modificări într -o singură genă. Aceste
schimbări sunt, de obicei, transmise din familii, dar uneori mutația genetică are loc și singură.
Majoritatea mutațiilor genetice care provoacă diabetul, fac pancreasul mai puțin capabil să producă
insulină. Cele mai frecvente tipuri de diabet monogenic sunt diabetul neonatal și diabetul zaharat la
maturitate al tinerilor. Diabetul neonatal se produce în primele 6 luni de viață. Medicii, de obicei, pot
diagnostica diabetul la maturitate al tinerilor în timpul adolescenței sau la vârst a adultă, dar uneori
boala nu este diagnosticată decât mai târziu în viață.

5
Fibroza chistică produce un mucus gros care provoacă cicatrici în pancreas. Această cicatrice
poate împiedica pancreasul să producă suficientă insulină.
Hemocromatoza determină stocarea de prea mult fier în organism . Dacă boala nu este tratată,
fierul se poate acumula și poate deteriora pancreasul și alte organe.
Boli hormonale
Unele boli hormonale determină organismul să producă anumiți hormoni într -o cantitate prea
mare, care uneo ri produc rezistență la insulină și duc la diabet .
• Sindromul Cushing apare atunci când organismul produce prea mult cortizol –
denumit adesea "hormonul de stres".
• Acromegalia apare atunci când organismul produce prea mult hormon de creștere.
• Hipertiroidism ul apare atunci când glanda tiroidă produce prea mult hormon tiroidian.
Deteriorarea sau îndepărtarea pancreasului
Pancreatita și cancerul pancreatic pot dăuna celulelor beta sau le pot face mai puțin capabile
să producă insulină, ducând la diabet. În cazu l în care pancreasul deteriorat este îndepărtat, diabetul
va apărea din cauza pierderii celulelor beta.
Medicamente
Uneori anumite medicamente pot dăuna celulelor beta sau pot întrerupe funcționarea insulinei.
Acestea ar putea fi :
• Niacina, un tip de vitami na B3
• Anumite tipuri de medicamente diuretice
• Medicamente anti -convulsii
• Medicamente psihiatrice
• Medicamente pentru tratamentul virusului imunodeficienței umane (HIV)
• Pentamidina, un medicament utilizat pentru a trata un tip de pneumonie
• Glucocorticoizi – medicamente utilizate pentru tratarea bolilor inflamatorii cum ar fi
artrita reumatoidă, astmul, lupusul și coli ta ulceroasă
• Medicamente anti -respingere, utilizate pentru a ajuta organismul să nu respingă un
organ transplantat
Statinele, medicamente le pent ru reduce rea nivelurile de colesterol LDL ("rău"), pot crește
ușor șansa de a dezvolta diabet. Cu toate acestea, statinele ajută la protejarea apariției bolilor de inimă
și accident ului vascular cerebral. Din acest motiv, beneficiile puternice ale adm inistrării statinelor
depășesc ș ansa mică de a dezvolta diabet. [4]
1.2.3 Factori de risc
Șansele de a dezvolta diabet zaharat de tip 2 depind de o combinație de factori de risc, cum ar
fi genele și stilul de viață. Deși unii factorii de risc nu se pot controla cum ar fi istoricul familiei,
vârsta sau etnia, se pot schimba alți factorii de risc de exemplu, stilul de viață în ceea ce privește
consumul de alimente, activitatea fizică și greutatea. Aceste modificări ale stilului de viață pot afecta
șansele de a dezvolta d iabet zaharat tip 2.
Printre factorii de risc de dezvoltare a diabetul tip 2 se află :
• Supraponderalitatea sau obezitatea

6
• Vârsta de 45 de ani sau mai mare
• Un istoric familial de diabet
• Tensiune a arterială crescută
• Nivelul scăzut de colesterol HDL ("bun") sa u un nivel ridicat de trigliceride
• Diabetul gestaț ional sau nașterea unui copil cu greutate de 9 kg sau mai mult
• Inactivitatea fizică
• Bolile de inima sau accident ul vascular cerebral
• Depresia
• Sindromul ovarului polichistic, denumit și PCOS
• Acantoza nigric ană – piele întunecată, groasă și catifelată în jurul gâtului sau a
axelor [2]

1.2.4 Prevenirea
Pentru prevenirea sau amânarea diabetului de tip 2 se pot lua anumite măsuri, și anume
scăderea în greutate pentru persoanele supraponderal e, consumarea într -o cantit ate mai mică de
calorii și creșterea activităț ii fizice. Se recomandă consultarea unui medic despre oricar e dintre
problemele de sănătate enumerate mai sus, care pot necesita un tratament medical. Gestionarea cât
mai corect a acestor probleme de sănătate poate ajuta la reducerea șanselor de a dezvolta diabet
zaharat tip 2. De asemenea, este importantă și consultarea unui medic specialist în legătură cu orice
medicamente consumate , care ar putea crește riscul.
Diabetul poate provoca probleme grave de sănăta te, cum ar fi bolile de inimă, accidentul
vascular cerebral și probleme la ochi și la membrele inferioare . Prediabetul poate provoca, de
asemenea, p robleme de sănătate. O veste bună este aceea că diabetul de tip 2 poate fi întârziat sau
chiar împiedicat. Pentru prevenirea sau amânarea diabetului de tip 2, este necesară pierdere unei
cantități modeste în greutate, urmâ nd un plan de alimentație corespunzător și fiind activ fizic în
majoritatea zilelor săptămânii.
Există anumite lucruri care pot fi făcute pent ru prevenirea diabetului și anume:
• Pierderea în greutate și menținerea unei greutăți normale . Este posibilă prevenirea sau
întârzierea diabetului prin pierderea a 5 până la 7 procente din greutatea inițială. De
exemplu, la o greutate de 20 0 de kilograme, obiectivul ar fi pierderea între 10 și 14
kilograme.
• Mișcare mai multă. Realizarea a cel puțin 30 de minute de activitate fizică 5 zile pe
săptămână.
• Consumarea unor alimente cât mai sănătoase. Consumarea unor porții mai mici pentru
reducerea cantității de calorii din fiecare zi, ceea ce ajuta la scăderea în greutate.
Alegerea alimentelor cu mai puțină grăsime este un alt mod d e a reduce caloriile.
Consumul de apă în loc de băuturi îndulcite.
Prediabetul
Prediabetul apare atunci când nivelul glicemiei este mai mare decât în mod normal, dar nu
este suficient de ridicat pentru a fi numit diabet. Apariția prediabet uli este o problemă serioasă
deoarece crește șansa de a dezvolta diabet zaharat tip 2. Mulț i dintre aceiași factori care generea ză
șanse de a dez volta diabet zaharat de tip 2 conduc la apariția prediabet ului.
Alte denumiri pentru prediabet sunt glucoză afectată la repaus sau toleranță la glucoză
afectată. Unii oameni numesc prediabetul "diabetul frontal". [5]

7

1.2.5 Testarea
Oricine care prezintă simptomele diabet ului necesită testarea în vederea acestei boli. Unii
oameni pot să nu dezvolte niciuna din simptomele prezentate , dar pot exista factori de risc pentru
diabet și necesită testarea . Aceasta permite profesioniștilor din domeniul sănătății să găsească cât mai
rapid diabetul și să luc reze cu pacienții lor pentru o gestiona re cât mai corectă a diabetul ui zaharat și
preveni rea complicațiilor .
De asemenea, testarea permite identificarea prediabetul ui. Efectuarea modificărilor privind
stilul de viață ajută la întârzierea sau prevenirea diabetului de tip 2.
Experții recomandă testarea de rutină pentru diabetul de tip 2 dacă persoana:
• Are vârsta de 45 de ani sau mai mult
• Are vârsta între 19 și 44 de ani, este supraponderală sau obeză și prezintă unul sau mai
mulți factori de risc pentru diabet
• Este o femeie care a suferit diabet gestațional
Deși diabetul de tip 2 se dezvoltă cel mai adesea la adulți, copiii pot dezvolta și ei diabet de
tip 2. Experții recomandă testarea copiilor cu vârste cuprinse între 10 și 18 a ni care sunt
supraponderali sau obezi și prezintă cel puțin alți doi factori de risc pentru dezvoltarea diabetului.
Teste realizare pentru diagnosticarea diabetului sau prediabetului
Medicii din acest domeniu utilizează cel mai adesea testul glucozei plasm atice la naștere
(FPG) sau testul A1C pentru a diagnostica diabetul. În unele cazuri, acestea pot utiliza un test de
glucoză plasmă aleatorie (RPG).
Testul glucozei plasmatice î n repaus
Testul de sânge FPG măsoară nivelul glicemiei la un moment dat. Pentru cele mai fiabile
rezultate, cel mai corect este realizarea acest ui test di mineața, după un somn de cel puțin 8 ore, fără
consumarea alimentelor sau băuturilor, cu excepția apei .
Testul A1C
Testul A1C este un test de sânge care oferă nivelurile medii ale g licemiei în ultimele 3 luni.
Alte nume pentru testul A1C sunt hemoglobina A1C, HbA1C, hemoglobina glicată și testul de
hemoglobină glicozilat. Se poate mânca și bea înainte de acest test. În cazul utilizării testului A1C
pentru diagnostica rea diabetul ui zaharat, medicul va lua în considerare factori precum vârsta și dacă
există anemie sau o altă problemă cu sângele persoanei testate. Testul A1C nu este corect pentru
persoanele cu anemie.
Medicul va raporta rezultatul testului A1C ca procent, cum ar fi un A1 C de 7%. Cu cât este
mai mare procentajul, cu atât sunt mai mari valorile medii ale glicemiei.
Persoanele cu diabet utilizează, de asemenea, informații din testul A1C pentru a ajuta la
gestionarea diabetului zaharat.
Test de glucoză plasmatică aleatorie (R PG)
Uneori medicii folosesc testul RPG pentru a diagnostica diabetul atunci când simptomele
diabetului sunt prezente. Nu este nevoie de repaus peste noapte pentru testul RPG. Acest tip de test
se poate realiza în orice moment. [6]

8

1.2.6 Management
Este posibilă gestionarea diabetului și menținerea unei vieți lungi și sănătoase, având o grijă
cât mai riguroasă.
Diabetul poate afecta aproape fiecare parte a corpului. Prin urmare , este necesară
administrarea nivelurilor de glucoză din sânge . Gestionarea glucozei din sânge, a tensiunii arteriale
și a colesterolului poate ajuta la prevenirea problemelor de sănătate care pot apărea atunci când există
diabet.
Cu ajutorul unui medic , se poate crea un plan de auto -îngrijire a diabetului pentru gestionarea
diabetului. Planu l de auto -îngrijire poate include acești pași:
• Gestionarea diabetului zaharat ABCs.
• Urmărirea unui plan de masă pentru diabet.
• Introducerea activității fizice ca parte din rutină.
• Luarea medicamentelor.
• Verificarea nivelul glucozei din sânge.
Gestionarea d iabetului zaharat ABCs
Cunoașt erea diabetului zaharat ABCs ajută la administrarea glicemia, tensiunii arteriale și
colesterolul ui. Renunțarea la fumatul va ajuta, de asemenea, în gestionarea diabetul ui. Obiectivele
ABCs pot ajuta la scăderea șanselor de a avea un atac de cord, accident vascular cerebral sau alte
probleme de diabet.
A de la testul A1C
Testul A1C arată nivelul mediu al glicemiei în ultimele 3 luni. Rezultatul favorabil A1C pentru
majoritatea persoane lor cu diabet zaharat este sub 7%.
B de la tensiunea sangvina
Tensiunea arterială pentru majoritatea persoanelor cu diabet zaharat este sub 140/90 mm Hg.
C de la colesterol
Există două tipuri de colesterol în sânge: LDL și HDL. LDL sau colesterolul "rău" se poate
acumula și poate înfunda vasele de sânge. Prea mult colesterol rău poate conduce la un atac de cord
sau un accident vascular cerebral. HDL sau colesterolul "bun" ajută la eliminarea colesterolului "rău"
din vasele de sânge.
S de la Stop fumat
Stoparea fumatului este deosebit de importantă pentru persoanele cu diabet zaharat, deoarece
atât fumatul cât și diabetul micșorează vasele de sânge. Insuficiența vaselor de sânge face ca inima
să lucreze mai mult. E -țigaretele nu sunt o opțiune sigură.
În cazul renunțării la fumat:
• Se va reduce riscul de infarct miocardic, a ccident vascular cerebral, boli neuronale ,
afecțiuni renale, boli o culare diabetice și amputări
• Nivelul colesterolului și tensiunea arterială se pot îmbunătăți
• Circulația sanguină se va îmbunătăți

9
Menține rea nivelurilor de A1C, tens iunii arteriale și colesterol ului aproape de obiectivele
fiecărei persoane și oprirea fumatului poate ajuta la prevenirea efectelor dăunătoare ale diabetului pe
termen lung. Aceste probleme de sănătate includ boli de inimă, accident vascular cerebral, boli ale
rinichi lor, leziuni ale nervilor și boli oculare.
Urmărirea planului de masă pentru diabet
Se recomandă realizarea u nui plan de masă pentru diabetici. Urmărind acest plan de masă, va
fii de ajutor pentru administrarea glicemiei, tensiunii arteriale ș i colesterolului.
Este recomandat consumul de fructe și legume, cereale integrale, carne de pui sau curcan fără
piele, pește, carne slabă și lapte și brânză fără grăsimi sau cu conținut scăzut de grăsimi. Se recomandă
consumul de apă în lo c de băuturi îndu lcite cu zahăr, alegerea de alimente care sunt mai scăzute în
calorii, grăsimi saturate, grăsimi trans, zahăr și sare.
Introducerea activității fizice ca parte din rutină
Stabilirea unui obiectiv pentru a fi mai activ din punct de vedere fizic este un luc ru necesar.
Se recomandă o activitate fizică de cel puțin 30 de minute în majoritatea zilelor săptămânii. Mersul
pe jos și înotul sunt modalități bune pentru o activitate corectă .
Administrarea medicamentelor
Este recomandată administrarea medicamentelor pentru diabet și orice alte probleme de
sănătate, chiar și atunci când starea de sănătate este bună sau s-a ajuns la nivelul corect al glicemiei,
al tensiunii arteriale și al colest erolului. Aceste medicamente ajută la administrarea ABC -urilor .
Verificarea nivelul glucozei din sânge
Pentru multe persoane cu diabet zaharat, verificarea nivelului de glucoză în fiecare zi este o
modalitate importantă de gestiona re a diabetul ui. Monitorizarea nivelului glucozei din sânge este cea
mai importantă dacă se administ rează insulină. Rezultatele monitorizării glicemiei pot ajuta în luarea
unor decizii cu privire la alimente, activitate fizică și medicamente.
Cea m ai obișnuită modalitate de verifica re a nivelul ui glucozei din sânge la domiciliu este
cu un glucometru . Se ia o picătură de sânge prin lovirea părții degetului cu un ac . Apoi aplicați
sângele pe o bandă de testare. Aparatul va arăta cât de mult ă glucoză este în sânge în acel
moment. [7]
1.2.7 Monitorizarea glucozei
Monitorizarea continuă a glucozei (CGM ) este o altă m odalitate de verifica re a nivelul ui de
glucoză. Cele mai multe sisteme CGM utilizează un senzor mic care se introduce sub piele. Senzorul
măsoară nivelurile de glucoză în fluidele dintre celulele corpului dumneavoastră la fi ecare câteva
minute și poate ară ta modificări ale nivelului de glucoză pe parcursul zilei și al nopții. Dacă sistemul
CGM arată că nivelul glucozei este prea mare sau prea scăzut, trebuie realizată verificarea glucozei
cu ajutorul unui glucometru înainte de a efectua orice modi ficare a p lanului alimentar, a activității
fizice sau a medicamentelor. Un sistem CGM este util în special pentru persoanele care utilizează
insulină și care au probleme cu scăderea glicemiei.
Nivel scăzut al glicemiei
Uneori, nivelul de glucoză din sânge scade sub nivelul la care ar trebui să fie, ceea ce se
numește hipoglicemie. Pentru majoritatea persoanelor cu diabet zaharat, nivelul glicemiei este prea
mic atunci când este sub 70 mg / dl.

10
Hipoglicemia poate pune viața în pericol și trebuie tratată imediat.
Nive lul crescut al glicemiei
Doctorii numesc hiperglicemie nivelul crescut al glicemiei .
Simptomele care arată că nivelul glicemiei poate fi prea ridicat includ:
• Senzație de sete
• Senzație de oboseală sau slăbire
• Dureri de cap
• Urinarea frecventă
• Vedere neclară
Necesitatea verificării cetonelor
Medicul poate cere verificarea urinei pentru cetone în cazul unor simptome de cetoacidoză
diabetică. Când nivelurile de cetone devin prea mari, se poate dezvolta această condiție care pune
viața în pericol. Simptomele incl ud:
• Probleme de respirație
• Greață sau vărsături
• Dureri de abdomen
• Confuzie
• Senzație de oboseală sau somnolență [7]

1.2.8 Insulina, medicamente si alte tratamente
Unele persoane cu diabet zaharat de tip 2 își pot gestiona boala prin alegeri a limentare
sănătoase ș i printr -o activitate mai intensă din punct de vedere fizic. Majoritatea persoane lor cu diabet
de tip 2 au nevoie și de medicamente speciale pentru diabet. Aceste medicamente pot include pastile
orale sau medicamente care se injectează sub piele, cum ar fi insulina. În timp, este posibil să fie
nevoie de mai mult d e un medicament pentru a putea controla glicemia. Chiar dacă nu este nevoie de
insulină, este posibil ă necesitatea acesteia în momente speciale, cum ar fi în timpul sarcinii sau în
momentul intern ării într -un spital.
Medicamente
Majoritatea persoanelor cu diabet de tip 2 încep tratamentul cu metformină. Metformina este
prezentă și sub formă de soluție lichidă. Metformina scade cantitatea de glucoză pe care o produce
ficatul și ajută organismul în utilizarea mai corect a insulinei . Acest medicament poate ajuta la
pierderea unei cantități mici din greutate.
Alte medicamente orale acțione ază în moduri diferite pentru reducerea nivelul ui de glucoză
din sânge. Poate fi necesar adăugarea unui alt medicame nt după un timp sau utilizarea unui tratament
combinat. Combinarea a două sau trei tipuri de medicamente pentru diabet zaharat poate duce la
scăderea nivelului de glucoză în sânge mai mult decât în cazul administrării unui singur medicament.
Medicamente in jectabile
Pe lângă insulină, sunt disponibile și alte tipuri de medicamente injectabile. Aceste
medicamente ajută la împiedicarea creșterii nivelului glicemiei după servirea meselor. Acestea pot
ajuta la reduc erea senzației de foame și la pierderea în gre utatea. Aceste medicament e injectabile nu
reprezintă substituenți ai insulinei .

11
Efectele secundare ale medicamentelor
Efectele secundare sunt acele problemele care apar după consumarea unui medicament. Unele
medicamente pentru diabet zaharat pot determina hipoglicemie, numită și scăderea glucozei din
sânge, dacă nu se realizează un echilibru între medicamente și alimente și activitate.
Alte tratamente
Când medicamentele și modificările stilului de viață nu sunt suficiente pentru a gestiona
diabetul , un tra tament mai puțin frecvent poate fi o opțiune , acesta ar putea includ e intervenția
chirurgicală bariatrică pentru anumite persoane cu diabet z aharat de tip 1 sau tip 2, transplant ul de
pancreas artificial și transplantul de insulină pancreatică pentru unele persoane cu diabet zaharat de
tip 1. [8]
1.2.9 Regim alimentar, alimentație si activitate fizică
Nutriția și activitatea fizică sunt părți importante ale unui stil de viață sănătos pentru
persoanele cu diabet. Împreună cu alte beneficii, după un plan de alimenta ție sănătos și activ se poate
menține nivelul glicemiei, numit și zahăr din sânge, în intervalul țintă. Pentru o administrare a
glicemiei, trebuie realizat un echilibru între alimente și lichide pe de o parte și activitatea fizică și
medicamentul pentru diabet, pe de altă parte. Alegerea mâncării, cantitatea de mâncare și intervalul
orar de servire a mesei sunt importante pentru menținerea nivelului glicemiei în intervalul
recomandat.
Mâncând sănătos și fiind activ fizic în cele mai multe zile ale săptămâ nii pot ajuta:
• Păstrarea unui nivel al glucozei din sânge, tensiunii arteriale și colesterolului în
intervalele țintă
• Pierderea în greutate sau menținerea unei greutăți sănătoase
• Prevenirea sau întârzierea problemelor de diabet
• Creșterea nivelului de energ ie
Alimentație
Cheia unui regim alimentar corect este de a mânca o varietate de alimente sănătoase din toate
grupurile , în cantitățile pe care planul de masă al fiecăruia îl conturează.
Grupurile alimentare sunt:
• Legume
Non-amidon: broccoli, morcovi, păstă i, ardei și roșii
Amidon: cartofi, porumb și mazăre verde
• Fructe – portoc ale, pepene galben, fructe de pă dure, mere, banane si struguri
• Cereale – cel puțin jumătate din cerealele pentru ziua respectivă ar trebui să fie cereale
întregi : grâu, orez, ovăz, f ăină de porumb, orz și quinoa
Exemple: pâine, paste făinoase, cereale și tortilla
• Proteine – Carne slabă, carne de pui sau curcan fără piele, pește, ouă, nuci și arahide,
fasole uscată și anumite mazăre, cum ar fi năuturile și mazărea divizată, înlocuitori de
carne, cum ar fi tofu

12
• Lactate fără grăsimi sau cu un conținut scăzut de grăsimi – Lapte sau lapte fără lactoză
pentru persoanele care au intoleranță la lactoză, iaurt, brânză
Se recomandă aliment e cu „grăsimi sănă toase ”, care provin in principal din următoarele
alimente:
• Uleiuri care sunt lichide la temperatura camerei, cum ar fi canola și uleiul de măsline
• Nuci si seminț e
• Pești , cum ar fi somonul, tonul și macrou
• Avocado
Alimentele și băuturile care trebuie limitate:
• Alimente pră jite sau bogate în grăs imi saturate și grăsimi trans
• Alimente bogate în sare
• Dulciuri, cum ar fi produsele coapte, bomboane și înghețată
• Băuturi cu adaos de zaharuri, cum ar fi sucul, sifonul obișnuit, și băuturile energizante
Se recomandă consumul de apă în loc de băuturi îndul cite și utilizarea unui înlocuitor de zahăr
în cafea sau în ceai.
Este recomandat consumul de alcool moderat – nu mai mult de o băutură pe zi pentru o femeie
sau două băuturi pe zi pentru un bărbat. În cazul medicamentelor pentru diabet zaharat care cresc
cantitatea de insulină pe care o produce corpul, alcoolul poate să scadă prea mult nivelul de glucoză
din sânge.
Unele persoane cu diabet zaharat trebuie să mănânce aproximativ la aceeași oră în fiecare zi.
Alții pot fi mai flexibili în legătură cu moment ul meselor. În funcție de medicamente sau de tipul de
insulină, poate fi necesar consumul aceleiași cantități de carbohidrați în același timp în fiecare zi. În
cazul insulinei „de masă” , programul de masă poate fi mai flexibil.
În cazul utilizării anumitor medicamente pentru diabet zaharat se renunță sau se întârzie o
masă, nivelul glucozei din sânge poate scădea prea mult.
Cantitatea potrivită de alimente va ajuta, de asemenea, în gestionarea nivelului glicemiei și al
greutății.
Planificarea pierderii în greutate
În cazuri de supraponderalitate sau obezitate, este necesar consultarea unui medic pentru a
crea un plan de scădere în greutate.
Pentru a pierde din greutate, trebuie un consum cât mai mic de calorii și înlocuirea alimentelor
mai puți n sănă toase c u alimente slabe în calorii, grăsimi si zahăr.
Metode de planificare a mesei
Două modalități comune pentru planificarea cantității de alimente în cazul persoanelor cu
diabet zaharat sunt metoda „farfuriei” și numărarea carbohidraților.
Metoda „farfuriei” a jută la controlarea dimensiunilor porțiunilor și este prezentată în Figura
1.1. Nu este necesară numărarea caloriilor. Metoda „farfuriei” oferă cantitatea din fiecare grup de
alimente care ar trebui consumată. Această metodă funcționează cel mai bine pentr u prânz și cină.

13

Figura 1. 1– Metoda farfuriei [9]
Se utilizează o farfurie de 9 inch. Se pun legumele non -amidon pe jumătate din farfurie, carne
sau altă proteină pe un sfert din farfurie și un tip de cereale sau legume amidonic e pe ultima parte a
farfuriei. Amidonurile includ legume amidonice cum ar fi porumbul și mazărea. Se poate, de
asemenea, consumarea un mic bol de fructe sau o bucată de fruct și consumarea un mic pahar de
lapte, așa cum este inclus în planul de masă al fie cărei persoane. [5]
Dimensiunile porțiunilor:
Se pot utiliza obiectele de zi cu zi sau mâna pentru a evalua dimensiunea unei porțiuni.
• 1 porție de carne sau pasăre poate fi de dimensiunea palmei
• 1 porție de pește poate fi de dimensiunea unui cec
• 1 porț ie de brânză poate fi de dimensiunea unui zar
• 1/2 ceaș că de orez fiert sau paste pot fi de dimensiunea unei mâini rotunjite sau a unei
mingi de tenis
• 1 porț ie de clătite sau waffle poate fi de dimensiunea unui DVD
• 2 linguri de unt de arahide pot fi de dimensiu ne unor mingi de ping -pong [8]
Numărarea carbohidraților implică urmărirea cantității de carbohidrați care se consumă în
fiecare zi. Deoarece carbohidrații se transformă în glucoză în organism, ele afectează nivelul
glicemiei mai mult decât alte alimente. I dentificarea acestora poate ajuta în administrarea nivelului
glucozei din sânge. În cazul consumului de insulină, numărarea carbohidraților poate ajuta la aflarea
cantității de insulină care trebuie administrată.
Cantitatea corectă de carbohidrați variază în funcție de modul de gestionarea al diabetului
zaharat, inclusiv de activitate a fizică și de medicamentele consumate, dacă este cazul.
Majoritatea carbohidraților provin din amidon, fructe, lapte și dulciuri. Se recomandă
limitarea carbohidraților cu za haruri adăugate sau cele din cereale rafinate , cum ar fi pâinea albă și
orezul alb. În schimb, se recomandă consumul de carbohidrați din fructe, legume, cereale integrale,
fasole și lapte cu conținut scăzut de grăsimi sau fără grăsimi.
Activitate fizică
Activitatea fizică reprezintă o parte importantă a gestionării nivelului glucozei din sânge și a
menținerii sănătății. Fiind activ fizic aduce multe be neficii pentru sănătate.

14
Activitatea fizică:
• Scade nivelul de glucoză din sânge
• Scade tensiunea arterială
• Îmbunătățește fluxul sangvin
• Arde caloriile suplimentare pentru menținerea greutății scăzute, dacă este necesar
• Îmbunătățește dispoziția
• Poate preveni pierderea și îmbunătățirea memoriei la adulții mai în vârstă
• Ajută la un somn mai bun
Chiar și o perioadă mai mică de activitate fizică poate ajuta. Experții sugerează cel puțin 30
de minute de activitate fizică moderată, 5 zile din săptămână. Pentru pierderea în greutate sau
menținerea scăderii în greutate, este nevoie de 60 de minute sau mai mult de activita te fizică 5 zile
din săptămână.
Siguranța în activitatea fizică
Se recomandă consumul de apă înainte, în timpul și după exerciții pentru a rămâne hidratat.
Următoarele sunt câteva sfaturi pentru o activitate fizică sigură pentru persoanele cu diabet .
Planificarea: în cazul consumului de insulină, trebuie realizată echilibrarea activității fizice cu
dozele de insulină și mesele, astfel încât să nu apară scăderea glicemiei.
Prevenirea scăderii glicemiei: deoarece activitatea fizică scade glicemia din sânge , este
necesară protejarea împotriva niveluril or scăzute ale glicemiei, numită și hipoglicemie. Este foarte
probabil ca o persoană să aibă hipoglicemie dacă ia insulină sau alte medicamente pentru diabet
zaharat, cum ar fi sulfoniluree. Hipoglicemia poate apărea, de asemenea, după un antrenament intens
sau dacă s -a om is o masă înainte de activitatea fizica . Hipoglicemia se poate produce în timpul sau
până la 24 de ore după activitatea fizică.
Planificarea este cheia pentru prevenirea hipoglicemiei. De exemp lu, dacă o persoană ia
insulină, medicul îi poate sugera să ia mai puțină insulină sau să consume o mică gustare cu
carbohidrați înainte, în timpul sau după activitatea fizică, în special în cazul unei activități intense .
Îngrijirea picioarelor: persoanele cu diabet zaharat pot avea probleme cu picioarele din cauza
fluxului sangvin scăzut și a leziunilor nervoase care pot rezulta din creșterea nivelului de glucoză din
sânge. Pentru a ajuta la p revenirea problemelor piciorelor , se recomandă purtarea de panto fi
confortabili și de sprijin și o îngrijire mai atentă a picioarelor înainte, în timpul și după activitatea
fizică. [7]

15
2. Tehnologii utilizate

2.1 Android
Android este un sistem de operare pentru telefoanele mobile, dezvoltat de Google, bazat pe
Linux ker nel și realizat în primul rând pentru dispozitivele cu ecran tactil, cum ar fi smatphone -uri și
tablete. Interfața Android este în principiu bazat pe manipularea directă, utilizând gesturi tactile, care
corespund acțiunilor reale , cum ar fi atingere, prind erea pentru manipularea obiectelor de pe ecran,
împreună cu o tastatură pentru introducere textelor.
A fost inițial dezvoltat de Android Inc., pe care Google l -a cumpărat în 2005. Acesta a fost
lansat în 2007, o dată cu fondare Open Handset Alliance – comp anii software, hardware sau pentru
telecomunicații dedicate avansării standardelor pentru dispozitivele mobile. Începând cu primul
dispozitiv comercial Android, acest sistem de operare a trecut prin multiple versiuni importante,
ultima fiind 7. 0, lansată d e Android în 2016.[ 10]
Android este un sistem de operare care supor tă un număr mare de aplicații pentru telefoanele
inteligente . Hardware -urile care suportă Android se bazează în principal pe platforma de arhitectură
ARM. Unele dintre caracteristicile actu ale și specificațiile de Android sunt:
• Arhitectura aplicației – permite reutilizarea și înlocuirea componentelor
• Mașină virtuală Darvik – este optimizat pentru dispozitivele mobile
• Browser integrat – este bazat pe un motor Web open source
• Grafică optimizat ă – este utilizată o bibliotecă 2D personalizată, Grafica 3D este
bazată pe OpenGl
• SQLite
• Suport media
• Tehnologie GSM
• Bluetooth, EDGE, 3G/4G, Wi -fi
• Cameră, G PS, Busolă etc.[11 ]
Android va continua consolidarea poziției dominante pe piața mondială pentru ma i multe
motive. Arhitectura modulară Android permite o ma re varietate de configurații și personalizări. Toate
aplicațiile de bază care se livrează stand ard cu dispozitivele Android sunt reciproce cu orice număr
de aplicații terțe și care includ aplicații c um ar fi modul de apelare al telefonului, aplicație de e -mail,
browser -ul și chiar navigatorul de sistem. Dispozitivele Android sunt disponibile într -o varietate
uimitoare de forme și funcții. Există ochelari de realitate virtuală cu Android, console de jo curi
Android (dintre care Ouya este cel mai notabil), ceasuri Android, tablete Android de orice dimensiune
imaginabilă și, bineînțeles, smartphone -uri Android.
Tehnologiile de bază Android se compară favorabil cu cele ale principalilor săi concurenți.
Sistemul de navigație inclus și open source a atras o mulțime vastă și impresionantă de aliați, inclusiv
Samsung, care este printre cele mai inovatoare companii din lume. Un sistem de operare gratuit și
personalizabil înseamnă că producătorii de dispozitive An droid se pot concentra pe aducerea
produselor pe piață cu o valoare de neegalat, iar piața extrem de competitivă a dispozitivelor Android
continuă să producă dispozitive necostisitoare, de înaltă calitate și deschise arhitectural. [12]

16
2.2 Android Studio
Andro id Studio este o colaborare între JetBrains și Google. Android Studio este construit pe
IntelliJ de la JetBrain, astfel încât funcționalitatea sa este o superset de IntelliJ. Cele mai multe
lucruri care se pot face cu IntelliJ, se pot, de asemenea, realiza și în Android Studio. A ndroid Studio
este revoluționar , deoarece simplifică procesul de dezvoltare Android și face dezvoltarea Android
mult mai accesibilă decât în trecut. [12]
Android Studio este mediul oficial de dezvoltare integrat (IDE) pentru dezvolt area aplicațiilor
Android, bazat pe IntelliJ IDEA. Pe lângă editorul de cod IntelliJ și instrumentele de dezvoltare,
Android Studio oferă chiar și mai multe caracteristici care îmbunătățesc productivitatea în construirea
de aplicații Android, cum ar fi:
• Un sistem de construcție flexibil bazat pe Gradle
• Un emulator rapid și bogat în caracteristici
• Un mediu unificat în care se pot dezvolta aplicații pentru toate dispozitivele Android
• Instant Run pentru a aduce modificări la aplicația în desfășurare fără a con strui un nou
APK
• Șabloane de coduri și integrare GitHub pentru ajutarea în construirea de caracteristici
comune ale aplicațiilor și importarea unor coduri de probă
• Instrumente și cadre de testare extinse
• Instrumente pentru creșterea performanțelor, gradulu i de utilizare, compatibilităților
versiunilor și rezolvarea altor probleme
• Suport C ++ și NDK
• Suport încorporat pentru Google Cloud Platform, facilitând integrarea serviciului
Google Cloud Messaging și a aplicați ei Engine.[13 ]

2.2.1 Structura proiectului
Fieca re proiect din Android Studio conține unul sau mai multe module cu fișiere de cod sursă
și fișiere de resurse. Tipurile de module includ:
• Module de aplicații Android
• Module de bibliotecă
• Module Google App Engine
În mod implicit, aplicația Android Studio af ișează fișierele din proiect în vizualizarea
proiectului Android, după cum se arată în F igura 2.1. Această vizualizare este organizată în module
pentru a oferi acces rapid la fișierele sursă cheie ale proiectului.

17

Figura 2. 1 – Fișierele din proiect în vizualizarea Android
Toate fișierele de construcție sunt vizibile la nivelul superior în cadrul scripturilor Gradle și
fiecare modul de aplicație conține următoarele dosare:
• Fișierele Manifests: conține fișierul AndroidManifest.xm l.
• Fișierele Java: conține fișierele de cod sursă Java, inclusiv codul de testare JUnit , sunt
cele mai folosite deoarece funcționalitatea fiecărei activități este implementată aici .
• Res: conține toate resursele non -cod, cum ar fi layout -uri XML, șiruri de caractere UI
și imagini bitmap. Aici se pot găsi mai multe directoare și anume:
o Drawable – imagini și/sau fișiere XML prin care se poate defini o formă sau
culoare
o Layout – fișiere XML care definesc interfața grafică
o Menu – fișier XML care definesc afișaju l meniului unei aplicații
o Mimap – iconițe folosite în aplicație
o Values – fișier XML prin care se pot personaliza diferite ele din aplicație. [14]
Structura de proiect Android diferă de această reprezentare aplatizată. Pentru a vedea structura
reală a fișier ului proiectului, selectați Proiect d in meniul derulant Proiect (în F igura 2.1, este afișat ca
Android).
De asemenea, se poate personaliza vizualizarea fișierelor de proiect pentru a vă concentra
asupra anumitor aspecte ale dezvoltării aplicației. De exemp lu, selectarea vizualizării Probleme din
proiect afișează linkuri către fișierele sursă care conțin erori recunoscute de codificare și sintaxă, cum
ar fi o etichetă de închidere a elementului XML care lipsește într -un fișier de aspect , aspect prezentat
în Figura 2.2 .[13]

18

Figura 2. 2 – Fișierele proiectului din vizualizarea „Probleme”, care prezintă un fișier de aspect cu o
problemă [13]
2.2.2 Interfața cu utilizatorul
Fereastra principală Android Studio este alcătuită din mai multe zon e logice care pot fi
identificate în figura 2.3. Principalele elemente sunt:
1. The Editor – este fereastra care conține fișierele care trebuie editate, aici se pot edita toate
fișierele din întreaga aplicație
2. Editor Tabs – fișierele deschise pentru a fi edit ate
3. The Gutter – este folosit pentru a transmite informații despre codul aplicației
4. The Marker Bar – este utilizată pentru a indica locația liniilor importante din fișierele sursă
5. Tool Buttons – corespund multor ferestre de instrumente
6. The Main Menu Bar – executarea oricărei acțiuni prin navigarea prin meniurile și
submeniurile aplicației
7. The Toolbar – este folosit pentru utilizarea frecventă a diverselor operații asupra textului și
anume „Copiere”, „Lipire”, „Decupare” etc.
8. The Navigation Bar – este folosi tă pentru navigarea în activitățile proiectului fără a fie nevoie
de folosirea frecventă a proiectului.
9. The Status Bar – afișează feedback -ul relevant și contextual, cum ar fi informații despre orice
proces care rulează
10. The Project Tool Window – este folos ită pentru vizualizarea și navigarea în toate fișierele din
proiect

Figura 2. 3– Mediul de dezvoltare integrat Android Studio [12]

19
Se poate organiza fereastra principală pentru a oferi mai mult spațiu pe ecran prin ascunderea
sau eliminarea bărilor de instrumente și a ferestrelor de instrumente. De asemenea, se pot utiliza
scurtături de la tastatură pentru a accesa majoritatea funcțiilor IDE.
În orice moment, se poate căuta codul sursă, bazele de date, acțiunile, elementele inter feței
utilizator etc., apăsând de două ori tasta Shift sau dând click pe lupa din colțul din dreapta sus al
ferestrei aplicației Android Studio. Acest lucru poate fi foarte util dacă, de exemplu, se încearcă o
localizare a unei anumite acțiuni IDE pen tru care s-a uitat declanșarea. [12]
2.3 OCR
Recunoașterea optică a caracterelor (de asemenea, cititorul de caractere optice, OCR)
reprezintă conversia mecanică sau electronică a imaginilor cu text tipărit, scris de mână sau text
printat în text codat mecanic, fie d intr-un document scanat, fie dintr -un documentar, dintr -o fotografie
(de exemplu textul de pe indicatoare și panouri publicitare) sau din subtitrarea suprapusă pe o imagine
(de exemplu, dintr -o emisiune de televiziune). Este utilizat pe scară largă ca form ă de introducere a
informațiilor din înregistrările de pe hârtie, documente pașaport, facturi, extrase bancare, chitanțe
computerizate, cărți de vizită, corespondență sau orice documentație adecvată. Este o metodă
obișnuită de digitizare a textelor tipărit e, astfel încât acestea să poată fi editate, căutate, stocate mai
compact, afișate on -line și folosite în procesele de mașină, cum ar fi computerele cognitive, traducerea
automată, extragerea textului în vorbire, datele cheie și exploatarea textului. OCR e ste un domeniu
de cercetare în domeniul recunoașterii de modele, a inteligenței artificiale și a viziunii pe calculator.
Versiunile anterioare trebuiau să fie instruite cu imagini ale fiecărui caracter și au lucrat la un
singur font la un moment dat. Siste mele avansate capabile să aibe un grad ridicat de precizie a
recunoașterii pentru majoritatea fonturilor sunt acum comune și cu suport pentru o varietate de intrări
în format de fișiere digitale. Unele sisteme sunt capabile să reproducă o ieșire formatată care se
apropie aproximativ de pagina originală, inclusiv imagini, coloane și alte componente non -textuale.
2.3.1 Istorie
În 1914, Emanuel Goldberg a dezvoltat o mașină care citea caractere și le transforma în cod
telegrafic standard. În același timp, Edmund Fou rnier d'Albe a dezvoltat Optophone, un scaner
portabil, care atunci când a fost mutat pe o pagină tipărită, a produs tonuri care corespundeau literelor
sau caracterelor specifice.
La sfârșitul anilor 1920 și în anii 1930, Emanuel Goldberg a dezvoltat ceea ce el a numit o
"mașină stati stică" pentru căutarea în arhivele microfilmelor folosind un sistem de recunoaștere a
codurilor optice. În 1931 i -a fost acordat brevetul SUA nr. 1.838.389 pentru invenție. Brevetul a fost
achiziționat de IBM.
Odată cu apariți a telefoanelor inteligente și a obiectelor inteligente, OCR poate fi utilizat în
aplicațiile dispozitivelor mobile conectate la internet care extrag textul capturat utilizând camera
aparatului. Aceste dispozitive care nu au funcționalități OCR integrate în sistemul de operare vor
utiliza în mod obișnuit OCR API pentru a extrage textul din fișierul imagine capturat și furnizat de
dispozitiv. OCR API returnează textul extras, împreună cu informații despre locația textului detectat
în imaginea originală înapoi în aplicația dispozitivului pentru prelucrare ulterioară (cum ar fi textul
în vorbire) sau afișare.
Sunt disponibile sisteme OCR comerciale și open source pentru cele mai frecvente sisteme de
scriere, inclusiv caractere latine, chirilice, arabe, ebraice, indie, bengaleze, devanagari, tamil, chineze,
japoneze și coreene.

20
2.3.2 Aplicații
Motoarele OCR au fost dezvoltate în numeroase tipuri de aplicații OCR specifice domeniului,
cum ar fi OCR de primire, facturare OCR, verificare OCR, document legal de facturare OC R.
Acestea pot fi utilizate pentru:
• Introducerea datelor pentru documente comerciale, de ex. pașaport, factură, extras
bancar și chitanță
• Recunoașterea automată a plăcuței de înmatriculare
• Extragerea automată a informațiilor din documentele de asigurare
• Extragerea informațiilor din cartea de vizită într -o listă de contacte
• Realizarea mai rapidă de versiuni textuale ale documentelor tipărite, de ex. Carte
scanată pentru Proiectul Gutenberg
• Realizarea de imagini electronice ale documentelor imprimate căutate , de ex. Cărți
Google
• Convertirea scrierii de mână în timp real pentru a controla un calculator (calculul pen –
ului)
• Tehnologie de asistență pentru utilizatorii nevăzători și cu deficiențe de vedere

2.3.3 Tipuri
• Caracteristica optică de recunoaștere a caracterel or (OCR) – vizează textul scris, un
glif sau un caracter la un moment dat.
• Recunoașterea cuvintelor optice – vizează textul scris, un cuvânt la un moment dat
(pentru limbile care utilizează un spațiu ca divizor de cuvinte). (De obicei, se numește
"OCR".)
• Recunoaștere inteligentă a caracterelor (ICR) – vizează, de asemenea, textul scris de
mână sau un text cursiv, un glif sau un caracter la un moment dat, de obicei implicând
învățarea mașină.
• Recunoaștere inteligentă a cuvintelor (IWR) – vizează, de asemenea , textul scris de
mână sau un text cursiv, câte un cuvânt în același timp. Acest lucru este util în special
pentru limbile în care ghilimele nu sunt separate în script -ul cursiv.
OCR este, în general, un proces "offline", care analizează un document static . Analiza mișcării
scrierii de mână poate fi utilizată ca intrare pentru recunoașterea scrierii de mână. În loc să folosească
doar formele glifurilor și ale cuvintelor, această tehnică este capabilă să surprindă mișcări, cum ar fi
ordinea în care sunt dese nate segmentele, direcția și modul în care se pune stiloul jos și momentul în
care se ridica. Aceste informații suplimentare pot face procesul de la capăt la sfârșit mai precis.
Această tehnologie este, de asemenea, cunoscută sub numele de recunoașterea ca racterelor on -line,
recunoașterea dinamică a caracterelor, recunoașterea în timp real a caracterelor și recunoașterea
inteligentă a caracterelor. [15]
2.4 Tesseract
Tesseract este o mașină optic ă de recunoaștere a caracterelor pentru diferite sisteme de
operare . Este un software gratuit, lansat sub licența Apache, versiunea 2.0, iar dezvoltarea a fost
sponsorizată de Google începând cu 2006. În acest an , Tesseract a fost considerat una dintre cele mai
exacte mașini OCR open source disponibile .

21
2.4.1 Caracteristici
Tesseract a fost printre primele trei mașini OCR în ceea ce privește precizia caracterului în
1995. Este disponibil pentru sistemele de operare Linux, Windows și Mac OS X, totuși, datorită
faptului ca are resurse limitate, acesta este testat în mod riguros de către dezvoltatori Windows și
Ubuntu.
Tesseract inclusiv și versiunea 2 ar putea accepta numai imagini TIFF cu text organizat pe o
coloană ca intrări. V ersiuni le anterioare nu au inclus analiza layout -ului și, prin urmare, introducerea
textului pe mai mu lte coloane , a imaginilor sau a ecuațiilor a generat o ieșire eronată. Suportul pentru
o serie de formate noi pentru imagine a fost adăugat folosind biblioteca Leptonica. Tesseract poate
detecta dacă textul este monospațiat sau distanțat proporțional.
Vers iunile inițiale ale Tesseract putea recunoaște numai textul în limba engleză. Cea de -a doua
variantă a adăugat alte șase limbi occidentale (franceză, italiană, germană, spaniolă, portugheză
braziliană, olandeză). Versiunea 3 extinde recunoașterea altor lim baje pentru a include limbile
ideografice (chineză și japoneză) și cele de la dreapta la stânga (de ex., Arabă, ebraică), precum și
multe alte scripturi.
Rezultatul Tesseract va avea o calitate slabă dacă imaginile de intrare nu sunt pre procesate
pentru a se potrivi: i maginile (în special capturile de ecran) trebuie să fie scal ate astfel încât textul pe
înălțime să fie de cel puțin 20 de pixeli, orice rotire sau înclinare trebuie corectată sau nu va fi
recunoscut niciun text, schimbările de joasă frecvență în luminozitate trebuie să fie filtrate pentru că
etapa de binarizare a Tesseract va distruge o mare parte a paginii, iar marginile întunecate trebuie
îndepărtate manual sau vor fi interpretate greșit ca fiind caractere. [16]
2.5 SQLite
Sqlite este un sistem de management al bazelor de date r elaționale, ușor de întreținut,
persona lizat, încorporat, ușor de utilizat , bazat pe tranzacții, bazat pe SQL. Stochează o întreagă bază
de date într -un singur fișier nativ care conține toate tabelele și indexurile. Organize ază toate tabelele
în arbori B+ și indici i în arbori B separați. Susține proprietățile de tranzacționare de bază, și anume,
atomicitatea, consistența, izolarea și durabilitatea.
Sqlite suportă un subset mare de caracteristici ANSI SQL -92 și multe comenzi specifice
pentru SQL. În plus, acesta oferă un cadru bun în care se pot defini funcții SQL personalizate,
agregatoare și secvențe de colaț ionare. Este sprijinit , de asemenea, atât de codarea bazată pe standarde
UTF -8 și UTF -16 pentru textele Unicode.
Sqlit e este complet dezvoltat folo sind limbajul de programare ANSI C. Este o RDBMS bazată
pe SQL, ușor de întreținut, relativ rapid ă. Are urm ătoarele caracteristici lăudabile:
• Zero -configurație – nu este nevoie de executarea de pași separați de instalare sau de
configurare pentru inițializarea software -ului SQL înainte de utilizarea lui. Nu există
pași specifici după rularea SQLite. Bazele de date nu au nevoie de o administrare.
• Încorporabil – nu este nevoie de un proces de server separat dedicat SQLite. Librări a
SQLite este încorporată în aplicațiile în care se utilizează. Acestea nu necesită
includerea unor scheme de comunicare între procese pentru interacțiunea cu SQLite.
• Interfață de aplicație unică – SQLite oferă un mediu SQL pentru aplicațiile în C pentru
manipularea bazelor de date. Nu există pre -procesare specială și cerințe de compilare
pentru aplicații.

22
• Suport tranzacțional – SQLite suportă proprietățile principale ale tranzacțiilor ACID
și anume atomicitatea, consistență, izolare si durabilitate
• Persona lizare – SQLite oferă un cadru bun pentru definire și utilizare de funcții
personalizate specifice SQL, funcții agregate și secvențe de colaționare
• Unicode – SQLite suportă UTF -8 și UTF -16 bazate pe standarde pentru textele
Unicode.
• Protecție împotriva pie rderilor de memorie – Dacă aplicațiile respectă protocoalele
recomandate de interacțiune cu biblioteca SQLite strict , biblioteca este susținută de
faptul că nu pierde niciodată memorie .
Sqlite este diferit de majoritatea celorlalte DBMS -uri care suportă SQL, în sensul că obiectivul
său primar de proiectare este să fie simplu. Echipa de dezvoltare SQLite crede în filozofia KISS:
păstrarea simplă și splendidă. Aceștia se străduiesc să păstreze SQL ite simplu chiar dacă duce la
implementări ocazionale ineficien te ale uno r caracteristici. În esență, SQL ite este :
• Simplu de administrat
• Simplu de operat
• Simplu de încorporat în aplicațiile C
• Simplu de menținut
• Simplu de personalizat
• Simplu înseamnă implementarea propietăților tranzacționale ACID [17]
Acesta este un m otor de baze de date SQL încorporat. Spre deosebire de cele mai multe baze
de date SQL, SQLite nu are un proces pentru server separat. SQLite citește și scrie direct în fișierele
comune de pe disc. O bază de date completă SQL cu mai multe tabele, indici, d eclanșatori și
vizualizări este conținută într -un singur fișier de pe disc. Formatul de fișier de baze de date este cross –
platform – se poate copia în mod liber baza de date între sistemele pe 32 de biți și pe 64 de biți sau
între arhitecturile big -endian și little -endian. Aceste caracteristici fac din SQLite o alegere populară
ca format de fișier de aplicație. Acesta este gândit nu ca înlocuitor pentru Oracle, ci ca înlocuitor
pentru fopen().
SQLite este o bibliotecă compactă. Cu toate funcțiile activate, dimensiunea biblio tecii poate
fi mai mică de 500K B, în funcție de platforma țintă și de setările de optimizare ale compilatorului.
(Codul pe 64 de biți este mai mare și unele optimizări ale compilatoarelor, cum ar fi inscripționarea
agresivă a funcțiilor ș i derularea buclelor, pot determina un cod mult mai mare.) În cazul în care
caracteristicile opționale sunt omise, dimensiunea bibliotecii SQLite poate fi redusă sub 300K B.
SQLite poate fi făcut și pentru a ru la în spațiu minim de stivă (4K B), făcând SQLit e o alegere populară
pentru motoare de baze de date pe dispozitive cu limitare de memorie, cum ar fi telefoanele mobile,
PDA -urile și playerele MP3. Există un compromis între utilizarea memoriei și viteza. SQLite, în
general, rulează mai repede cu cât i se dă mai multă memorie. Cu toate acestea, performanța este de
obicei destul de bună chiar și în medii cu memorie redusă.
SQLite este foarte atent testat înainte de fiecare lansare și are o reputație de a fi foarte fiabil.
Cea mai mare parte a codului sursă SQLite este dedicat exclusiv testelor și verificărilor. O suită de
testare automată rulează milioane și milioane de cazuri de testare care implică sute de milioane de
instrucțiuni SQL individuale și atinge o acoperire de 100% a testelor de ramură. SQLite r ăspunde în
mod deosebit la eșecurile de alocare a memoriei și la erorile de intrare / ieșire pe disc. Tranzacțiile
sunt ACID chiar dacă sunt întrerupte de căderi ale sistemului sau de defecțiuni de alimentare. Toate
acestea sunt verificate de testele autom ate folosind echipamente de testare speciale care simulează
defecțiunile sistemului. Desigur, chiar și cu toate aceste teste, există încă bug -uri. Dar, spre deosebire

23
de unele proiecte similare (în special concurenții comerciali), SQLite este deschis și bu n pentru toate
bug-urile și oferă liste de bug -uri și cronologii minute de minut ale schimbărilor de cod.
Baza de cod SQLite este susținută de o echipă internațională de dezvoltatori care lucrează pe
SQLite. Dezvoltatorii continuă să extindă capabilitățile SQLite și să -i sporească fiabilitatea și
performanța, menținând în același timp compatibilitatea cu specificațiile interfeței publicate, cu
sintaxa SQL și cu formatul de fișier de bază de date. Codul sursă este absolut gratuit pentru oricine
dorește să îl folosească , dar este disponibil și suport profesional.
Proiectul SQLite a fost lansat pe data de 09.05.2000 . Viitorul este întotdeauna greu de prezis,
dar intenția dezvoltatorilor este să susțină SQLite până în anul 2050. Deciziile de proiectare sunt luat e
în considerare cu acest scop. [18]

24

25
3. Implementare

3.1 Interfața de utilizare

3.1.1 Organigramă
Organigrama următoare reprezintă organizarea completă a aplicației realiz ate, prin
prezentarea structurii activităților executate în program . Nodurile sunt re prezentate de activități le
aplicației, iar linii sunt reprezentate de relațiile dintre ele. Aceasta este prezentată în Figura 3.1.

Figura 3. 1– Organigrama aplicației
3.1.2 Selecția elementelor
Pentru interfața apli cațiilor Android este folosită clasa View, această clasă reprezintă
elementul de bază pentru componentele interfeței utilizator. Un View ocupă o zonă dreptunghiulară
pe ecran și este responsabilă de reprezentarea și de manipularea evenimentelor. View este clasa de

26
bază pentru widget -uri, care sunt folosite pentru a crea componente interactive ale interfeței utile
(butoane, câmpuri de text etc.). Subclasa ViewGroup este clasa de bază pentru machete, care sunt
conținuturi invizibile care dețin alte elemente View (sau alte elemente ViewGroups ) și definesc
proprietățile lor de aspect. În figura 3.2 este prezentată ierarhia folosită pentru definirea interfeței
Android.

Figura 3. 2- Ierarhie View [19]
Toate view-urile dintr -o fereastră sunt aranjate într -o singură ierarhie . Se pot adăuga view-uri
fie din cod, f ie prin specificarea unei ierarhii a vizualizărilor în unul sau mai multe fișiere de aspect
XML. Există mai multe subclase de view care controlează sau sunt capabile să afișeze tex t, imagini
sau alte tipuri de conținut.
Odată cu crearea unei ierarhii de vizualizări, există în mod tipic câteva tipuri de operații
comun e care se pot efectua :
• Setarea proprietăților: de exemplu, setarea textului unui TextView . Proprietățile
disponibile ș i metodele care stabilesc aceste proprietăți vor varia în funcție de diferitele
subclase de vizualizări. Proprietățile cunoscute la momentul construirii pot fi setate în
fișierele de aspect XML.
• Setarea focalizării: Cadrul va gestiona focalizarea în mișcar e ca răspuns la intrarea
utilizatorului. Pentru a forța focalizarea la o vizualizare specifică, se poate apela
requestFocus ().
• Setarea de listeners : Vizualizările permit clienților să stabilească listener , prin care vor
fi anunțați când se întâmplă ceva. De exemplu, toate vizualizările pot permite setarea
unui listener care să fie notificat atunci când vizualizarea începe sau se sfârșește
focalizarea. Se poate înregistra astfel de listener folosind setOnFocusChangeListener
(android.view.View.OnFocusChangeL istener).
• Setarea vizibilității: se pot ascunde sau afișa vizualizări utilizând setVisibility (int). [20]
Toate elementele folosite pentru descrierea activității pentru interfață sunt definite cu ajutorul
unui Layout , care este exprimat folosind un fișier .xml. Exi stă 4 tipuri de layout -uri:
• FrameLayout : folosit pentru a bloca o zonă de pe ecran pentru afișarea unui singur
element. În general, ar trebui să fie folosit pentru a avea o vizualizare unică a copilului,
deoarece poate fi dificil să se organizeze vizionările copilului într -un mod care să fie

27
scalabil pentru diferite dimensiu ni ale ecranului, fără ca copii să se suprapună. Cu toate
acestea, se pot adăuga mai mulți copii într -un FrameLayout și se pot controla pozițiile
lor în cadrul FrameLayout atribuind nivelul corespunzător al gravitației fiecărui copil,
utilizând atributul android: layout_gravity .
• LinearLayout : folosit pentru aranjarea elementelor fie orizontal într -o singură linie, fie
vertical într -o singură coloană . Pentru a controla modul în ca re se aliniază elementele
se setează un anumit atribut, anume gravity .
• TableLayout : folosit pentru aranjarea elementelor pe rânduri și coloane. Acesta constă
într-un număr de obiecte TableRow , fiecare definind un rând. Liniile de frontieră
pentru rânduri, coloane sau celule.
• RelativeLayout : folosit pentru aranjarea elementelor în raport unul cu celălalt sau în
raport cu părintele său. [21]
La deschiderea aplicației utilizatorul trebuie să își introducă valoarea glicemiei, această
componentă este reprezentată de un EditText , folosit pentru introducerea valorii respective în baza de
date. Același element este folosit și pentru introducerea programului de medicamentație sau pentru
modificarea valorii obținute în urma recunoașterii imaginii ecranului glucometrulu i.
Referirea acestor elemente în codul Java se face folosind metoda
findViewById(R.id.nume_EditText) . R este un fișier care se află în interiorul folderului, dar care nu
poate fii modificat.
În cadrul acestui element trebuie declarat atributul inputType , acesta configurează tipul de
tastatura afișată, caracterele acceptabile sau modul de afișare a textului de editare. Spre exemplu daca
avem nevoie de introducerea unui cod PIN, putem alege tipul de intrare numericPassword , acesta are
rolul de ascunderea cara cterelor introduse și de acceptare numai a numerelor.
Pentru afișare unui grafic al valorilor glicemiei este folosit elementul GraphView , aceasta
fiind o bibliotecă pentru Android folosită pentru a programa grafice mai ușor. Pentru umplerea
graficului cu d ate este folosită clasa Series . O serie conține punctele de date ale unei "linii", care poate
fi reprezentată ca linie, puncte sau bare. Graficele simple au doar o serie, dar puteți adăuga mai multe
serii la GraphView . Există mai multe subclase ale clasei Series , care reprezintă moduri diferite de
reprezentare a graficului: LineGraphSeries, PointsGraphSeries, BarGraphSeries .
Pentru generarea unor regimuri alimentare în cadrul activității Meniu sunt prezentate câteva
sfaturi pentru un regim alimentar potrivi t fiecărei persoane în interiorul unui element de tip TextView,
iar cu ajutorul unui Button se generează idei de regimuri pe care utilizatorul le poate încerca. Pentru
acestea a fost creată o clasă Java Meniuri în care a fost creat un vector care conține r egimurile
alimentare propuse și o funcție care r ealizează trecerea la următoare propunere. În clasa Meniu au
fost realizate referirile la elementele folosite în fișierul XML și creată funcția genMeniu() care
realizează trecerea la următorul regim propus cu ajutorul funcției create în clasa Meniuri.
3.1.3 Selecția butoanelor
În cadrul aplicației s -au folosit butoane ale căror funcționalități au fost fie de introducere a
valorilor glicemiei și a programului de medicamentație , fie de reprezentare a graficelor, fie d e afișare
a valorilor din baza de date, astfel reprezentând și o metodă de comunicare cu baza de date în care
sunt salvate valorile. Aceste componente sunt reprezentate cu ajutorul elementul ui Button . Referirea
acestui element în codul Java se face prin ap elarea metodei findViewById(R.id.nume_buton).
Funcționalitatea fiecărui buton este declarată prin adăugarea de evenimente fie în interiorul
fișierului .xml, fie în codul Java. Pentru primul caz în interiorul elementului Button este declarat

28
atributul onCli ck. Valoarea acestui atribut este numele unei metode apelate ca răspuns al
evenimentului de click. Metoda trebuie să fie descrisă în interiorul activității corespunzătoare
butonului. În cel de -al doilea caz în interiorul codului Java este descrisă o metodă
nume_buton.setOnClickListener(new View.OnClickListener) în interiorul căreia se descrie
funcționalitatea după ce se apasă pe el. Această metodă este cea care realizează conexiunea dintre
listener cu butonul . Ca rezultat, sistemul execută codul care este s cris în funcția onClick (View) după
ce utilizatorul apasă butonul. Fiecare buton este proiectat folosind fundalul butonului implicit al
sistemului, care este adesea diferit de la o versiune a platformei la alta . Stilul implicit al butonului
poate fi person alizat, prin modificarea anumitor proprietăți a acestuia.
3.1.4 Selecția meniului
Pentru a putea selecta posibilitățile de acțiune ale aplicației a fost folosit clasa Menu . În mod
implicit fiecare activitate acceptă un meniu de opțiuni de acțiuni sau de opțiuni. Astfel se pot adăuga
elemente în acest meniu și putând fi selectate apăsând pe ele. Cea mai ușoară modalitate de a adăuga
elemente în meniu este încărcarea unui fișier XML în fișierul Menu prin intermediul MenuInflater .
Cea mai ușoară modalitate de a ataș a cod la apăsare este prin funcția OptionsItemSelected (MenuItem)
și prin ContextItemSelected (MenuItem) .
Există diferite tipuri de meniu care acceptă caracteristici diferite:
• Meniurile de context: Nu acceptă comenzile rapide și pictogramele de elemente.
• Meniurile de opțiuni: Meniurile de pictograme nu acceptă marcajele de verificare a
elementelor și prezintă numai titlul condensat al elementului. Meniurile extinse
(disponibile numai dacă sunt vizibile șase sau mai multe elemente de meniu, atinse
prin inter mediul elementului "Mai mult" din meniul de pictograme) nu afișează
pictogramele de elemente.
• Submeniuri: Nu acceptă pictogramele de elemente sau submeniurile imbricate. [22]
Pentru toate tipurile de meniuri, Android oferă un format XML standard pentru a de fini
elementele de meniu. În loc ul construirii unui meniu în codul activității principale , trebuie definit un
meniu și toate elementele sale într -o resursă de meniu XML.
Folosirea unor resurse pentru meniu este recomandată din câteva motive:
• Vizualizarea m ai simplă a structurii de meniuri în XML.
• Separarea conținutul ui pentru meniu de codul de funcționare al aplicației.
• Permite crearea de configurații de meniuri alternative pentru diferite versiuni de
platformă, dimensiuni ale ecranului și alte configurații prin utilizarea arhitecturii de
resurse al aplicației. [22]
În fișierul Java este declarată funcția OptionsItemSelected(MenuItem) prin intermediul căreia
este declarat valoarea id care obține id-ul opțiunilor din Menu , iar în momentul apăsării este compara t
id-ul declarat cu cel al opțiuni și este deschisă activitatea corespunzătoare . Pentru deschiderea unei
activități se folosește un element din clasa Intent care reprezintă o descriere abstractă a operației care
trebuie realizată. Este folosită funcția startActivity(nume_intent) pentru a începe activitatea
corespunzătoare.

29
3.2 Implementare OCR

3.2.1 Descriere
Pentru recunoașterea cifrelor de pe ecranul glucometrului a fost folosită recunoașterea optică
a caracterelor, implementată cu ajutorul software -ului Tesserac t. În fișierul XML au fost adăugate
elementele EditText în care va apărea valoarea recunoscută, care poate fi modificată în cazul în care
recunoașterea nu este corectă și două butoane pentru pornirea camerei și pentru salvarea valorii
recunoscute.
În codul Java a u fost create mai multe metode, printre care onCreate() pentru referirea la
elementele din fișierul XML si setarea acțiunilor asupra butoanelor. În această funcție este apelată si
metoda prin care este obținută permisiunea pentru scrierea și citirea din memoria dispozitivului. O
altă funcție este startCameraActivity() în care este realizată pornirea camerei și salvarea pozei
realizate în aplicație în fișierul specificat , care dacă nu există este creat prin intermediul liniei de
comandă mkdir . Tot în această funcție este salvată poza realizată la calea specificată prin intermediul
variabilei imageFilePath.
Pentru afișare unor mesaje de eroare în cazul în care aplicația nu funcționează corespunzător,
dar și pentru recunoașterea propriu -zisă a datelor a fost creată metoda onActivityResult( int
requestCode, int resultCode, Intent data ). Aceasta presupune verificarea lui requestCode pentru a fi
egal cu valoarea folosită în funcția prezentată mai sus, urmând ca și resultCode să fie verificat și el.
În cazul în care imaginea este acceptată se trece la recunoașterea datelor, pe când în cazul respingerii
imaginii vor fi afișate mesaje pentru acest lucru.
Pentru pregătirea fișierului necesar pentru recunoaștere a fost implementată funcția
prepareTessData() în ca re este citit din fișierul aplicației documentul de antrenare pentru
recunoaștere. Este nevoie de variabile de tipul InputStream și OutputStream, care sunt clase abstracte,
reprezentând fluxuri de intrare și de ieșire de octeți. Metoda write(byte[], int, i nt) este folosită pentru
scriere a biților în fluxul biților de ieșire. Ambele fluxuri de date sunt închise și eliberate resursele
asociate cu ele prin intermediul funcției close() . O altă metodă creată a fost pentru citirea imaginii
realizate și pentru set area textului recunoscut în EditText. În cadrul acestei funcții este setată prin
intermediul clasei BitmapFactory.Options calitatea imaginii realizate prin intermediul câmpului
inSampleSize și realizează decodarea căii specificate într -un fișier bitmap. A ceasta apelează la rândul
ei funcția getText(), care practic realizează recunoașterea textului. Este folosită clasa tessBaseAPI,
care pentru început este inițializată cu fișierul de antrenare prin tessBaseAPI.init , urmând să fie
folosită imaginea rezultată mai sus prin tessBaseAPI.setImage(bitmap). Este returnat un String prin
intermediul clasei tessBaseAPI.getUTF8text() care realizează recunoaștere textului din imaginea
realizată
În plus există o funcție de obținere a permisiunilor p entru scrierea și citir ea de pe cardul
dispozitivului pe care este ins talată aplicația anume onRequestPermissionResult care este conectată
cu metoda onCreate(). Este realizat un switch(requestCode) prin intermediul căruia se știe de ce
permisiune este nevoie și este setat un mes aj corespunzător pentru fiecare permisiune în parte.
3.2.2 Schemă bloc
Aceasta schemă bloc reprezintă stabilirea algoritmului, prin prezentarea pașilor succesivi de
rezolvarea a problemei de recu noaștere optică a caracterelor, de la rularea aplicației și până la afișarea
unui rezultat.

30

Figura 3. 3– Schemă bloc OCR
3.3 Implementare alarmă
În cadrul acestei activități au fost folosite elemente de tipul EditText , pentru introducerea
titlului și al mesajului fiecărei alarme, elemente de tipul Button pentru selectarea datei și a orei de
pornire a alarmei, dar și de salvare a alarmei și elemente de tipul TextView pentru afișarea valorilor
selectate. În plus au fost folosite elemente de tipul DatePicker și TimePicker pentru afișa rea unui
calendar folosit pentru selectarea datei și a unui ceas pentru selectarea orei, aceste elemente au
atributul visibility setat invisible pentru a nu apărea pe ecranul activității.
În codul Java referirea tuturor elementelor folosite se face cu func ția
findViewById(R.id.nume_element). Pentru crearea alarmei propriu -zise a fost realizată funcția
serviciu() în care s -a declarat tipul alarmei, cu ajutorul AlarmManager . Această clasă oferă acces la
serviciile de alarmă a le sistemului. Acestea permit ca programarea cererii dvs. să fie rulată la un
moment dat în viitor . Atunci când o alarmă se oprește , Intent care a fost înregistrat pentru aceasta în
sistem, pornește automat aplicația țintă dacă nu se execută deja. Alarmele înregistrate sunt reținute în
timp ce dispozitivul nu este folosit (și poate activa opțional dispozitivul dacă se oprește în timpul
respectiv), dar va fi șters dacă este oprit și repornit.
AlarmManager presupune o blocare a CPU, atâta timp cât este executată metoda receptorului
de alarmă onReceive () . Acest lucru garantează că telefonul nu se va opri până când nu ați terminat
de manevrat difuzarea. Odată ce onReceive() returnează valoarea corectă, AlarmManager eliberează
această blocare pentru alarmă. Aceasta înseamnă că, în unele cazuri, t elefonul se va opri de îndată ce

31
metoda onReceive () va fi terminată. Dacă receptorul dvs. de alarmă numit Context.startService () ,
este posibil ca telefonul să se oprească înainte de lansarea serviciului solicitat. Pentru a preveni acest
lucru, serviciul BroadcastReceiver și Service vor trebui să implementeze o politică separată de
blocare a trezirii pentru a vă asigura că telefonul continuă să fie difuzat până când serviciul devine
disponibil.
Pentru butonul de salvare a alarmei a fost realizată funcția completare() care în momentul în
care a fost apăsat face ca toate datele introduse până atunci să fie șterse pentru a putea introduce altele
dacă se dorește. Există funcții pentru deschiderea DatePicker și TimePicker atunci când sunt apăsate
butoanele de se lectare a dății și a orelor.
Pentru afișarea dății curente și a orei curente au fost realizate funcțiile
setCurrentDateOnView() și setCurrentTimeOnView() , care se folosesc de clasa Calendar pentru
obținerea datelor corecte. Aceste funcții sunt apelate în momentul în care sunt apăsate butoanele de
selectare de dată și oră, la deschiderea DataPicker și TimePicker. Acest lucru este realizat cu ajutorul
unui Dialog, care creează o fereastră care apare peste activitatea curentă.
Pentru recepția alarmei a fost c reată clasa MyAlarmReceiver care conține metoda onReceive()
pentru posibilitatea executării alarmei. Aceasta realizează o interogare asupra bazei de date în care au
fost salvate datele necesare pornirii alarmei. Pentru anunțarea momentului de pornire a ala rmei a fost
folosit metoda triggerNotification() , care returnează o notificare conținând datele introduse pentru
fiecare alarmă, anume titlu și mesajul corespunzător.
A fost creată funcția MyTestService() care este o clasă extinsă a IntentService , aceasta
reprezentând o clasă de bază pentru serviciile dorite și care gestionează solicitări le asincrone
(exprimate ca intenții) la cerere. Clienții trimit solicit ări prin apelurile startService(Intent) . Serviciul
este pornit când este necesar, se ocupă d e fiecare intenție la rândul ei , folosind un fir de lucru și se
oprește atunci când termină ce avea de făcut .
Pentru conexiunea cu baza de date în care au fost salvate alarmele a fost creată clasa
BazaDeDateAlarme în care se creează tabelul care conține toate datel e pe care le introducem în
activitatea alarmei. Astfel acestea sunt folositoare pentru a putea crea alarma propriu -zisă.
3.4 Implementare baza de date SQLite
S-a folosit baza de date SQLite pentru salvarea glicemiei, a programului de medicamentație
și pentru salvarea alarmelor . Astfel au fost create clase separate pentru fiecare bază de date folosită.
Toate clasele conțin funcția onCreate(SQLiteDatabase) care realizează tabelul în care se salvează
valorile pe care le introducem în activitatea corespunzătoare p rin linia de comanda CREATE TABLE
NUME_TABEL NUME_ATRIBUTE și funcția onUpgrade() care realizează actualizarea bazei de date
prin ștergerea tabelului existent.
În plus pentru fiecare bază de date au fost create funcții folositoare pentru activitatea
coresp unzătoare, astfel pentru clasa BazaDeDate, baza de date pentru glicemie a fost creată funcția
adaugaInfo() în care se realizează umplerea tabelului creat cu datele necesare prin comanda insert.
Pentru vizualizarea datelor din tabel a fost creată metoda obtinereDate(), realizată prin intermediul
comenzii SELECT * FROM NUME_TABEL . Aceleași funcții au fost create si în clasa
BazaDeDateMedicamentatie, baza de date pentru programul de medicamentație , în plus a fost creată
funcția de ștergere a unei înregistrări din tabel. Pentru clasa BazaDeDateAlarme care folosește
aceleași funcții ca la celelalte, de creare a tabelului și de actualizare a bazei de date.
Pentru vizualizarea bazelor de date, sunt necesare anumite linii de comandă pentru mutarea
acestora din telef onul pe care este instalată aplicația Android pe calculator, prin intermediul unui

32
instrument instalat pe browser -ul web Mozilla Firefox și anume SQLite Manager . S-a folosit Android
Debug Bridge ( adb), care este un instrument versa til de linie de comandă c are permite comunicarea
cu un dispozitiv (un emulator sau un dispozitiv Android conectat). Comanda adb facilitează o
varietate de acțiuni ale dispozitivului, cum ar fi instalarea și depanarea aplicațiilor, și oferă acces la
un shell Unix pe care îl puteți utiliza pentru a rula o varietate de comenzi pe un dispozitiv. Este un
program client -server care include trei componente:
• Un client, care trimite comenzi . Se poate invoca un client dintr -un terminal de linie de
comandă prin emiterea unei comenzi adb.
• Un d aemon (adbd), care rulează comenzi pe dispozitiv. Daemon -ul funcționează ca un
proces de fundal pe ntru fiecare dispozitiv.
• Un server, care gestionează comunicarea dintre client și daemon. Serverul rulează ca
un proces de fundal pe ntru mașina de dezvoltare.
Au fost folosite următoare comenzi adb:
• Run-as nume_pachet – Execută comenzi pe dispozitiv la fel ca o aplicație (specificată
folosind nume_pachet). Aceasta permite executarea comenzii în ADB, ca în cazul în
care aplicația specificată execută comanda.
• Pull [-a] remote local – Copiază fișiere și directoare pe un dispozitiv. Utilizați
opțiunea -a pentru a păstra marcajul și modul de timp al fișierului.
• Cp [options] <source> <dest> – Copiază fișiere și directoare de la o sursă la destinație
precizată.

33
4. Utilizarea aplicației

4.1 Descrierea aplicației
Aplicația DiabetControl permite utilizatorului să introducă valoarea glicemiei, urmând
realizarea unui grafic, pe care sunt rep rezentate toate valorile salvate până la momentul respectiv
pentru a putea observa mult mai ușor evoluția acesteia. În plus există și posibilitatea vizualizării
valorilor introduse într -o listă prin apăsarea butonului afișare.
Introducerea valorilor se poate face direct sau prin scanarea ecranului unui glucometru și
prelucrarea u nei fotografii în vederea recunoașterii valorii apărute în imagine.
Utilizatorul își poate salva si programul de medicamentație, anume numele medicamentului,
concentrația și perioada în care trebuie luat medicamentul respectiv. Există posibilitatea de crea rea
unei alarme pentru setarea activităților fiecărui utilizatorul: servirea mesei, măsurarea glicemiei,
luarea medicamentelor. Aceasta activitate presupune afișarea unei notificări în care este prezentat
ceea ce trebuie realizat.
În plus există o parte a aplicației în care sunt prezentate câteva sfaturi pentru un regim
alimentar corespunzător, dar există și posibilita te de generare a unor regimuri.
Codul necesar implementării aplicației este adăugat în Anexa 1, acolo putând fi vizualizate
toate funcțiile create pentru rulare.
4.2 Rezultate
Ecranul principal al aplicației în momentul rulării aplicației este prezentat în Figura 4.1 , care
conține un câmp în care se introduce valoarea glicemia, un buton prin apăsarea căruia se salvează
valoarea respectivă într -o bază de date și generează automat un grafic cu toate valorile înregistrare în
acea bază de date și un buton pentru afișarea tuturor valorile înregistrate până la momentul respectiv.

Figura 4. 1– Ecran principal

34
În momentul intr oducerii unei valorii, exemplu 123 si apăsării butonului Salvare această
valoarea a fost salvat ă în baza de date (Figura 4.2) și a fost generat graficul respectiv (Figura
4.3), pe care sunt reprezentate valorile care au fost înregistrate până la momentul r espectiv

Figura 4. 2– Salvare valoare

Figura 4. 3– Generare grafic
Pentru introducerea valorii glicemiei se mai poate realiza și prin recunoașterea ecranului
glucometrului, acest lucru este posibil prin apăsare butonului Scanati ecranul aparatului , moment
în care este deschisă o nouă fereastră din care se poate porni camere si salva valoarea scanată,
aceasta este prezentată în Figura 4. 4.

35

Figura 4. 4– Deschidere activitat e scanare
La apăsarea butonului Pornire camera, este deschisă came ra, se realizează o fotografie ce
urmează a fi prelucrată în veder ea recunoașterii textului. După ce se face poză, apar 2 butoane prin
care se poate respinge sau accepta poza respectivă. Ace stea sunt prezentate în Figura 4.5.

Figura 4. 5– Butoane respingere/acceptare fotografie
La apăsarea butonului Afișare a fost creată și afișată o listă cu va lorile înregistrate până
atunci. Figura 4.6 prezintă valoarea înregist rată anteri or încadrată
.
Figura 4. 6– Afișare valori
Baza de date în care au fost salvate valorile respective și este prezentată în figura 4.7 :

36

Figura 4. 7– Baza de date glicemie
La apăsarea meni ului de opțiuni din dreapta sus se va deschide o listă cu funcțiile pe care le
poate face utilizatorul: salvarea medicamentației într -o bază de date, setarea de alarme și generarea
unor regimuri alimentare, acțiune prezentată în figu ra 4.8 .

Figura 4. 8– Meniu opțiuni

37
Din acest meniu, în momentul selectării opțiunii „Setare alarmă” se deschide o fereastră ,
prezentată în Figura 4.9 , unde se pot introduce titlul, un mesaj, data si ora pentru crearea unei
notificări .

Figura 4. 9– Fereastră Setare alarmă
La apăsarea butonului Selectați data se deschide o fereastră din care se poate selecta data dintr –
un ca lendar, prezentată în Figura 4.10 .

Figura 4. 10– Setare dată
La apăsarea butonul Selectați ora se deschide o fereastră din care se poate selecta ora ,
prezentată în Figura 4.11 .

38

Figura 4. 11– Setare oră
În momentul în care este setată o alarmă, pe ecranul telefonului va apărea o notificare cu titlul
și mesajul setat mai sus, acțiun ea este prezentată în Figura 4.12 .

Figura 4. 12– Notificare
Alarmele setate în această activitate sunt salvate și ele într -o bază de date , ilustrată în Figura

Figura 4. 13– Bază de date alarme

39
Din meniu anterior, în momentul selectării Regimuri se deschide o fereastră , prezentată în
Figura 4. 14 din care se pot genera regimuri alimentare, dar în care se prezintă și câteva sfaturi pentru
un regim sănătos în vederea me nținerii valorii glicemiei normale.

Figura 4. 14– Fereastră Regimuri
La apăsarea butonului Generare regim se vor afișa idei de regimuri alimentare potrivite
persoa nelor diabetice, a cțiunea ilustrată în Figura 4.15

Figura 4. 15– Generare regimuri alimentare
Tot din meniul anterior se mai poate selecta Medicamentatie în care se poate înregistra
programul de medicamentație, introducând denumirea și câteva detalii necesare administrării, anume
concentra ția, perioada în care trebuie administrată etc. Există butonul Salvare care realizează
înregistrarea în baza de date, butonul Afisare care presupune afișarea programului salvat și butonul
Stergere cu ajutorul căruia se pot șterge înregistrările pe care uti lizatorul nu le mai dorește. Această
activitate este reprezentată în Figura 4.16 .

40

Figura 4. 16– Fereastră Medicamentație
În momentul în care se apasă butonul Afisare , se deschide o fereastră , prezentată î n Figura
4.17 în care s unt prezentate toate înregistrările din baza de data a programului de medicamentație.

Figura 4. 17– Afișare medicamente

41
Baza de date a medicamentelo r este prezentată în Figura 4.18

Figura 4. 18– Baza de date medicamente

42

43
Concluzii

Aplica ția dezvoltată este destinată persoanelor care suferă de diabet de tip 2 pentru un control
al acestei afecțiuni. Este dedicată în special persoanelor mai în vârsta deoarece această aplicație este
destul de simpl ă, nefiind nevoie de foarte multe cunoștințe ale sistemului de operare.
Scopul principal al proiectului este managementul corect al diabetului de tip 2 , astfel că pentru
atingerea acestui obiectiv am ales dezvoltarea unei aplicații pentru dispozitivele mob ile cu Android
care permite utilizatorului salvarea valorii glicemiei prin introducere directă sau prin scanarea
ecranului glucometrului , setarea de alarme care anunță momentul când trebuie realizate anumite
activități, sugerarea unor regimuri alimentare, înregistrarea programului de medicamentație și
prezentarea unor grafice ale valorilor înregistrate.
Aplicația are avantajul simplității în special pentru faptul că majoritatea persoanelor care
suferă de această afecțiune sunt de vârstă înaintate.
Am ales s istemul de operare Android pentru că este cea mai răspândită tehnologie pentru
dispozitivele mobile și pentru că este destul de intuitiv în modul de utilizare. Pentru partea de baze
de date am folosit SQLite, fiind cea mai folosită bibliotecă de implementa rea a unui motor de baze
de date, codul acestuia fiind disponibil gratuit, atât pentru scopuri personale cât și pentru scopuri
comerciale.
Principalul obiectiv viitor este îmbunătățirea metodei de recunoaștere optică a textului, în
momentul deschiderii cam erei foto este necesar încadrarea textului pe care îl dorim să fie recunoscut
pentru simplificarea fotografiei realizate, astfel se va evita și apariția unor caractere pe care nu le
dorim în poză. Trebuie creat un fișier de antrenare pentru cifrele care ap ar pe ecranul glucometrului,
acestea având o formă ușor diferită de cifrele obișnuite, fiind destul de ușor confundate cu alte
caractere.
Un alt obiectiv viitor este transmiterea datelor înregistrate de pacient pe o anumită perioadă
de timp unui medic spe cialist , în vederea prelucrării acestora, oferind posibilitatea modificării
programului de medicamentație în funcție de evoluția afecțiunii. Acest obiectiv ar fi de ajutor
pentru momentele în care pacientul nu ar putea ajunge personal la medic.

44

45

Biblio grafie

[1] What is Diabetes?, https://www.niddk.nih.gov/health -information/diabetes/overview/what -is-
diabetes , accesat la data
[2] Dr. Joseph Mercola, One in T hree People Have or Will Get Diabetes… Are you one of them and
don’t even know it?
[3] Diabetes(Type 1 and Type 2), http://www.medicinenet.com/diabetes_mellitus/page2.htm ,
accesat la data
[4] Symptoms & Causes of Diabetes , https://www.niddk.nih.gov/health –
information/diabetes/overview/symptoms -causes , accesat la data
[5] Derek LeRoith, Preve ntion of Type 2 Diabetes From Science to Therapy, Editura Springer
[6] R Graham Barr, MD, MPH; David M. Nathan, MD; Jam es B. Meigs, MD, MPH; Daniel
E.Singer, MD , „Tests of Glycemia for the Diagnosis of Type 2 Diabetes Mellitus ” în Ann Intern
Med, 2002
[7] Sherri Shafer RD , Nutrition and Exercise Interventions for Diabetes
[8] Insulin, Medicines, & Other Diabetes Treatments , https://www.niddk.nih.gov/he alth-
information/diabetes/overview/insulin -medicines -treatments , accesat la data
[9] Plate Method, https://www.niddk.nih.gov/health -information/di abetes/overview/diet -eating –
physical -activity
[10] Android (Operating System), https://en.wikipedia.org/wiki/Android_(operating_system) ,
accesat la data
[11] Android, https://www.engineersgarage.com/articles/what -is-android -introduction , accesat la
data
[12] Adam Gerber, Clifton Craig, Learn Android Studio Buidl Android Apps Quickly and
Effectively, Editura Apress
[13] Meet Android Studio , https://developer.android.com/studio/intro/index.html , accesat la data
[14] Laborator 1 – Introducere(Git + Android Studio), http://android.rosedu.org/2015/laborator -01-
introducere -git-structura -generala -android , accesat la data
[15] Herbert F. Schantz , History of OCR, Optical Character recognition , Editura Recognition
Technologies Users Association
[16] Anthony Kay , „Tesseract: an Open -Source Optical Character Recognition Engine” în Linux
Journal , 2011
[17] Sibsankar Haldar, SQLite database system design and implementation(second edition), Self-
Publishing
[18] Abou t SQLite, https://www.sqlite.org/about.html , accesat la data

46
[19] Building an android application , http://www.skill -guru.com/blog/2011/01/10/building -an-
android -application/ accesat la data
[20] Using Views, https://developer.android.com/reference/android/view/View.html , accesat la data
[21] Kevin Grant, Chris Haseman, Beginning Android Programming Develop and Design, Editura
Peachpit Press
[22] Menu, https://developer.android.com/reference/android/view/Menu.html , accesat la data

47
ANEXA 1

Clasa MainActivity.java
package com.example.balaban.diabetcontrol;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.supp ort.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.jjoe64.graphview.GraphView;
import com.jjoe64.graphview.series.DataPoint;
import com.jjoe64.graphview.series.LineGraphSeries;
public class MainActivity extends AppCompatActivity {
BazaDeDate mBazaDeDate ;
private Button buttonSalvare , buttonAfisare , buttonScanare ;
private EditText editGlicemie;
GraphView graph;
LineGraphSeries<DataPoint> series;
SQLiteDatabase db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout. activity_main );
editGlicemie = (EditText) findViewById(R.id. editGlicemie );
buttonAfisare = (Button) findViewById(R.id. buttonAfisare );
buttonSalvare = (Button) findViewById(R.id. buttonSalvare );
buttonScanare = (Button) findViewById(R.id. buttonScanare );
graph = (GraphView) findViewById(R.id. graph);
graph.getViewport().setScalable( true);
mBazaDeDate = new BazaDeDate( this);
db = mBazaDeDate .getWritableDatabase();
buttonSalvare .setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v) {
String obiectNou = editGlicemie .getText().toString();
if(editGlicemie .length() !=0){
AdaugaInfo(obiectNou);
editGlicemie .setText( "");
} else {
toastMessage( "Trebuie introduse date!" );
}
series = new LineGraphSeries<DataPoint>(obtinereDate());
graph.addSeries( series);
}
});
buttonAfisare .setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity. this, ListaDate. class);
startActivity(intent);
}
});
buttonScanare .setOnClickListener( new View.OnClickListener(){
@Override
public void onClick(View v) {
Intent scanareIntent = new Intent(MainActivity. this, Scanare. class);
MainActivity. this.startActivity(scanareIntent);
}
});
}
private DataPoint[] obtinereDate() {

48
String[] coloane = { "ID", "GLICEMIE" };
Cursor cursor = db.query("management_tabel" , coloane, null, null, null, null,
null);
DataPoint[] dp = new DataPoint[cursor.getCount()];

for(int i=0;i<cursor.getCount();i++)
{
cursor.moveToNext();
dp[i] = new DataPoint(cursor.getInt(0), cursor.getInt(1));
}
return dp;
}
@Override
public boolean onCreateOptionsMenu(Menu menu){
getMenuInflater().inflate(R.menu. main,menu);
return true ;
}
@Override
public boolean onOptionsItemSelected(MenuItem item){
int id = item.getItemId();
if(id == R.id. itemMedicamente )
{
Intent intentMedicamente = new Intent(MainActivity. this, Medicamente. class);
startActivity(intentMedicamente);
return true ;
}
if(id == R .id.itemAlarma )
{
Intent intentalarma = new Intent(MainActivity. this, alarma. class);
startActivity(intentalarma);
return true ;
}
if(id == R.id. itemMeniu )
{
Intent intentmeniuri = new Intent(MainActivity. this, meniu. class);
startActivity(intentmeniuri);
return true ;
}

return true ;
}
public void AdaugaInfo(String obiectNou){
boolean introducereInfo = mBazaDeDate .adaugaInfo(o biectNou);
if (introducereInfo){
toastMessage( "Date introduse cu succes!" );
} else {
toastMessage( "Eroare!" );
}
}
private void toastMessage(String message){
Toast.makeText (this, message, Toast .LENGTH_SHORT ).show();}}
Clasa BazaDeDate.java
package com.example.balaban.diabetcontrol;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.da tabase.sqlite.SQLiteOpenHelper;
public class BazaDeDate extends SQLiteOpenHelper {
public static final String NUME_BAZADEDATE = "management" ;
public static final String NUME_TABEL = "management_tabel" ;
public static final String COL_1 = "ID";
public static final String COL_2 = "GLICEMIE" ;
public BazaDeDate(Context context) {
super(context, NUME_BAZADEDATE , null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
String createTable = "CREATE TABLE " + NUME_TABEL + " (ID INTEGER PRIMARY KEY

49
AUTOINCREMENT, " + COL_2 + " INTEGER)" ;
db.execSQL(createTable);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL( "DROP TABLE IF EXISTS " + NUME_TABEL);
onCreate(db);
}
public boolean adaugaInfo(String item){
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put( COL_2, item);
long result = db.insert( NUME_TABEL , null, contentValues);
if(result == -1)
{
return false ;
} else {
return true ;
}
}
public Cursor obtinereDate(){
SQLiteDatabase db = this.getWritableDatabase();
Cursor data = db.rawQuery( "SELECT * FROM " + NUME_TABEL , null);
return data;
}
}

Clasa ListaDate.java
package com.example.balaban.diabetcontrol;
import android.database.Cursor;
import android.os.Bundle;
import android.support.v7.app.A ppCompatActivity;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;
import java.util.ArrayList;
public class ListaDate extends AppCompatActivity {

BazaDeDate mBazaDeDate ;
private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout. plan_lista );
listView = (ListView) findViewById(R.id. listView );
mBazaDeDate = new BazaDeDate(this);

populareListView();
}
private void populareListView() {
Cursor data = mBazaDeDate .obtinereDate();
ArrayList<String> listaDate = new ArrayList<>();
while (data.moveToNext()){
listaDate.add(data .getString(1));
}
ListAdapter adapter = new ArrayAdapter<>( this,
android.R.layout. simple_list_item_1 , listaDate);
listView .setAdapter(adapter);
}

}

Clasa Scanare.java
package com.example. balaban.diabetcontrol;
import android.M anifest;
import android.app.Activity;
import android.content.Intent;

50
import android.content.pm.PackageManager;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.ap p.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.googlecode .tesseract.android.TessBaseAPI;
import java.io.File;
import java.io.File OutputStream;
import java.io.InputStream;
import java.io.OutputStream;
public class Scanare extends AppCompatActivity {
public static final String TESS_DATA = "/tessdata" ;
private static final String TAG = MainActivity. class.getSimpleName();
private static final String DATA_PATH =
Environment. getExternalStorageDirectory ().toString() + "/Tess";
private EditText editText ;
private TessBaseAPI tessBaseAPI ;
private Uri outputFileDir ;
private Button buttonSalvare ;
BazaDeDate mBazaDeDate;
SQLiteDatabase db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout. activity_scanare );

editText = (EditText) this.findViewById(R.id. editText);
buttonSalvare = (Button) this.findViewById(R.id. buttonSalvare );
mBazaDeDate = new BazaDeDate( this);
db = mBazaDeDate .getWritableDatabase();

final Activity activity = this;
this.findViewById(R.id. buttonPornire ).setOnClickListener( new
View.OnClickListener() {
@Override
public void onClick(View v) {
if(ContextCompat. checkSelfPermission (getApplicationContext(),
Manifest.permission. READ_EXTERNAL_STORAGE ) !=
PackageManager. PERMISSION_GRANTED ){
ActivityCompat. requestPermissions (activity, new
String[]{Manifest.permission. READ_EXTERNAL_STORAGE },120);
}
if(ContextCompat. checkSelfPermission (getApplicationContext(),
Manifest.permissio n.WRITE_EXTERNAL_STORAGE ) !=
PackageManager. PERMISSION_GRANTED ){
ActivityCompat. requestPermissions (activity, new
String[]{Manifest.permission. WRITE_EXTERNAL_STORAGE },121);
}
startCameraActivity();
}
});
buttonSalvare .setOnClickListener( new View.OnClickListener() {

51
@Override
public void onClick(View v) {
String obiectNou = editText .getText().toString();
if(editText .length() !=0){
AdaugaInfo(obiectNou);
editText .setText( "");
} else {
toastMessage( "Trebuie introduse date!" );
}
}
});
}
private void startCameraA ctivity(){
try{
String imagePath = DATA_PATH + "/imgs";
File dir = new File(imagePath);
if(!dir.exists()){
dir.mkdir();
}
String imageFilePath = imagePath+ "/ocr.jpg" ;
outputFileDir = Uri.fromFile (new File(imageFilePath));
final Intent pictureIntent = new
Intent(MediaStore. ACTION_IMAGE_CAPTURE );
pictureIntent.putExtra(MediaStore. EXTRA_OUTPUT , outputFileDir );
if(pictureIntent.reso lveActivity(getPackageManager() ) != null){
startActivityForResult(pictureIntent, 1024);
}
} catch (Exception e){
Log.e(TAG, e.getMessage());
}
}
@Override
protected void onActivityResult( int requestCode, int resultCode, Intent
data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1024) {
if (resultCode == Activity. RESULT_OK ) {
prepareTessData();
startOCR(outputFileDir );
} else if (resultCode == Activity. RESULT_CANCELED ) {
Toast.makeText (getApplicationContext(), "Rezultat anulat" ,
Toast.LENGTH_SHORT ).show();
} else {
Toast.makeText (getApplicationCont ext(), "Activitatea a fost
intrerupta" , Toast. LENGTH_SHORT ).show() ;
}
}
}
private void prepareTessData(){
try{
File dir = new File(DATA_PATH + TESS_DATA );
if(!dir.exists()){
dir.mkdir();
}
String fileList[] = getAssets().list( "");
for(String fileName : fileList){
String pathToDataFile = DATA_PATH +TESS_DATA +"/"+fileName;
if(!(new File(pathToDataFile)).exists()){
InputStream in = getAssets().open(fileName);
OutputStream out = new FileOutputStream(pathToDataFile);
byte [] buff = new byte [1024];
int len ;
while(( len = in. read(buff)) > 0){
out.write(buff,0,len);

52
}
in.close();
out.close();
}
}
} catch (Exception e) {
Log.e(TAG, e.getMessage());
}
}
private void startOCR(Uri imageUri){
try{
BitmapFactory.Options options = new BitmapFactory.Options();
options. inSampleSize = 10;
Bitmap bitmap =
BitmapFactory. decodeFile (imageUri.getPath(),op tions);
String result = this.getText(bitmap);
editText .setText(result);
}catch (Exception e){
Log.e(TAG, e.getMessage());
}
}
private String getText(Bitmap bitmap){
try{
tessBaseAPI = new TessBaseAPI();
}catch (Exception e){
Log.e(TAG, e.getMessage());
}
tessBaseAPI .init(DATA_PATH ,"eng");
/* tessBaseAPI.setVariable(TessBaseAPI.VAR_CHAR_WHITELIST, "1234567890");
tessBaseAPI.setVa riable(TessBaseAPI.VAR_CHAR_BLACKLIST, "!@#$%^&*()_+= –
qwertyuiop[]}{POIU" +
"YTREWQasdASDfghFGHjklJKLl;L:' \"\\|~`xcvXCVbnmBNM,./<>?");*/
tessBaseAPI .setImage(bitmap);
String retStr = "Niciun rezultat" ;
try{
retStr = tessBaseAPI .getUTF8Text();
}catch (Exception e){
Log.e(TAG, e.getMessage());
}
tessBaseAPI .end();
return retStr;
}
@Override
public void onRequestPermissionsResult( int requestCode, @NonNul l String[]
permissions, @NonNull int[] grantResults) {
switch (requestCode){
case 120:{
if(grantResults. length > 0 && grantResults[0] !=
PackageManager. PERMISSION_GRANTED ){
Toast.makeText (this, "Permisiune citire respinsa" ,
Toast.LENGTH_SHORT ).show();
}
}
case 121:{
if(grantResults. length > 0 && grantResults[0] !=
PackageManager. PERMISSION_GRANTED ){
Toast.makeText (this, "Permisiune scriere respinsa" ,
Toast.LENGTH_SHORT ).show();
}
}
return;
}
}
public void AdaugaInfo(String obiectNou){

53
boolean introducereInfo = mBazaDeDate .adaugaInfo(obiectNou);
if (introduce reInfo){
toastMessage( "Date introduse cu succes!" );
} else {
toastMessage( "Eroare!" );
}
}
private void toastMessage(String message){
Toast.makeText (this, message, Toast. LENGTH_SHORT ).show();
}
}
Clasa Medicamentate.java
package com.example.balaban.diabetcontrol;
import android.database.Cursor;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class Medicamente extends AppCompatActivity {
EditText editDenumire , editDetalii ;
Button buttonSalvare , buttonAfisare ;
BazaDeDateMedicamentatie BazaDeDateMed ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout. activity_medicamente );
editDenumire = (EditText) findViewById(R.id. editDenumire );
editDetalii = (EditText) findViewById(R.id. editDetalii );
buttonAfisare = (Button) findViewById(R.id. buttonAfisare );
buttonSalvare = (Button) findViewById(R.id. buttonSalvare );
BazaDeDateMed = new BazaDeDateMedicamentatie( this);
adaugaIn fo();
afisareDate();
}
public void adaugaInfo(){
buttonSalvare .setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v) {
boolean esteAdaugat =
BazaDeDateMed .adaugaInfo(editDenumire .getText().toString(),
editDetalii .getText().toString());
editDetalii .setText( "");
editDenumire .setText( "");
if (esteAdaugat){
toastMessage( "Date introduse cu succes!" );
} else {
toastMessage( "Eroare!" );
}
}
});
}
public void afisareDate(){
buttonAfisare .setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v) {
Cursor date = BazaDeDateMed .obtinereDate();
if(date.getCount() == 0)
{
Mesaj("Eroare" ,"Nimic de afisat" );
return;
}
StringBuffer buffer = new StringBuffer();
while (date.moveToNext()){
//buffer.append("ID: "+ date.getString(0) + " \n");
buffer.append( "Denumire: " + date.getString(1) + "\n");

54
buffer.append( "Detalii: " + date.getString(2) + "\n\n");
}
Mesaj("Date", buffer.toString());

}
});
}
public void Mesaj(String titlu, String mesaj){
AlertDialog .Builder builder = new AlertDialog.Builder( this);
builder.setCancelable( true);
builder.setTitle(titlu);
builder.setMessage(mesaj);
builder.show();
}
private void toastMessage(String message){
Toast.makeText (this, message, Toast. LENGTH_SHORT ).show();
}
}
Clasa BazaDeDateMedicamentatie.java

package com.example.balaban.diabetcontrol;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database. sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class BazaDeDateMedicamentatie extends SQLiteOpenHelper {
public static final String NUME_BAZADEDATE = "medicamentatie" ;
public static final String NUME_TABEL = "medicam entatie_tabel" ;
public static final String COL_1 = "ID";
public static final String COL_2 = "DENUMIRE" ;
public static final String COL_3 = "DETALII" ;
public BazaDeDateMedicamentatie(Context context) {
super(context, NUME_BAZADEDATE , null, 1);
SQLiteDatabase db = this.getWritableDatabase();

}
@Override
public void onCreate(SQLiteDatabase db) {
String createTable = "CREATE TABLE " + NUME_TABEL + " (ID INTEGER PRIMARY KEY
AUTOINCREMENT, " + COL_2 + " TEXT, " +COL_3 + " TEXT)" ;
db.execSQL(createTable);

}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL( "DROP TABLE IF EXISTS " + NUME_TABEL );
onCreate(db);

}
public boole an adaugaInfo(String denumire, String detalii){
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put( COL_2, denumire);
contentValues.put( COL_3, detalii);
long result = db.insert( NUME_TABEL , null, contentValues);
// daca datele introduse sunt incorecte va returna -1
if(result == -1)
{
return false ;
} else {
return true ;
}
}
public Cursor obtinereDate(){
SQLiteDatabase db = this.getWritableDatabase();
Cursor data = db.rawQuery( "SELECT * FROM " + NUME_TABEL , null);
return data;
}
}

55
Clasa alarma.java
package com.example.balaban.diabetcontrol;
import android.ap p.AlarmManager;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.app.PendingIntent;
import android.app.TimePickerDialog;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.w idget.TextView;
import android.widget.TimePicker;
import android.widget.Toast;
import java.util.Calendar;
public class alarma extends AppCompatActivity {
private EditText editTextTitlu , editTextMesaj ;
private TextView textViewData , textViewOra ;
private BazaDeDateAlarme admin;
private SQLiteDatabase bd;
private ContentValues contentValues ;
private TextView tvDisplayDate ;
private DatePicker datePicker ;
private Button buttonData ;
private int year ;
private int month ;
private int day ;
static final int DATE_DIALOG_ID = 999;
private int minute ;
private int hour ;
private TimePicker timePicker ;
private TextView textViewTime ;
private Button buttonOra ;
private static final int TIME_DIALOG_ID = 998;
Calendar calendar = Calendar. getInstance ();
int ora, min,zi,luna,an;
String data_sistem ,ora_sistem ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.lay out.activity_alarma );
admin = new BazaDeDateAlarme( this);
bd = admin.getWritableDatabase();
zi = calendar .get(Calendar. DAY_OF_MONTH );
luna = calendar .get(Calendar. MONTH)+1;
an = calendar .get(Calendar. YEAR);
ora = calendar .get(Calendar. HOUR_OF_DAY );
min = calendar .get(Calendar. MINUTE);
data_sistem = luna + "-" + zi + "-" + an + " ";
ora_sistem = ora + ":" + min;
setCurrentDateOnView();
addListenerOnButton();
setCurrentTimeOnView();
editTextTitlu = (EditText) findViewById(R.id. editTextTitlu );
editTextMesaj = (EditText) findViewById(R.id. editTextMesaj );
textViewData = (TextView) findViewById(R.id. textViewData );
textViewOra = (TextView) fi ndViewById(R.id. textViewOra );
serviciu();
}
public void serviciu() {
Intent intent = new Intent(getApplicationContext(), MyAlarmReceiver. class);
final PendingIntent pIntent = PendingIntent. getBroadcast (this,
MyAlarmReceiver. REQUEST_CODE , intent, PendingIntent. FLAG_UPDATE_CURRENT );
long firstMillis = System. currentTimeMillis ();

56
int intervalMillis = 50 * 1000;
AlarmManager alarm = (AlarmManager) this.getSystemService(Context. ALARM_SERVICE );
alarm.setInexactRepeating(AlarmManager. RTC_WAKEUP , firstMillis, intervalMillis,
pIntent);
}

public void completare(View view) {
BazaDeDateAlarme admin = new BazaDeDateAlarme( this);
SQLiteDatabase bd = admin.getReadableDatabase();
bd = admin.getWritableDatabase();
contentValues = new ContentValues();
contentValues .put("Titlu", editTextTitlu .getText().toString());
contentValues .put("Mesaj", editTextMesaj .getText().toString());
contentValues .put("Data", textViewData .getText().toString());
contentValues .put("Ora", textViewOra .getText().toString());
bd.insert( "alarma" , null, contentValues );
bd.close();
editTextTitlu .setText( "");
editTextMesaj .setText( "");
textViewData .setText( "");
textViewOra .setText( "");
Toast.makeText (this, "Alarma inregistrata" , Toast. LENGTH_LONG ).show();
}
public void setCurrentTimeOnView() {
textViewTime = (TextView) findViewById(R.id. textViewOra );
timePicker = (TimePicker) findViewById(R.id. timePicker );
final Calendar c = Calendar. getInstance ();
hour = c.get(Calendar. HOUR_OF_DAY );
minute = c.get(Calendar. MINUTE);
timePicker .setCurrentHour( hour);
timePicker .setCurrentMinute( minute);
}
public void addListenerOnButton() {
buttonData = (Button) findViewById(R.id. buttonData );
buttonData .setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(Vie w v) {
showDialog( DATE_DIALOG_ID );
}
});
buttonOra = (Button) findViewById(R.id. buttonOra );
buttonOra .setOnClickListener( new View.OnClickListener() {
@Override
public void onClick( View v) {
showDialog( TIME_DIALOG_ID );
}
});
}
public void setCurrentDateOnView() {
tvDisplayDate = (TextView) findViewById(R.id. textViewData );
datePicker = (DatePicker) findViewById(R.id. datePicke r);
final Calendar c = Calendar. getInstance ();
year = c.get(Calendar. YEAR);
month = c.get(Calendar. MONTH);
day = c.get(Calendar. DAY_OF_MONTH );
tvDisplayDate .setText( new StringBuilder()
// Month is 0 based, just add 1
.append( month + 1).append( "-").append( day).append( "-")
.append( year).append( " "));
datePicker .init(year, month, day, null);
}
@Override
protected Dialog onCreateDialog( int id) {
switch (id) {
case DATE_DIALOG_ID :
return new DatePickerDialog( this, datePickerListener ,
year, month,day);
case TIME_DIALOG_ID :
return new TimePickerDialog( this, timePickerLi stener, hour,
minute,false);

57
}
return null ;
}
private TimePickerDialog.OnTimeSetListener timePickerListener = new
TimePickerDialog.OnTimeSetListener() {
public void onTimeSet(TimePicker view, int selectedHour, int selected Minute) {
hour = selectedHour;
minute = selectedMinute;
textViewTime .setText( new
StringBuilder().append( padding_str (hour)).append( ":").append( padding_str (minute)));
timePicker .setCurrentHour( hour);
timePicker .setCurrentMinute( minute);
}
};
private static String padding_str( int c) {
if (c >= 10)
return String.valueOf(c);

else

return "0" + String. valueOf(c);
}
private DatePickerDialog. OnDateSetListener datePickerListener
= new DatePickerDialog.OnDateSetListener() {
public void onDateSet(DatePicker view, int selectedYear,
int selectedMonth, int selectedDay) {
year = selectedYe ar;
month = selectedMonth;
day = selectedDay;
tvDisplayDate .setText( new StringBuilder().append( month + 1)
.append( "-").append( day).append( "-").append( year)
.append( " "));

datePicker .init(year, month, day, null);
}
};
}
Clasa MyAlarmReceiver.java
package com.example.balaban.diabetcontrol;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android. content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.BitmapFactory;
import android.media.RingtoneManager;
import android.net.Uri;
import android.support.v4.app.NotificationCompat;
import java.util.Calendar;
public class MyAlarmReceiver extends BroadcastReceiver {
public static final int REQUEST_CODE = 125;
private NotificationManager notificationManager ;
private final int NOTIFICATION_ID = 12;
private BazaDeDateAlarme admin;
private Cursor fila;
private SQLiteDatabase bd;
private String alarma, mesaj,titlu;
@Override
public void onReceive(Context context, Intent intent) {
Calendar calendar = Calendar. getInstance ();
int ora, min,zi,luna,an;
String data_sistem,ora_sistem;
zi = calendar.get(Calendar. DAY_OF_MONTH );
luna = calendar.get(Calendar. MONTH)+1;
an = calendar.get(Calendar. YEAR);
ora = calendar.get(Calendar. HOUR_OF_DAY );
min = calendar.get(Calendar. MINUTE);

58
data_sistem = luna + "-" + zi + "-" + an + " ";
ora_sistem = ora + ":" + min;
admin = new BazaDeDateAlarme(context);
bd = admin.getWrit ableDatabase();
if(bd!=null) {
fila = bd.rawQuery( "SELECT * FROM ALARMA WHERE DATA='" + data_sistem + "' AND
ORA= '" + ora_sistem + "'" , null);
if(fila.moveToFirst()){
alarma=fila.getString(0);
titlu=fila.getString(1);
mesaj =fila.getString(2);
triggerNotification(context, titlu+"\n"+mesaj);
}
}
bd.close();
}
private void triggerNotification(Context contexto, String t) {
Intent notificationIntent = new Intent(contexto, MyAlarmReceiver. class);
notificationIntent.addFlags(Intent. FLAG_ACTIVITY_CLEAR_TOP );
PendingIntent contentIntent = PendingIntent. getActivity (contexto, 0,
notificationIntent, PendingIntent. FLAG_UPDATE_CURRENT );
Uri defaultSound = RingtoneManager. getDefaultUri (RingtoneManager. TYPE_ALARM );
long[] pattern = new long []{0, 1000, 2000, 1000, 2000, 1000, 2000};
NotificationCompat.Builder builder = new NotificationCompat.Build er(contexto);
builder.setContentIntent(contentIntent)
.setTicker( "" )
.setContentTitle( "")
.setContentText(t)
.setContentInfo( "Info")
.setLargeIcon(BitmapFactory. decodeRes ource(contexto.getResources(),
R.drawable. ic_notificacion ))
.setSmallIcon(R.drawable. ic_notificacion )
.setAutoCancel( true)
.setSound(defaultSound)
.setVibrate(pattern);
Notification no tificacion = new NotificationCompat.BigTextStyle(builder)
.bigText(t)
.setBigContentTitle( "Alarma" )
.build();
notificationManager = (NotificationManager)
contexto.getSystemService(Context. NOTIFICATION _SERVICE );
notificationManager .notify( NOTIFICATION_ID , notificacion);
}
}
Clasa MyTestService.java
package com.example. balaban.diabetcontrol;
import android.app.IntentService;
import android.content.Intent;
public class MyTestService extends IntentService {
public MyTestService() {
super("test-service" );
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
protected void onHandleIntent(Intent intent) {
}
Clasa BazaDeDateAlarme.java
package com.example.balaban.diabetcontrol;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class BazaDeDateAlarme extends SQLiteOpenHelper {
public static final String NUME_BAZADEDATE = "alarme" ;
public BazaDeDateAlarme(Context context) {
super(context, NUME_BAZADEDATE , null, 7);
}

59
@Override
public void onCreate(SQLiteDatabase db) {
String createTable = "CREATE TABLE ALARMA( ID INTEGER P RIMARY KEY AUTOINCREMENT,
TITLU TEXT, MESAJ TEXT, DATA DATE, ORA TIME)" ;
db.execSQL(createTable); }
@Override
public void onUpgrade(SQLiteDatabase db, int versionAnte, int versionNue) {
db.execSQL( "DROP TABLE IF EXISTS ALARMA" );
}
}

Clasa meniu.java
package com.example.balaban.diabetcontrol;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;
public class meniu extends AppCompatActivity {
TextView textViewMeniu ;
Meniuri meniuHolder = new Meniuri();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout. activity_meniu );
textViewMeniu = (TextView) findViewById(R.id. textViewMeniu );

}
public void genMeniu(View view)
{
textViewMeniu .setText( meniuHolder .urmMeniu());
}
}
Clasa Meniuri.java
package com.example.balaban.diabetcontrol;
public class Meniuri {
String Meniuri[] = {"Micul dejun \n" +
"O salata de cruditati cu seminte, cu branza sau peste, fructe de mare,
eventual acrita cu lamaie \n\n" +
"O gustare: \n" +
"Cateva seminte, fie un iaurt sau o salata \n\n" +
"Masa de pranz: \n" +
"O portie mare de ciroba de legume sau supa (fara taitei, cartofi, orez,
gris)\n\n" +
"Gustare: \n" +
"Un fruct sau o legume cruda sau o salata, un iaurt, o lingura de seminte
curde etc. \n\n" +
"Cina:\n" +
"Mancare de ciuperci (nu ciulama, care contine faina) \n","Micul dejun \n" +
"Un ou cu legume crude – oul fiert si NU prajit \n\n" +
"O gustare: \n" +
"Cateva seminte, fie un iaurt sau o salata \n\n" +
"Masa de pranz: \n" +
"Gratar cu salata de cruditati \n\n" +
"Gustare: \n" +
"Un fruct sau o legume cruda sau o salata, un iaurt, o lingura de seminte
curde etc. \n\n" +
"Cina:\n" +
"Mancare de brocco li, de conopida, de varza – fara ulei \n","Micul dejun \n" +
"Masline cu branza si legume proaspete \n\n" +
"O gustare: \n" +
"Cateva seminte, fie un iaurt sau o salata \n\n" +
"Masa de pranz: \n" +
"Ciuperci umplute cu branza, coapte pe gratar sau la cuptor \n\n" +
"Gustare: \n" +
"Un fruct sau o legume cruda sau o salata, un iaurt, o lingura de seminte
curde etc. \n\n" +
"Cina:\n" +
"Supa crema de ciuperci s au de legume, supa de ceapa etc \n","Micul dejun \n" +
"Un pahar de iaurt cu fulgi de orz si ovaz \n\n" +
"O gustare: \n" +
"Cateva seminte, fie un iaurt sau o salata \n\n" +

60
"Masa de pranz: \n" +
"Humus (cu seminte, dar fara ulei) \n\n" +
"Gustare: \n" +
"Un fruct sau o legume cruda sau o salata, un iaurt, o lingura de seminte
curde etc. \n\n" +
"Cina:\n" +
"Supa crema de ciuperci sau de legume, supa de ceapa etc\n"};
int i=0;
public String urmMeniu()
{
i++;
if(i >= Meniuri.length)
{
i = 0;
}
return Meniuri [i];
}
}

Similar Posts