Aihtpqcenmfngjmzzv@twzhhq.online 735 Licenta 2021 Text

UNIVERSITATEA \ALEXANDRU-IOAN CUZA” DIN IAS ,I FACULTATEA DE INFORMATIC A LUCRARE DE LICENT ,A DashCam Companion propus a de Robert-Octavian Martonc a Sesiunea: iulie, 2021 Coordonator s ,tiint ,i c Conf. Dr. Anca Vitcu UNIVERSITATEA \ALEXANDRU-IOAN CUZA” DIN IAS ,I FACULTATEA DE INFORMATIC A DashCam Companion Robert-Octavian Martonc a Sesiunea: iulie, 2021 Coordonator s ,tiint ,i c Conf. Dr. Anca Vitcu Avizat, ^Indrum ator Lucrare de Licent , a, Conf. Dr. Anca Vitcu. Data ………………………. Semn atura ………………………. DECLARAT ,IE privind originalitatea cont ,inutului lucr arii de licent , a Subsemnatul Martonc a Robert-Octavian domiciliat ^ n Rom^ ania, jud. Ias ,i, mun. Ias ,i, Stradela , n ascut la data de 11 ianuarie 2000 , identi cat prin CNP 1234567891234 , absolvent al Universit at ,ii „Alexandru-Ioan Cuza” din Ias ,i,Facultatea de Informatic a spe- cializarea Informatic a , promot ,ia 2021, declar pe propria r aspundere cunosc^ and consecint ,ele falsului ^ n declarat ,ii ^ n sensul art. 326 din Noul Cod Penal s ,i dispozit ,iile Legii Educat ,iei Nat ,ionale nr. 1/2011 art. 143 al. 4 s ,i 5 referitoare la plagiat, c a lucrarea de licent , a cu titlul DashCam Companion elaborat a sub ^ ndrumarea doamnei Conf. Dr. Vitcu Anca , pe care urmeaz a s a o sust ,in ^ n fat ,a comisiei este original a, ^ mi apart ,ine s ,i ^ mi asum cont ,inutul s au ^ n ^ ntregime. De asemenea, declar c a sunt de acord ca lucrarea mea de licent , a s a e veri cat a prin orice modalitate legal a pentru con rmarea originalit at ,ii, consimt ,ind inclusiv la introdu- cerea cont ,inutului ei ^ ntr-o baz a de date ^ n acest scop. Am luat la cunos ,tint , a despre faptul c a este interzis a comercializarea de lucr ari s,tiint ,i ce ^ n vederea facilit arii falsi c arii de c atre cump ar ator a calit at ,ii de autor al unei lucr ari de licent , a, de diplom a sau de disertat ,ie s ,i^ n acest sens, declar pe proprie r aspundere c a lucrarea de fat , a nu a fost copiat a ci reprezint a rodul cercet arii pe care am ^ ntreprins-o. Dat a azi, ………………………. Semn atur a student ………………………. DECLARAT ,IE DE CONSIMT ,AM^ANT Prin prezenta declar c a sunt de acord ca lucrarea de licent , a cu titlul ,, DashCam Companion „, codul surs a al programelor s ,i celelalte cont ,inuturi (gra ce, multimedia, date de test, etc.) care ^ nsot ,esc aceast a lucrare s a e utilizate ^ n cadrul Facult at ,ii de Informatic a. De asemenea, sunt de acord ca Facultatea de Informatic a de la Universitatea \Alexandru- Ioan Cuza” din Ias ,i, s a utilizeze, modi ce, reproduc a s ,i s a distribuie ^ n scopuri necomerci- ale programele-calculator, format executabil s ,i surs a, realizate de mine ^ n cadrul prezentei lucr ari de licent , a. Ias ,i, Absolvent Robert-Octavian Martonc a ………………………. (semn atura ^ n original) Cuprins Motivat ,ie 2 Introducere 4 1 Arhitectura aplicat ,iei 5 1.1 Funct ,ionalit at ,i . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1.2 Comparat ,ie cu alte aplicat ,ii . . . . . . . . . . . . . . . . . . . . . . . . . . 6 2 Implementare 8 2.1 AndroidManifest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 2.1.1 Activit at ,i . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 2.1.2 Servicii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.1.3 Permisiuni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.2 build.gradle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.3 PreviewActivity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.3.1 AutoFitTextureView . . . . . . . . . . . . . . . . . . . . . . . . . . 13 2.3.2 Accesarea camerei cu Camera2 . . . . . . . . . . . . . . . . . . . . 13 2.3.3 Previzualizare camer a . . . . . . . . . . . . . . . . . . . . . . . . . 15 2.3.4 Locat ,ie s ,i vitez a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 2.3.5 Rotirea imaginilor folosind senzorii telefonului . . . . . . . . . . . . 17 2.3.6 MovingAverage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 2.3.7 Comunicarea cu RecordingService . . . . . . . . . . . . . . . . . . . 19 2.4 RecordingService . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 2.4.1 Vosk API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 2.4.2 MediaRecorder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 2.4.3 Comunicarea cu PreviewActivity . . . . . . . . . . . . . . . . . . . 20 2.5 ContinuousRecordingService . . . . . . . . . . . . . . . . . . . . . . . . . . 21 2.6 SettingsActivity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 Concluzii 29 Bibliogra e 30 1 Motivat ,ie Nevoia unei camere de bord ^ n anul 2021 este din ce ^ n ce mai mare, datorit a faptului c a ^ n ultimii ani oras ,ele au devenit tot mai aglomerate s ,i am ajuns s a petrecem cel put ,in o or a pe zi ^ n tra c, f ac^ and naveta la servici de exemplu. Utilitatea camerei de bord a crescut de la doar a surprinde momente c^ and un participant la tra c gres ,es,te, ajung^ and ca ^ n ultimul timp lmarea de la bordul mas ,inii s a poat a folosit a ca prob a de c atre autorit at ,i pentru a stabili vinovatul ^ ntr-un eveniment rutier sau pentru a se autosesiza s a contravent ,ioneze un s ,ofer surprins ^ nc alc^ and codul rutier. Pret ,ul unei camere de bord dedicate este ^ ntre 200 s ,i 1100 RON, dar calitatea unei camere ^ n jurul pret ,ului de 300 RON este joas a, iar cele de 700-800 RON nu sunt o investit ,ie pe care s a s ,i-o permit a s a o fac a oricine ^ n condit ,iile ^ n care multe persoane au bugete relativ reduse pentru cheltuielile cu mas ,ina. Totodat a, pret ,ul unui suport de telefon este ^ n medie 50 RON s ,i cu ajutorul telefonului personal putem avea aceleas ,i functionalit at ,i ca o camer a de bord folosind o aplicat ,ie special conceput a pentru acest lucru. Un avantaj ^ n utilizarea telefonul mobil este c a acesta nu trebuie s a stea mereu conectat la o surs a de curent, pe c^ and marea majoritate a camerelor dedicate de bord trebuie s a stea conectate la o surs a de curent. Totodat a, cablul de ^ nc arcare de la camera dedicat a de bord poate obtura vizibilitatea ^ n tra c a conduc atorului auto. ^In alt a ordine de idei, ^ n cazul unui incident auto, lm arile realizate cu telefonul pot accesate mult mai rapid dec^ at cele f acute cu ajutorul camerei dedicate de bord, la cea din urm a ind nevoie de cele mai multe ori de mai mult timp sau de un laptop pentru accesarea unei anumite secvent ,e dintr-o lmare. Pe de alt a parte, lm arile cu telefonul pot trimise mai departe altor persoane cu mai mult a us ,urint , a, pot decupate doar anumite secvent ,e din ele s ,i pot editate mult mai us ,or. Totodat a, lm arile realizate cu telefonul pot salvate automat folosind un serviciu de stocare ^ n cloud, elimin^ and riscul pierderii lm arilor, ^ n cazul defect arii camerei de 2 bord dedicate sau a telefonului, cardurile de memorie SD av^ and de cele mai multe ori o durat a de viat , a redus a, datorit a scrierii s ,i s ,tergerilor realizate ^ n mod repetat. Demontarea unei camere de bord este de cele mai multe ori destul de di cil a, pe c^ and ^ n cazul unui telefonul scoaterea acestuia din suport este us ,oar a, nemai ind necesar a deconectarea cablului de alimentare s ,i depozitarea sau ascunderea camerei de bord ^ n mas ,in a pentru a nu la vedere. 3 Introducere Aplicat ,iaDashCam Companion are ca scop implementarea funct ,ionalit at ,ilor unei camere de bord dedicate s ,i ad augarea altora noi, aceste funct ,ionalit at ,i vor prezentate ^ n capitolul 1, ^ mpreun a cu o comparat ,ie cu alte aplicat ,ii deja existente. Platforma aleas a pentru aplicat ,ie este Android, deoarece mai bine de 70% din telefoanele mobile la nivel global (conform gs.statcounter.com) au acest sistem de operare. ^In capitolul 2 voi prezenta resursele folosite pentru a dezvolta s ,i testa aplicat ,ia. ^In capitolul 3 voi detalia solut ,ia propus a. 4 Capitolul 1 Arhitectura aplicat ,iei ^In sect ,iunile urm atoare voi descrie funct ,ionalit at ,ile pe care trebuie s a le aib a aplicat ,ia s,i voi prezenta o comparat ,ie cu alte aplicat ,ii deja existente. 1.1 Funct ,ionalit at ,i Funct ,ionalit at ,ile de baz a ale unei camere de bord dedicate sunt: •^ nregistrarea continu a ^ ntr-o bucl a pe un anumit interval de timp s ,i salvarea doar acelei p art ,i •^ nregistrarea continu a f ar a o limit a de timp •a s ,area orei •stocarea s ,i vizualizarea lm arilor realizate s ,i selectarea rezolut ,iei la care s a^ nregistreze camera. •unele camere de bord au s ,i un modul de GPS care adaug a dou a funct ,ionalit at ,i: viteza s ,i locat ,ia, cea din urm a ind a s ,at a ^ n coordonate geogra ce, ne ind de ajutor ^ n unele situat ,ii c^ and se dores ,te a area rapid a a locat ,iei unde a fost f acut a lmarea. Funct ,ionalit at ,ile aduse de DashCam App Companion, pe l^ ang a cele de baz a sunt: •posibilitate de comenzi vocale •selectare camer a cu unghi wide dac a telefonul are 5 •locat ,ia ^ n loc s a e exprimat a ^ n coordonate, se a s ,eaz a ca strad a s ,i localitate, acest lucru ind posibil dac a telefonul este conectat la internet s ,i permite accesul din aplicat ,ie s a acceseze locat ,ia •funct ,ionarea ^ n background a aplicat ,iei pentru a permite utilizatorului s a foloseasc a alte aplicat ,ii. Funct ,ionalit at ,ile indirecte pe care le aduce un telefon fat , a de o camer a de bord au fost prezentate s ,i ^ n motivat ,ia lucr arii, precum: •backup al lm arilor ^ n cloud, deoarece se salveaz a ^ n galeria telefonul, acest lucru ind posibil dac a telefonul are activat a opt ,iunea •urcarea rapid a a lm arilor pe o platform a unde pot vizionate s ,i de alte persoane •editarea lm arii folosind editorul video al sistemului de operare •mai multe opt ,iuni pentru rezolut ,iile camerei s ,i calitate mai bun a a lm arii. 1.2 Comparat ,ie cu alte aplicat ,ii Des ,i nu este o idee original a, toate funct ,ionalit at ,ile de mai sus nu se g asesc ^ n nicio aplicat ,ie de pe magazinul de aplicat ,ii Play Store al sistemului de operare Android. Am realizat o comparat ,ie cu cinci dintre cele mai desc arcate aplicat ,ii, comparat ,ia cu primele trei se reg ases ,te ^ n Figura 1.1, apoi cea cu ultimele 2 ^ n Figura 1.2. 6 Figura 1.1: Comparat ,ie cu trei aplicat ,ii. Figura 1.2: Comparat ,ie cu dou a aplicat ,ii. Un alt aspect este c a aplicat ,iile ment ,ionate mai sus au o interfat , a ^ nc arcat a s ,i uneori neintuitiv a, de aceea am dorit s a realizez aplicat ,ia cu o interfat , a c^ at mai simpl a. 7 Capitolul 2 Implementare ^In urm atoarele sect ,iuni voi prezenta cum funct ,ioneaz a aplicat ,ia s ,i voi explica ecare s,ier relevant din aplicat ,ie. 2.1 AndroidManifest Orice proiect trebuie sa aib a s ,ierul AndroidManifest.xml , acesta descrie informat ,ii despre aplicat ,ie care sunt citite de sistemul de operare s ,i de magazinul Google Play[3]. ^In urm atoarele subsect ,iuni voi detalia ecare informat ,ie relevant a pe care trebuie sa o cont ,in a s ,ierul. 2.1.1 Activit at ,i Numele activit at ,ilor s ,i serviciilor folosite trebuie trecute, altfel acestea nu vor putea pornite. Sunt trei activit at ,i ^ n aplicat ,ie:PreviewActivity – activitatea principal a, ContinuousRecordActivity s,iSettingsActivity . Activit at ,ile aplicat ,iei se reg asesc ^ n listarea 2.1. Listarea 2.1: Permisiunile folosite de aplicat ,ie 8 PreviewActivity este activitatea principal a ^ n momentul ^ n care cre am un proiect nou ^ n Android Studio, este setat a ca activitatea care se deschide atunci c^ and pornim aplicat ,ia. Putem schimba denumirea activit at ,ii sau seta ca alt a activitatea s a e creat a la pornirea aplicat ,iei. Pentru a seta ca o activitate s a e creat a la pornirea aplicat ,iei, trebuie s a aib a formatul din listarea 2.1. 2.1.2 Servicii [4] Pentru ca utilizatorul s a poat a ies ,i din aplicat ,ie, componenta respectiv a trebuie s a funct ,ioneze ^ n continuare. Sunt trei tipuri de servicii ^ n Android: •Foreground – un serviciu de tip foreground c^ and execut a o operat ,ie a s ,eaz a o noti- care ^ n bara de noti c ari a telefonului ^ n care sunt informat ,ii precum denumirea aplicat ,iei s ,i mesajul de la aplicat ,ie, precum s ,i iconit ,e care arat a ce componente foloses ,te aplicat ,ia, camera, microfon sau stocare, folosesc acest tip de serviciu pen- tru inregistrarea camerei, acesta funct ,ioneaz a s ,i c^ and utilizatorul a ies ,it din aplicat ,ie. Noti carea a s ,at a de aplicat ,ie atunci c^ and este pornit serviciul de ^ nregistrare este exempli cat ^ n Figura 2.1. 9 Figura 2.1: Noti care pentru serviciul de ^ nregistrare continu a •Background – un serviciu de tip background este asem an ator cu serviciul de tip foreground , cu except ,ia c a utilizatorul nu este noti cat de funct ,ionarea acestuia. ^Incep^ and cu Android 8.0 – API Level 26 s-au impus restrict ,ii cu privire la funct ,ionarea serviciilor de tip background , dac a aplicat ,ia este minimizat a s ,i serviciul este pornit, acesta va ^ nchis ^ n c^ ateva secunde pentru a economisi resurse. •Bound – un serviciu de tip bound ofer a o interfat , a client-server care permite com- ponentelor s a interact ,ioneze cu serviciile sau s a trimit a cereri de exemplu. 2.1.3 Permisiuni Toate permisiunile de care are nevoie aplicat ,ia s a funct ,ioneze la un moment dat, acestea vor cerute atunci c^ and utilizatorul dores ,te s a foloseasc a o anumit a funct ,ie din aplicat ,ie. Am ^ mp art ,it permisiunile folosite de aplicat ,iaDashCam Companion ^ n dou a categorii: permisiuni de baz a s ,i GPS. Permisiunile de baz a sunt primele patru din listarea 2.2, f ar a acestea aplicat ,ia nu poate a s ,a previzualizarea camerei sau ^ nregistra, astfel nu ^ s,i mai are rostul. Permisiunile GPS sunt pentru a s ,area locat ,iei s ,i vitezei, aplicat ,ia poate funct ,iona f ar a acestea. 10 Listarea 2.2: Permisiunile folosite de aplicat ,ie Permisiunile speci cate ^ n AndroidManifest nu sunt acordate automat, trebuie ce- rute folosind metoda requestPermissions , ^ n listarea 2.3 este a s ,at a cont ,inutul metodei cererePermisiuniBaza ^ n care sunt cerute permisiuni pentru camer a, sunet, stocare s ,i serviciul foreground . Listarea 2.3: Cerere permisiuni pentru aplicat ,ie ActivityCompat . requestPermissions ( PreviewActivity . this ,new String [ ] f Manifest . permission .CAMERA, Manifest . permission .RECORD AUDIO, Manifest . permission .WRITE EXTERNAL STORAGE, Manifest . permission .FOREGROUND SERVICE g, REQUEST CAMERA AUDIO STORAGE FOREGROUND PERMISSIONS) ; 2.2 build.gradle ^Intr-un proiect se creeaz a dou a s ,ierebuild.gradle , unul la nivelul proiectului s ,i unul la nivelul aplicat ,iei. Ne intereseaz a cel din urm a, s ,i anume dou a sect ,iuni din acesta: •sect ,iunea android , aici putem seta pentru ce versiuni de Android s a compil am aplicat ,ia, anume minSdkVersion – versiunea minim a pe care poate s a ruleze aplicat ,ia realizat a s ,itargetSdkVersion – versiunea pentru care a fost conceput a aplicat ,ia, deobicei este ultima versiune de Android ap arut a. Listarea 2.4: – android f compileSdkVersion 30 buildToolsVersion ” 3 0 . 0 . 3 ” 11 defaultConfig f a p p l i c a t i o n I d „com . app . DashCamCompanion” minSdkVersion 23 targetSdkVersion 30 versionCode 1 versionName ” 1.0 ” g compileOptions f sourceCompatibility JavaVersion . VERSION 18 targetCompatibility JavaVersion . VERSION 18 g g •sect ,iunea dependecies , unde am ad augat s ,i implementat libr aria Vosk pentru co- menzi vocale: 2.3 PreviewActivity Clasa PreviewActivity este activitatea principal a atunci c^ and se pornes ,te aplicat ,ia, la nivel funct ,ional, prezint a urm atoarele caracteristici: •s a a s ,eze previzualizarea camerei selectate s ,i la rezolut ,ia salvat a din set ari, dac a este prima oar a c^ and se pornes ,te aplicat ,ia, este selectat a prima camer a s ,i o rezolut ,ie c^ at mai apropiat a de 1920×1080 •din aceasta se poate accesa activitatea de set ari, serviciul de ^ nregistrare continu a sau activitatea de ^ nregistrare ^ n bu er. •s a a s ,eze elementele interfet ,ei gra ce: imaginile cu mas ,ina, butoanele c atre celelalte act ,ivit at ,i s ,i funct ,ionalit at ,ile lor, textele care cont ,in locat ,ia, rezolut ,ia s ,i viteza. Codul surs a al PreviewActivity.java este bazat pe [7], la care am adus urm atoarele modi c ari: •extinde clasa AppCompatActivity , ^ n loc de Fragment s,i implementeaz a clasele TextureView.SurfaceTextureListener ,LocationListener s,iSensorEventList ener ^ n loc de View.OnClickListener s,iFragmentCompat.OnRequestPermission sResultCallback 12 •am eliminat clasele ErrorDialog s,iConfirmationDialog •am eliminat metodele stopRecordingVideo ,startRecordingVideo ,setUpMediaR ecorder ,hasPermissionsGranted ,onRequestPermissionsResult ,requestVide oPermissions ,shouldShowRequestPermissionRationale 2.3.1 AutoFitTextureView Codul surs a al clasei AutoFitTextureView este bazat pe [7], la care am adus urm atoarele modi c ari: ^ n metoda onMeasure am modi cat parametrii cu care este ape- lat a metoda setMeasureDimension . Modi c arile realizate se g asesc ^ n listarea 2.5. Listarea 2.5: Modi c arile aduse AutoFitTextureView i f( width addresses = geocoder . getFromLocation ( l o c a t i o n . getLatitude ( ) , l o c a t i o n . getLongitude ( ) , 1 ) ; String s t r e e t = addresses . get ( 0 ) . getAddressLine ( 0 ) ; String newLocation = s t r e e t . r e p l a c e A l l ( ” [0 −9] ” , „” ) ; newLocation = newLocation . r e p l a c e A l l ( ” , ” , ” , ” ) ; return newLocation ; gcatch ( IOException e ) f 16 e . printStackTrace ( ) ; g return „” ; g 2.3.5 Rotirea imaginilor folosind senzorii telefonului ^In cadrul interfet ,ei am ad augat dou a imagini cu o mas ,in a, prima imagine ilustreaz a partea din fat , a a mas ,inii, iar cea de-a doua partea lateral a, cu scopul de a a s ,a pozit ,ia mas ,inii. Pentru a realiza acest lucru trebuie folosit ,i senzorii telefonului pentru a determina pozit ,ia acestuia, av^ and la dispozit ,ie dou a variante: folosirea giroscopului sau a accelero- metrului ^ n fuziune cu magnetometrul. Din moment ce aplicat ,ia poate rula pe telefoane care au minim Android 6.0, acest lucru ^ nseamn a c a poate rula pe aproximativ 84.9% 1dintre telefoanele cu acest sistem de operare. Aproximativ 20.6%2din telefoane au giroscop. Des ,i cele dou a rezultate sunt date speculative, am ales varianta fuziunii celor doi senzori. Listarea 2.12 realizeaz a accesarea senzorilor cu ajutorul clasei SensorManager , apoi senzorii se pot obt ,ine folosind metoda getDefaultSensor ,mAccelerometer s,imMagneto meter ind de tipul Sensor . Listarea 2.12: Accesarea senzorilor folosind SensorManager mSensorManager = ( SensorManager ) getSystemService (SENSOR SERVICE ) ; mAccelerometer = mSensorManager . getDefaultSensor ( Sensor .TYPE ACCELEROMETER) ; mMagnetometer = mSensorManager . getDefaultSensor ( Sensor .TYPE MAGNETIC FIELD) ; Clasa PreviewActivity implementeaz a SensorEventListener , astfel dup a accesa- rea senzorilor ^ n listarea 2.13 se init ,ializeaz a senzorii apel^ and metoda registerListener . Listarea 2.13: Init ,ializarea senzorilor folosind SensorManager mSensorManager . r e g i s t e r L i s t e n e r ( this , mAccelerometer , SensorManager .SENSOR DELAY NORMAL) ; mSensorManager . r e g i s t e r L i s t e n e r ( this , mMagnetometer , SensorManager .SENSOR DELAY NORMAL) ; 1conform statisticilor oferite de Google ^ n aplicat ,ia Android Studio la creare unui proiect nou ^ n data de 13.06.2021 2conform site-ului www.gsmarena.com, rezultatele c aut arii au fost 2052 din 9956 de telefoane ^ nregistrate pe site au giroscop ^ n data de 13.06.2021 17 Atunci c^ and se schimb a datele senzorilor se apeleaz a metoda onSensorChanged din listarea 2.14, din moment ce sunt doi senzori, pentru a diferent ,ia datele celor doi, se obt ,ine tipul senzorului apel^ and metoda event.sensor.getType() . Valorile senzorului sunt memorate ^ ntr-o matrice de dimensiune 3. Listarea 2.14: Obt ,inerea datelor senzorilor ([1]) i f( event . sensor . getType ( ) == Sensor .TYPE ACCELEROMETER) f float x , y , z ; x = event . values [ 0 ] ; y = event . values [ 1 ] ; z = event . values [ 2 ] ; g i f( event . sensor . getType ( ) == Sensor .TYPE MAGNETIC FIELD) f magneticValues [ 0 ] = event . values [ 0 ] ; magneticValues [ 1 ] = event . values [ 1 ] ; magneticValues [ 2 ] = event . values [ 2 ] ; g Datele senzorilor nu sunt exacte datorit a \zgomotului” (engl., noise -\zgomotul este uct ,uat ,ia aleatoare a datelor m asurate” [1]). Pentru a \netezi” datele senzorilor se foloses ,te un ltru low-pass ilustrat ^ n listarea 2.15, acesta are scopul de a \pondera cea mai nou a valoare fat , a de vechea medie, unde se foloses ,te un parametru de netezire (sau o valoare de ponderare) a”[1]. Valoarea lui apoate ^ ntre 0s,i1. Listarea 2.15: Filtru low-pass ([1]) // simple low −pass f i l t e r float lowPass ( float current , float l a s t ) f return l a s t ∗( 1 . 0 f −a ) + current ∗a ; g Pentru a ^ nt ,elege mai bine cum funct ,ioneaz a ltrul low-pass , ^ n gura 2.2 este a s ,at un gra c cu efectul ltr arii low-pass pe datele accelerometrului, parametrul aav^ and di- verse valori. Dup a cum se poate observa ^ n gura ment ,ionat a, cu c^ at aare o valoare mai mic a, cu at^ at dureaz a mai mult p^ an a c^ and datele ltrate ajung s a aib a o valoare apropiat a fat , a de citirile senzorului. Acest lucru ar ^ nsemna ca rotirea imaginii s a se realizeze ^ ncet, pe de alt a parte dac a aare o valoare mare, precum 0.5, rotirea imaginii s-ar realiza rapid, dar ar crea s ,i un efect de \tremurat” dac a datele senzorului oscileaz a precum ^ n gra c. 18 Figura 2.2: Efectul ltrului low-pass pe datele accelerometrului ([1]) 2.3.6 MovingAverage 2.3.7 Comunicarea cu RecordingService Atunci c^ and aplicat ,ia este minimizat a, procesele din PreviewActivity se opresc, dar cele din RecordingService continu a. Actualizarea interfet ,ei poate f acut a numai din contextul activit at ,ii, ^ ncerc^ and altfel poate duce la scurgeri de memorie. Acest lu- cru este o problem a pentru cronometrul ^ nregistr arii, astfel ^ n RecordingService se realizeaz a cronometrarea, iar timpul actualizat este primit din serviciu folosind clasa BroadcastReceiver . Timpul actual este primit o dat a la ecare secund a, as ,a cum este descris ^ n subsect ,iunea 2.4.3. Informat ,iile din BroadcastReceiver pot accesate din orice clas a. Metoda actualizareTimeRecording creeaz a un BroadcastReceiver s,i actuali- zeaz a cronometrul ^ n interfat , a este detaliat a ^ n listarea 2.16, unde timeRecording este de tipul TextView . Listarea 2.16: Actualizarea cronometrului ^ n PreviewActivity private void actualizareTimeRecording ( ) f BroadcastReceiver timerFromService = new BroadcastReceiver ( ) f @Override public void onReceive ( Context context , Intent i n t e n t ) f String timer = i n t e n t . getStringExtra ( ” timer ” ) ; timeRecording . setText ( timer ) ; g g; r e g i s t e r R e c e i v e r ( timerFromService , 19 new I n t e n t F i l t e r ( ” timerRecordingService ” ) ) ; g 2.4 RecordingService 2.4.1 Vosk API 2.4.2 MediaRecorder [5] Clasa MediaRecorder este folosit a pentru a ^ nregistra sunetul s ,i video-ul ^ n mai multe formate. Pentru a ^ nregistra sunetul s ,i camera telefonului: Listarea 2.17: – mediaRecorder = new MediaRecorder ( ) ; mCameraDevice = camera ; mediaRecorder . setAudioSource ( MediaRecorder . AudioSource .MIC) ; mediaRecorder . setVideoSource ( MediaRecorder . VideoSource .SURFACE) ; mediaRecorder . setOutputFormat ( MediaRecorder . OutputFormat .MPEG 4) ; mediaRecorder . setOutputFile ( mNextVideoAbsolutePath ) ; mediaRecorder . setVideoEncodingBitRate (10000000); mediaRecorder . setVideoFrameRate ( 3 0 ) ; mediaRecorder . setVideoSize ( mVideoSize . getWidth ( ) , mVideoSize . getHeight ( ) ) ; mediaRecorder . setVideoEncoder ( MediaRecorder . VideoEncoder . H264 ) ; mediaRecorder . setAudioEncoder ( MediaRecorder . AudioEncoder .AAC) ; mediaRecorder . prepare ( ) ; mediaRecorder . s t a r t ( ) ; 2.4.3 Comunicarea cu PreviewActivity Atunci c^ and serviciul este pornit, se execut a metoda onCreate , s ,tim c a atunci c^ and se execut a ^ nseamn a c a a ^ nceput ^ nregistrarea. ^In listarea 2.18 se memoreaz a timpul la care a ^ nceput ^ nregistrarea s ,i se pornes ,te cronometrul. Listarea 2.18: Init ,ializare cronometru startTimeRecording = System . currentTimeMillis ( ) ; timerHandler . postDelayed ( timer , 0 ) ; Dup a init ,ializarea cronometrului, ^ n listarea 2.19 se realizeaz a actualizarea acestuia, metoda postDelayed asigur a rularea metodei runo dat a la ecare secund a, al doilea pa- 20 rametru al funct ,iei ind timpul ^ n milisecunde. Prin metoda sendBroadcast se transmite cronometrul actualizat s ,i este preluat de PreviewActivity . Listarea 2.19: Actualizarea cronometrului private final Runnable timer = new Runnable ( ) f @Override public void run ( ) f long m i l l i s = System . currentTimeMillis ( ) −startTimeRecording ; int seconds = ( int) ( m i l l i s / 1000); int minutes = seconds / 60; int hours = minutes / 60; seconds %= 60; timeRecording = String . format ( Locale .US, „%02d:%02d:%02d” , hours , minutes , seconds ) ; Intent timerIntent = new Intent ( ” timerRecordingService ” ) ; timerIntent . putExtra ( ” timer ” , timeRecording ) ; sendBroadcast ( timerIntent ) ; timerHandler . postDelayed ( this , 1000); g g; 2.5 ContinuousRecordingService 2.6 SettingsActivity Activitatea de set ari este bazat a pe modelul oferit de Android Studio – Settings Activity . La crearea acestei activit at ,i, se adaug a ^ n proiect un layout, dar ^ n acesta nu se g asesc set arile propiu-size, se mai adaug a un s ,ierroot preferences.xml , unde sunt de nite c^ ateva exemple de set ari pe care le putem modi ca. Pentru aceste exemple se adaug a un s ,ierarrays.xml unde putem de ni ce cont ,in listele de preferint ,e. Pentru salvarea set arilor s ,i a altor date, folosesc clasa SharedPreferences , aceasta creeaz a un s ,ier cu numele cheii s ,i salveaz a datele dorite ^ n acesta, astfel set arile r am^ an salvate c^ and se reintr a ^ n aplicat ,ie, s ,ierele se s ,terg c^ and aplicat ,ia este dezinstalat a. [2] ^In clasa SettingsActivity se creeaz a clasa SettingsFragment cu metodele onCre atePreferences s,ionPreferenceChange . Prima metod a se execut a la crearea activit at ,ii 21 de set ari, a doua ind apelat a atunci c^ and se schimb a o preferint , a. Set arile stabilite ^ n s,ierul amintit mai sus trebuie init ,ializate apel^ and metoda din listarea 2.20. Listarea 2.20: Init ,ializare set ari cu valorile de nite ^ n root preferences setPreferencesFromResource (R. xml . r o o t p r e f e r e n c e s , rootKey ) ; Figura 2.3: Interfat , a set ari aplicat ,ie ^In gura 2.3 este ilustrat a interfat ,a meniului de set ari, set arile disponibile^ n aplicat ,ie sunt ^ mp art ,ite ^ n trei categorii: 1.Screen informations – sunt cinci set ari legate de interfat , a care pot activate sau dezactivate: Show camera resolution ,Show location ,Show speed ,Show recording timer s,iShow car drawing . Aceste set ari de tipul SwitchPreference atunci c^ and comut a se salveaz a o valoare de tipul boolean ^ nSharedPreferences , av^ and cheia preferint ,ei din root preferences . [6] ^In listarea 2.21 am de nit setarea de a s ,are a rezolut ,iei camerei av^ and cheia pref camera resolution on. Listarea 2.21: – Pentru a veri ca ^ ntr-o activitate dac a setarea este activat a sau dezactivat a, folosesc clasa SharedPreferences . Listarea 2.22: Veri carea st arii unei set ari de tipul SwitchPreference SharedPreferences sharedPref = PreferenceManager . getDefaultSharedPreferences ( this ) ; boolean cameraResolutionTextOn = sharedPref . getBoolean ( ” p r e f c a m e r a r e s o l u t i o n o n ” , true ) ; Al doilea parametru al funct ,ieigetBoolean ^ nseamn a valoarea pe care o va returna ^ n cazul ^ n care pref camera resolution oneste null . 2.Circular capture – o setare este disponibil a pentru ^ nregistrarea din ContinuousCaptureActivity , anume Video length de tipul ListPreference ^ n care se poate selecta durata videoclipului care va salvat: 30 secunde, 1, 2, 3, 5 sau 10 minute. Aceste valori sunt de nite ^ n s ,ierul arrays.xml , matricile de – nite se reg asesc ^ n listarea 2.23. Listarea 2.23: De nirea matricilor pentru Circular capture 30 seconds 1 minute 2 minutes 3 minutes 5 minutes 10 minutes 30 60 120 180 300 600 23 Folosind matricile din listarea 2.23 se poate de ni setarea de tipul ListPreference folosind codul din listarea 2.24. Unde android:entries reprezint a valorile care vor a s ,ate ^ n meniul de select ,ie s ,iandroid:entryValues sunt valorile ^ n secunde care vor returnate atunci c^ and dorim s a a  am opt ,iunea selectat a. Listarea 2.24: De nirea listei de preferint ,e pentru timpul buclei 3.Camera options – ^ n aceast a categorie sunt dou a set ari de tipul ListPreference : Video Sizes s,iCamera unde utilizatorul poate alege la ce rezolut ,ie s a lmeze camera aleas a din a doua setare. ^In acest caz, rezolut ,iile s ,i camerele sunt variabile ^ n funct ,ie de telefon s ,i matricile nu se pot de ni ^ n prealabil ^ n s ,ierul arrays.xml . Astfel creez patru matrici cu o singur a valoare, crearea lor este asem an atoare cu cea din listarea 2.23. Cheile matricilor sunt resolutionTypes ,resolutionTypesValues , camerasAvailable s,icamerasAvailableValues . Metoda onCreatePreferences este apelat a la init ,ializarea activit at ,ii de set ari, ^ n cadrul acesteia obt ,in num arul camerei salvate ^ n SharedPreferences , ^ n cazul ^ n care nu este salvat a nicio valoare, num arul camerei va 0, adic a prima camer a din list a. Urm atorul pas este a area rezolut ,iilor valabile pentru camera g asit a, asem an ator codului din listarea 2.7. Av^ and lista cu rezolut ,iile valabile, folosind SharedPreferences caut rezolut ,ia sal- vat a cu cheia videoSize .^In acest moment, ar trebui s a e o rezolut ,ie salvat a, deoarece ^ n activitatea PreviewActivity a fost salvat a rezolut ,ia1920x1080 , dac a s,ierul cu cheia videoSize nu era creat. Matricea cu rezolut ,iile este de tipul Size[] , pentru a a s ,a aceste rezolut ,ii, le adaug ^ ntr-o matrice de tipul String , ^ n acelas ,i timp creez o matrice tot de acelas ,i tip cu pozit ,iile rezolut ,iilor. Apoi, a u pozit ,ia pe care se a  a rezolut ,ia salvat a ^ n list a, as ,a cum este ilustrat ^ n listarea 2.25. Listarea 2.25: Init ,ializare matrici rezolut ,ii String [ ] s t r i n g V i d e o S i z e s = new String [ v i d e o S i z e s . length ] ; String [ ] indexVideoSizes = new String [ v i d e o S i z e s . length ] ; 24 String videoSize = videoSizeSp . g e t S t r i n g ( „0” , null ) ; for (int i = 0 ; i

Similar Posts