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
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Aihtpqcenmfngjmzzv@twzhhq.online 735 Licenta 2021 Text (ID: 700042)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.