PROGRAM DESTINAT DISPOZITIVELOR MOBILE PENTRU [617989]

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

2
Cuprins

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

3
3.2.2 Schemă bloc ………………………….. ………………………….. ………………………….. ……………………….. 32
3.3 Implementare alarmă ………………………….. ………………………….. ………………………….. ………………….. 33
3.4 Implementare baza de date SQLite ………………………….. ………………………….. ………………………….. .. 34
4. Utilizarea aplicației ………………………….. ………………………….. ………………………….. ………………………….. .. 36
4.1 Descrierea aplicației ………………………….. ………………………….. ………………………….. …………………… 36
4.2 Rezultate ………………………….. ………………………….. ………………………….. ………………………….. ………. 36
Concluzii ………………………….. ………………………….. ………………………….. ………………………….. …………………….. 45
Bibliografie ………………………….. ………………………….. ………………………….. ………………………….. …………………. 46

4
Lista figurilor

Figura 1.1 – Metoda farfuriei ………………………….. ………………………….. ………………………….. ………….. 17

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

Figura 3.1 – Organigrama aplicației ………………………….. ………………………….. ………………………….. … 28
Figura 3.2 – Ierarhie View ………………………….. ………………………….. ………………………….. ………………. 29
Figura 3.3 – Schemă bloc OCR ………………………….. ………………………….. ………………………….. ………. 33

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

5
Lista acronimelor

ACID – Atomicity , Consistency , Isolation , Durability
ADB – Android Debug B ridge
ANSI – 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 Comm unications(Sistem global pentru c omunicaț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 – Native 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 Transformation Format
XML – Extensible Markup Language

6
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 19 85. 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 spitalizar e.
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 interior 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 respectarea
unor reguli de ba ză.
Î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 lucru este esențial dato rită 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ă s alva 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 calculato r. 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 realizarea unor
aplicații c ât mai performante.

7
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 secre tat 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âne în sânge și nu ajung e î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 d e 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 prod uc 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 caz ul 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
exist at 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 frecvente 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
persoanele diagnosticate cu dia bet. Î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 acumu lează î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 ă

8
• Senzație de foame accentuată
• Oboseală
• Vedere neclară
• Amorțeală sau furnicături ale picioarelor sau mâinilo r
• 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 m ai 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 sa u 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ă este 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
organismul ui de mai multă i nsulină 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 ist oria 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 deveni supraponderală s au 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 s unt 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ârsta adultă, dar uneori
boala nu este diagnosticată decât mai târziu în viață.

9
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 fie r î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 uneori produc rezistență l a 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.
• Hipertiroidismul apare atunci când g landa 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 cazul în care pancreasul d eteriorat 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 vitamina B3
• Anumite tipuri d e 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 pentru reduce rea niveluril e 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 diabet zaharat tip 2.
Printre factorii de risc de dezvoltare a diabetul tip 2 se află :
• Supraponderalitatea sau obezitatea

10
• 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") sau 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 nigricană – 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 cantitate mai mică de
calori i ș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 reducer ea ș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ătate, cum ar fi bolile d e 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 a mâ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 pentru prevenirea diabetul ui ș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 pierd erea î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 z i, 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 ti p 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]

11

1.2.5 Testarea
Oricine care prezintă simptomele diabet ului necesită tes tarea î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 preven irea 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 pent ru 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 ani care sunt
suprapond erali 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 plasmatice 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 glicemiei î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 A1C 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 (RPG)
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]

12

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 ar teriale
ș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. Planul de auto -îngrijire po ate 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 diabetului 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 cole sterol 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 d iabet 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, accident 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

13
Menține rea nivelurilor de A1C, tensiunii arteriale și col esterol 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, leziu ni 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 îndulcite cu zahăr, aleger ea 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 lucru necesar.
Se recoman dă 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 administrează insulină. Rezult atele 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ă modalitate 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 nive lului 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 planului alimentar, a a ctivităț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 tre bui 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.

14
Hipoglicemia poate pune viața în pericol și trebuie tratată imediat.
Nivelul crescut al glicemi ei
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ări i 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 includ:
• Probleme de respir aț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, es te 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 medicament după un timp sau ut ilizarea 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 injectabile
Pe lângă ins ulină, 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 greutatea. Aceste medicam ente injectabile nu
reprezintă substituenți ai insulinei .

15
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 tratament mai puțin frecv ent 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 za harat 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 s e 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ă par te. 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ăstrar ea 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 energie
Alimentație
Cheia u nui 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
Amid on: 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 t ofu

16
• 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ăsimi saturate și grăsim i 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 îndulcite și utilizarea unu i î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 momentul 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 cu alimente slabe în ca lorii, 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” ajută la controlarea di mensiunilor 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 pentru prânz și cină.

17

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 amidonice 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 fiecă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 d imensiunea 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 dimensiune 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. Identificarea 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 zaharuri adăugate sau ce le 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ă repre zintă 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.

18

Activitatea fizică:
• Scade nivelul de glucoză din sânge
• Scade tensiunea arterială
• Îmbunătățește fluxul s angvin
• 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 activitat e 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 activitate 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 c onsumului 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ă prote jarea î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 exemplu, dacă o persoană i a
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 po t 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 pantofi
confortabili și de sprijin și o îngrijire mai atentă a picioarelor înainte, în timpul și după activitatea
fizică. [7]

19
2. Tehnologii utilizate

2.1 Android
Android este un sistem de operare pentru telefoanele mobile, dezvoltat de Google, bazat pe
Linux kernel și realizat în pr imul 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, prinderea pentru manipular ea 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 – companii software, hardwa re 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ă de 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 actuale ș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 mai multe
motive. Arhit ectura 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 cum ar fi modul de ape lare 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 jocuri
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 inc lus ș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 Android se pot concentr a 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]

20
2.2 Android Studio
Android Studio este o cola borare î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 . Android 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 dezvoltarea 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ți e 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 construi 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, gradului de utilizare, compa tibilităț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
Fiecare proiect din Androi d 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 afiș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.

21

Figura 2. 1 – Fișierele din proiec t î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.xml.
• Fișierele Java: co nț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 imagi ni 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șajul meniului unei aplic aț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șierului proiectului, sel ectaț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 exemplu, selectarea vizual iză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]

22

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 zone 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 editate
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 a cț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 folosită 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 Projec t Tool Window – este folosită pentru vizualizarea și navigarea în toate fișierele din
proiect

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

23
Se poate organiza fereastra principală pentru a oferi mai mult spațiu p e 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, a cțiunile, elementele interfeț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 an umite 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 dintr -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 utili zat 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 dig itizare a textelor tipărite, 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 e xploatarea textului. OCR este 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 fo nt la un moment dat. Sistemele 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ă rep roducă 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 Fournier 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ționa t de IBM.
Odată cu apariția 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ți onalităț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, c hirilice, arabe, ebraice, indie, bengaleze, devanagari, tamil, chineze,
japoneze și coreene.

24
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, docu ment legal de facturare OCR.
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 d ocumentele 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 docu mentelor 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 caracterelor (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 ob icei, 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 (I WR) – 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 ana lizează 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 desenate 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 caracterelor 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 d iferite 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 dispo nibile .

25
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 est e 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, intro ducerea
textului pe mai multe 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 di stanțat proporțional.
Versiunile 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 extin de recunoașterea altor limbaje 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 s unt 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, schim bă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 SQLit e
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 tabele le și indexurile. Organizează 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 ANS I 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 pen tru textele Unicode.
Sqlite 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 se paraț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 separ at dedicat SQLite. Librăria
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.

26
• Suport tranzacțional – SQLite suportă proprietățile principale ale tranzacțiilor ACID
și anume atomicitatea, consistență, izola re si durabilitate
• Personalizare – 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
Unicod e.
• Protecție împotriva pierderilor 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 celorlalt e 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
impleme ntări ocazionale ineficiente 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 motor 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 m ai multe tabele, indici, declanș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ționar ea
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 SQLite 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, rule ază 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 m are 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 te stelor 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 v erificate de testele automate folosind echipamente de testare speciale care simulează
defecțiunile sistemului. Desigur, chiar și cu toate aceste teste, există încă bug -uri. Dar, spre deosebire

27
de unele proiecte similare (în special concurenții comerciali), SQLite este deschis și bun 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 pe ntru 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. Decizii le de proiectare sunt luate
în considerare cu acest scop. [18]

28
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 reprezentate 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 element elor
Pentru interfața aplicaț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

29
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ă su nt 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 su nt capabile să afișeze text, 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 gest iona focalizarea în mișcare 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
(androi d.view.View.OnFocusChangeListener).
• 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 ex primat 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

30
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ă . Pen tru a controla modul în care 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 imagi nii ecranului glucometrului.
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 decla rat 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 ar e
rolul de ascunderea caracterelor 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. Pentr u umplerea
graficului cu date 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 potrivit 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 crea t un vector care conține regimurile
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 reprez entare a graficelor, fie de 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 apelarea 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

31
atributul onClick . 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 J ava 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 scris î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 personalizat, 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 p ictogramele 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 d e meniu, atinse
prin intermediul 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 forma t XML standard pentru a defini
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ât eva motive:
• Vizualizarea mai 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 ecra nului ș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 mome ntul apăsării este comparat
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.

32
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 ajuto rul software -ului Tesseract . Î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 val orii
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ștere a 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 care 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, int) 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 imagin ii
realizate și pentru setarea 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 permisiunilo r pentru scrierea și citirea 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 n evoie și este setat un mesaj 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 rul area aplicației și până la afișarea
unui rezultat.

33

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 m esajului 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șarea 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 elementelo r 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 siste mului. 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 înregis trate 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ă metod a 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 însea mnă că, în unele cazuri, telefonul se va opri de îndată ce

34
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 preve ni 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 su nt apăsate
butoanele de selectare 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. Acest e 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 creată 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 m omentului de pornire a alarmei 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 ne cesar, 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ă tabelu l care conține toate datele 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 act ivitatea corespunzătoare prin 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
corespunză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 tabe l 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 ște rgere 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 telefonul pe care este instalată aplicația Android pe calculator, prin intermediul unui

35
instrument instalat pe browser -ul web Mozilla Firefox și anume SQLite Manager . S-a folosit Android
Debug Bridge ( adb), care este un instrument vers atil de linie de comandă care 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 she ll 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 emite rea unei comenzi adb.
• Un daemon (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 specif icată 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 des tinație
precizată.

36
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 g lucometru și
prelucrarea unei 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. Ex istă posibilitatea de crearea
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.
4.2 Rezultate
Ecranul principal al aplicației în momentul rulării aplicației este pre zentat î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 bu ton pentru afișarea tuturor valorile înregistrate până la momentul respectiv.

Figura 4. 1– Ecran principal
În momentul introducerii 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

37
4.3), pe care sunt reprezentate valorile care au fost înregistrate până la momentul respectiv

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 car e se poate porni camere si salva valoarea scanată,
aceasta este prezentată în Figura 4. 4.

38

Figura 4. 4– Deschidere activitate scanare
La apăsarea butonului Pornire camera, este deschisă came ra, se realizează o fotografie ce
urme ază 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ă. Acestea sunt prezentate în Figura 4.5.

Figura 4. 5– Butoane respingere/accepta re 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 înregistrată 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 :

39

Figura 4. 7– Baza de date glicemie
La apăsarea meniului de opțiuni din dreapta sus se va deschide o listă cu funcțiile pe care le
poate face utilizatorul: s alvarea 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

40
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 fe reastră 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 .

41

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
4.13.

42
Figura 4. 13– Bază de date alarme
Din meniu anterior, în momentul selectării Regimuri se deschide o f ereastră , 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 menț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ă
înregistra rea î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 utilizatorul nu le mai dorește. Această
activitate este reprezentată în Figura 4.16 .

43

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 sunt prezentate toate înregistrările din baza de data a programului de medicamentație.

Figura 4 .17– Afișare medicamente

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

Figura 4. 18– Baza de date medicamente

45
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 proie ctului este managementul corect al diabetului de tip 2 , astfel că pentru
atingerea acestui obiectiv am ales dezvoltarea unei aplicații pentru dispozitivele mobile cu Android
care permite utilizatorului salvarea valorii glicemiei prin introducere directă sa u 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 înregistrat e.
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 sistemul de operare Android pentru că este cea mai răspândită tehnologie pentru
dispozitivele mobi le ș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 implementarea a unui motor de baze
de date, codul acestuia fiind disponibil gratuit, atât pentru scopuri pe rsonale cât și pentru scopuri
comerciale.
Principalul obiectiv viitor este îmbunătățirea metodei de recunoaștere optică a textului, în
momentul deschiderii camerei foto este necesar încadrarea textului pe care îl dorim să fie recunoscut
pentru simplificare a 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 apar pe ecranul glucometrului,
acestea având o formă ușor diferită de cifrele obișnuite, fiind dest ul 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 specialist , în vederea prelucrării acestora, oferind posibilitatea modificării
programului de medica mentaț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.

46
Bibliografie

[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 Three 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, Prevention of Type 2 Diabetes From Science to Therapy, Editura Springer
[6] R Graham Barr, MD, MPH; Dav id 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, & Othe r Diabetes Treatments , https://www.niddk.nih.gov/health –
information/diabetes/overview/insulin -medicines -treatments , accesat la data
[9] Plate Metho d, https://www.niddk.nih.gov/health -information/diabetes/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] Herber t 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] About SQLite, https://www.sqlite.org/about.html , accesat la data
[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

47
[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

48
ANEXA 1

Clasa MainActivity.java
package com.example.balaban.diabetcontrol;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLit eDatabase;
import android.os.Bundle;
import android.support.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.gr aphview.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) findViewByI d(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(Vie w v) {
Intent scanareIntent = new Intent(MainActivity. this, Scanare. class);
MainActivity. this.startActivity(scanareIntent);
}
});
}
private DataPoint[] obtinereDate() {

49
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(obiectNou);
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.dat abase.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

50
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.getWritableDatabas e();
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.AppCompatActivity;
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 populareLi stView() {
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
import com.googlecode .tesseract.android.TessBaseAPI;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;

51
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. button1);
mBazaDeDate = new BazaDeDate( this);
db = mBazaDeDate .getWritableDatabase();
final Activity activity = this;
this.findViewById(R.id. button).setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v) {
if(ContextCompat. checkSelfPermission (getApplicationContext(),
Manifest.permission. READ_EXTERNAL_STORAGE ) != PackageManager. PERMISSION_GRANTED ){
ActivityCompat. requestPer missions (activity , new
String[]{Manifest.permission. READ_EXTERNAL_STORAGE },120);
}
if(ContextCompat. checkSelfPermission (getApplicationContext(),
Manifest.permission. WRITE_EXTERNAL_STORAGE ) != PackageManager. PERMISSION_GRANTED ){
ActivityCompat. requestPermissions (activity , new
String[]{Manifest.permission. WRITE_EXTERNAL_STORAGE },121);
}
startCameraActivity();
}
});
buttonSalvare .setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v) {
String obiectNou = editText .getText().toString();
if(editText .length() != 0){
AdaugaInfo(obiectN ou);
editText .setText( "");
} else {
toastMessage( "Trebuie introduse date!" );
}

}
});
}
private void startCameraActivity(){
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.resolveActivity(getPackageManager() ) != null){
startActivityForResult(pictureIntent, 1024);
}
} catch (Exception e){
Log.e(TAG, e.getMessage());
}
}

@Override

52
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(), "Result canceled." ,
Toast.LENGTH_SHORT ).show();
} else {
Toast.makeText (getApplicationContext(), "Activity result failed." ,
Toast.LENGTH_SHORT ).show() ;
}
}
}
private void prepareTessData(){
try{
File dir = new File(DATA_PATH + TESS_DATA );
if(!dir.exists()){
dir.mkdir();
}
String file List[] = 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);
}
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(),options);
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.setVariable(TessBaseAPI.VAR_CHAR_BLACKLIST, " !@#$%^&*()_+= –
qwertyuiop[]}{POIU" +
"YTREWQasdASDfghFGHjklJKLl;L:' \"\\|~`xcvXCVbnmBNM,./<>?");*/
tessBaseAPI .setImage(bitmap);
String retStr = "No result" ;
try{
retStr = tessBaseAPI .getUTF8Text();
}catch (Exception e){
Log.e(TAG, e.getMessage());
}
tessBaseAPI .end();
return retStr;

53
}
@Override
public void onRequestPermissionsResult( int requestCode, @NonNull String[]
permissions, @NonNull int[] grantResults) {
switch (requestCode){
case 120:{
if(grantResults. length > 0 && grantResults[ 0] !=
PackageManager. PERMISSION_GRANTED ){
Toast.makeText (this, "Read permission denied" ,
Toast.LENGTH_SHORT ).show();
}
}
case 121:{
if(grantResults. length > 0 && grantResults[ 0] !=
PackageManager. PERMISSION_GRANTED ){
Toast.makeText (this, "Write permission denied" ,
Toast.LENGTH_SHORT ).show();
}
}
return;
}
}
public void AdaugaInfo(String obiectNou){
boolean introducereInfo = mBazaDeDate .adaugaInfo(obiectNou);
if (introducereInfo){
toastMessage( "Date introdu se 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.wid get.Toast;
public class Medicamente extends AppCompatA ctivity {
EditText editDenumire , editDetalii ;
Button buttonSalvare , buttonAfisare ;
BazaDeDateMedicamentatie BazaDeDateMed ;
@Override
protected void onCreate(Bundle savedInstanceSt ate) {
super.onCreate(savedInstanceState);
setContentView(R.layout. activity_medicamente );
editDenumire = (EditText) findViewById(R.id. editDenumire );
editDetalii = (EditText) findViewById(R.id. editDetalii );
buttonAfis are = (Button) findViewById(R.id. buttonAfisare );
buttonSalvare = (Button) findViewById(R.id. buttonSalvare );
BazaDeDateMed = new BazaDeDateMedicamentatie( this);
adaugaInfo();
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( "");

54
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");
buffer.append( "Detalii: " + date.get String(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.dat abase.sqlite.SQLiteOpenHelper;
public class BazaDeDateMedicamentatie extends SQLiteOpenHelper {
public static final String NUME_BAZADEDATE = "medicamentatie" ;
public static final String NUME_TABEL = "medicamentatie_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.getWritab leDatabase();

}
@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);

55

}
public boolean 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, content Values);
// 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;
}
}

Clasa alarma.java
package com.example.balaban.diabetcontrol;
import android.app.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.widget.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 i nt 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.layout. activity_alarma );

56
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();
setCurren tTimeOnView();
editTextTitlu = (EditText) findViewById(R.id. editTextTitlu );
editTextMesaj = (EditText) findViewById(R.id. editTextMesaj );
textViewData = (TextView) findViewById(R.id. textViewData );
textViewOra = (TextView) findViewById(R.id. textViewOra );
serviciu();
}
public void serviciu() {
Intent intent = new Intent(getApplicationContext(), MyAlarmReceiver. class);
final PendingIntent pIntent = PendingIntent. getBroadcast (this,
MyAlarmReceive r.REQUEST_CODE , intent, PendingIntent. FLAG_UPDATE_CURRENT );
long firstMillis = System. currentTimeMillis ();
int intervalMillis = 50 * 1000;
AlarmManager alarm = (AlarmManager) this.getSystemService(Contex t.ALARM_SERVICE );
alarm.setInexactRepeating(AlarmManager. RTC_WAKEUP , firstMillis, i ntervalMillis,
pIntent);
}

public void completare(View view) {
BazaDeDateAlarme admin = new BazaDeDateAlarme( this);
SQLiteDatabase bd = adm in.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) f indViewById(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(View 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 );
}
});
}

57
public void setCurrentDateOnView() {
tvDisplayDate = (TextV iew) findViewById(R.id. textViewData );
datePicker = (DatePicker) findViewById(R.id. datePicker );
final Calendar c = Calendar. getInstance ();
year = c.get(Calendar. YEAR);
month = c.get(Calendar. MONTH);
day = c.get(Calen dar.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, timePickerListener , hour,
minute,false);

}
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 = selectedYear;
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;

58
import android.database.sqlite.SQLiteDatabase;
import android.graphics.BitmapFactory;
import android.media.RingtoneManager;
import android.net.Uri;
import android.sup port.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 BazaDeDateAlar me admin;
private Cursor fila;
private SQLiteDatabase bd;
private String alarma, mesaj,titlu;
@Override
public void onReceive(Co ntext context, Intent intent) {
Calendar calendar = Calendar. getInstance ();
int ora, min, zi,luna,an;
String data_sistem,ora_sist em;
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;
admin = new BazaDeDateAlarme(context);
bd = admin.getWritableDatabase();
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, MyAla rmReceiver. class);
notificationIntent.addFlags(Intent. FLAG_ACTIVITY_CLEAR_TOP );
PendingIntent contentIntent = PendingIntent. getActivity (contexto, 0,
notificationIntent, PendingIntent. FLAG_UPDATE_CURRENT );
Uri defaultSound = Ringtone Manager. getDefaultUri (RingtoneManager. TYPE_ALARM );
long[] pattern = new long []{0, 1000, 2000, 1000, 2000, 1000, 2000};
NotificationCompat.Builder builder = new NotificationCompat.Builder(contexto);
builder. setContentIntent(contentIntent)
.setTicker( "" )
.setContentTitle( "")
.setContentText(t)
.setContentInfo( "Info")
.setLargeIcon(BitmapFactory. decodeResource (contexto.get Resources(),
R.drawable. ic_notificacion ))
.setSmallIcon(R.drawable. ic_notificacion )
.setAutoCancel( true)
.setSound(defaultSound)
.setVibrate(pattern);
Notification notificacion = new NotificationCompat.BigTextStyle(builder)
.bigText(t)
.setBigContentTitle( "Alarma" )
.build();
notificationManager = (NotificationManager)
contexto.getSystemService(Context. NOTIFICATION_SERVICE );
notificationManager .notify( NOTIFICATION_ID , notificacion);
}
}
Clasa MyTestService.java

59
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.da tabase.sqlite.SQLiteOpenH elper;
public class BazaDeDateAlarme extends SQLiteOpenHelper {
public static final String NUME_BAZADEDATE = "alarme" ;
public BazaDeDateAlarme(Context context) {
super(context, NUME_BAZADEDATE , null, 7);
}
@Override
public void onCreate(SQLiteDatabase db) {
String createTable = "CREATE TABLE ALARMA( ID INTEGER PRIMARY 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_m eniu);
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

60
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 semint e
curde etc. \n\n" +
"Cina:\n" +
"Mancare de broccoli, 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 sau 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 ia urt sau o salata \n\n" +
"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