Professional Documents
Culture Documents
bile
Cursul 1 - 3
NAVIGAREA N APLICAII
1. Panou de control (Dashboard)
2. List
3. Bar de aciune
4. Bar de instrumente
5. Meniu
6. Selectori (tab)
7. Meniu glisant
MATERIAL DESIGN
Teme noi
Controale noi
Animaii
Efecte de umbrire
CULORI
a) colorPrimaryDark
bara de stare
b) colorPrimary
bara aplicaiei
c) colorAccent
controlul selectat
d) textColorPrimary
e) windowBackground
f) navigationBarColor
<android.support.design.widget.NavigationView
android:id="@+id/navigation_view"
android:layout_height="match_parent"
android:layout_width="wrap_content"
android:layout_gravity="start"
app:headerLayout="@layout/antet"
app:menu="@menu/meniu_drawer"/>
DrawerLayout
- Container suport pentru meniul glisant
- Dou componente
Meniul
Containerul de coninut al activitii
- Implicit meniul este ascuns
- Activarea meniului
Glisare
Butonul dedicat din bara de aciune
- Uzual, meniul este poziionat n stnga ecranului, dar poate fi amplasat i n dreapta
acestuia
openDrawer()
closeDrawers()
Tratarea evenimentelor
- setNavigationItemSelectedListener()
OnNavigationItemSelectedListener
onNavigationItemSelected(MenuItem menuItem)
- ActionBarDrawerToggle
C. RecyclerView
- nlocuitor pentru controale de tip list (ListView, GridView)
- Management eficient al memoriei
- Sarcinile snt distribuite
Poziionare
Animaie
- Tratarea evenimentele de selecie nu este la fel de facil
- Adapter asociere colecie de date i crearea de controale pentru fiecare element din colecie
- Definit n pachetul android.support.v7.widget
- Se bazeaz pe ablonul ViewHolder
- Este derivat din RecyclerView.Adapter<VH>
- include o clas privat, static, derivat din RecyclerView.ViewHolder (VH)
responsabil cu iniializarea controalelor
- Metode abstracte
public int getItemCount()
public VH onCreateViewHolder(ViewGroup parent, int viewType)
public void onBindViewHolder(VH holder, int position)
- ViewHolder container pentru controalele asociate datelor elementului curent
- LayoutManager poziioneaz elementele n suprafaa disponibil
1. LinearLayoutManager List de elemente
2. GridLayoutManager Afiare tabelar
3. StaggeredGridLayoutManager - Afiare tabelar cu adaptare la coninut
Afiare vertical (implicit) i orizontal
- ItemDecoration decoreaz elementele afiate
- Desenarea peste elemente
- Utilizat pentru
Personalizarea elementelor
Evidenierea elementelor
Desenarea de separatori ntre elemente
- Pot exista mai multe obiecte de tip ItemDecoration apelate n ordinea adugrii
public void onDraw(Canvas canvas, RecyclerView parent, RecyclerView.State state)
Desenare nainte de afiarea coninutului elementului
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state)
Apelat pentru calcularea dimensiunii elementului
Tratarea evenimentelor
- Implementare n adaptor
- Implementare n clasa de tip activitate
- Obiectul de tip View din constructorulViewHolder
setOnClickListener()
- n onBindViewHolder() se stocheaz n ViewHolder elementul corespunztor din sursa de date
- Se implementeaz onClick(View)
View elementul apsat
Se testeaz n prealabil dac este iniializat un element din sursa de date asociat
- Implementare RecyclerView.OnItemTouchListener
- Definire interfa n cadrul clasei
Metode pentru apsare sau apsare prelungit pe element
- onInterceptTouchEvent()
Determinare element
Determinare poziie element
- Utilizare GestureDetector pentru determinarea aciunilor apsare/apsare prelungit
- Asociere obiect de tratare a evenimentelor addOnItemTouchListener()
D. CardView
- Control utilizat pentru afiarea grupat a informaiei, sub forma unui card
- Permite
efecte de umbrire
coluri rotunjite
- Utilizat deseori n cadrul listelor
- android.support.v7.widget
- Proprieti
- app:elevation
- app:cardCornerRadius
- app:contentPadding
- compile 'com.android.support:cardview-v7:23.2.0'
E. TextInputLayout
- Afieaz sugestiile cu privire la textul care trebuie introdus ntr-un control de editare
- Controlul de editare este inclus n containerul TextInputLayout
- Se bazeaz pe proprietatea android:hint a controlului de editare
- Dup introducerea textului, sugestiile vor fi afiate deasupra controlului de editare
Textul suport nu dispare dup introducerea coninutului
- Posibilitatea de afiare de mesaje de eroare
- android.support.design.widget
- compile com.android.support:design:23.1.1
<android.support.design.widget.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<EditText
android:id="@+id/editTextParola"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Parola"
android:inputType="textPassword" />
</android.support.design.widget.TextInputLayout>
- Gestiunea mesajelor de eroare
setErrorEnabled()
- apelul nainte de afiarea erorii nu se va modifica dimensiunea controlului
- XML: android.support.design:errorEnabled
isErrorEnabled()
setError() - null pentru tergerea mesajului
getError()
F. CoordinatorLayout
ViewPager
- Derularea orizontal a coninutului
- android.support.v4.view.ViewPager
- Fragmente pentru coninut
Clase de tip Fragment
Machete asociate
- Adaptor
Extinde clasa
FragmentStatePagerAdapter
FragmentPagerAdapter (s.f.m.)
Constructor cu FragmentManager
Fragment getItem(int pozitie)
int getCount()
TabLayout
- Afiarea grupat a coninutului
- Coninutul accesibil prin intermediul selectorilor (tab-uri)
- Suport pentru ViewPager
- Selectorii pot fi fici sau derulani
- Selectorii pot ocupa spaiul n mod egal sau pot fi centrai
- android.support.design.widget
- Proprieti
tabMode (modul de afiare a selectorilor: fixed sau scrollable)
tabGravity (modul de centrare a coninutului: fill sau centre)
- Evenimente
OnTabSelectedListener
TabLayoutOnPageChangeListener
ViewPagerOnTabSelectedListener
- Asociere cu ViewPager
setupWithViewPager()
J. Floating Action Button (FAB)
- Buton flotant
- Execuia rapid a unei aciuni frecvente
- android.support.design.widget
- Proprieti
fabSize (normal, mini)
src (pictograma asociat)
backgroundTint (culoarea de fundal; implicit se alege colorAccent)
K. Snackbar
- Afiarea rapid a unui mesaj scurt
- Posibilitatea de ntreprindere a unei aciuni prin intermediul unui buton
- Mesajul dispare
dup un interval prestabilit
prin glisare
prin acionarea butonului (dac exist)
- android.support.design.widget
- Creare
metoda make() - Control (View), mesaj, durat
- Adugarea unei aciuni
Metoda setAction() -Text buton aciune, obiect de tip OnClickListener
- Afiare Metoda show()
J. NestedScrollView
- Necesitate:
Utilizarea unui control cu derulare n cadrul altui control cu derulare
- android.support.v4.widget.NestedScrollView
Cursul 4
Furnizori de continut
Partajarea datelor
- Pentru partajarea datelor ntre aplicaii se utilizeaz i furnizorii de coninut care pun la dis-
poziie un mecanism standardizat pentru transferul datelor ntre aplicaii
- Surse de date:
fiiere
baze de date
alte surse (Internet)
- O alternativ la furnizorii de coninut: comunicarea ntre procese
Furnizorii de continut
- Acces deseori ierarhic
- Baz de date
- Mai multe tabele
Coloane
Rnduri
- Referire prin URI
- Coninutul are asociat un tip MIME
Accesul la furnizorii de coninut
- Valoarea vnd.android.cursor.dir
coninutul de tip Cursor cu zero sau mai multe nregistrri
ContentResolver.CURSOR_DIR_BASE_TYPE
- Este necesar includerea subtipului
Interogarea datelor
- Metoda query()
- Parametri
identificatorul furnizorului de coninut (Uri);
coloanele corespunztoare datelor (proiecia) (String[])
criteriul de selecie (String)
parametrii de selecie (String[])
ordinea de sortare a acestora (String)
- Returneaz un obiect de tip Cursor
Inserarea
- Metoda insert()
- Parametri
identificatorul furnizorului de coninut (Uri)
valorile asociate nregistrrii (ContentValues)
- Returneaz un Uri asociat nregistrrii inserate
Include identificatorul nregistrrii
Modificarea
- Metoda update()
- Parametri
identificatorul furnizorului de coninut (Uri)
dac nu este inclus un identificator, modificarea se aplic tuturor nregistrrilor
valorile asociate cmpurilor care se vor modifica (ContentValues)
criteriul de selecie (String)
parametrii de selecie (String[])
- Returneaz numrul de nregistrri afectate
tergerea nregistrrilor
- Metoda delete()
- Parametri
identificatorul furnizorului de coninut (Uri)
dac nu este inclus un identificator, vor fi terse toate nregistrrile
criteriul de selecie (String)
parametrii de selecie (String[])
- Returneaz numrul de nregistrri afectate
Notificarea executrii operaiilor
- ContentObserver
Clas abstract
Apeluri inverse la apariia modificrilor onChange()
- Metode n clasa ContentResolver
registerContentObserver()/unregisterContentObserver()
notifyChange()
- Inserare, modificare, tergere
- Se transmite Uri-ul asociat nregistrrii modificate
- Exemplu apel
getContext().getContentResolver().
notifyChange(uri, null);
Cursul 5
RECEPTORI DE MESAJE
Prelucrarea mesajelor
Metoda onReceive(Context, Intent)
Mesajul este primit ca parametru
Prelucrri la recepionarea mesajului
Reprezint durata de via a unui receptor
Oprirea retransmiterii mesajului n sistem (pentru mesajele cu prioriti)
abortBroadcast()
Utilizare senzori
Iniializarea serviciului
nregistrarea unui listener care va fi informat cu privire la modificrile aprute
Listener-ul este asociat unui senzor
Metoda corespunztoare este apelat periodic cu valorile senzorului
Terminarea asocierii listener-ului
Clasa Sensor
- Denumire
getName()
- Puterea utilizat (mA)
getPower()
- Informaii despre senzor
getVendor()
getVersion()
- Valoarea maxim
getMaximumRange()
- Tipul
Constante de format TYPE_ (TYPE_LIGHT)
SensorManager
Obinerea unui anumit senzor (Sensor)
getDefaultSensor(tip)
Iniializare list de senzori de un anumit tip (List< Sensor>)
getSensorList(tip)
Sensor.TYPE_ALL pentru toi senzorii disponibili
Perioada informrii
SensorManager.
SENSOR_DELAY_NORMAL
SENSOR_DELAY_FASTEST
SENSOR_DELAY_UI
SENSOR_DELAY_GAME
Servicii
1. Servicii locale
Uzual, ruleaz n acelai proces cu aplicaia care a pornit serviciul
2. Servicii la distan
Ruleaz n propriul proces
Comunicare inter-proces
RPC, AIDL (Android Interface Definition Language) etc.
3. Servicii fr referin
nu permit clienilor interaciunea
doar pornire i terminare
iniializate folosind metoda startService() din clasa Context
4. Serviciile cu referin
permit continuarea comunicrii din partea clientului dup ce acesta a fost iniializat
iniializate prin metoda bindService() din clasa Context
@Override
public void onCreate() {
super.onCreate();
/*initializare serviciu*/
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//iniiere operaii serviciu
}
@Override
public void onDestroy() {
super.onDestroy();
//eliberare resurse ; terminare serviciu
}
}
@Override
public void onCreate() {
super.onCreate();
//initializare serviciu
}
@Override
protected void onHandleIntent(Intent intent) {
//prelucrri de durat
}
@Override
public void onDestroy() {
super.onDestroy();
//eliberare resurse
}
}
SERVICII LA DISTAN
Comunicarea ntre procese
Fiiere
Socket
Transmiterea de mesaje
Partajarea memoriei
Furnizori de coninut
Intent
Messenger
Binder
Interfaa IBinder
Descrie protocolul de comunicare cu un obiect la distan
Extinderea clasei Binder
Interfee AIDL
Clasa Messenger
Implementat prin intermediul AIDL
Utilizeaz obiecte Handler i Message
Comunicarea cu serviciul
Limbajul AIDL (Android Interface Definition Language)
asemntor Java
Fiier .aidl
Include interfaa cu metodele puse la dispoziie de serviciu
Compilatorul genereaz o interfa Java
Interfaa generat
Metodele puse la dispoziie de interfaa serviciului
Clasa abstract Stub
Extinde Binder
Implementeaz interfaa generat
Include clasa Proxy
Implementeaz apelul metodelor din interfa
Serviciul
Extinde clasa abstract Stub din interfaa generat
Implementeaz metodele puse la dispoziie de serviciu
Metoda onBind()
Returneaz obiectul de tip Stub
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onDestroy() {
super.onDestroy();
//eliberare resurse
}
}
Interfaa utilizator
Definit prin fiiere de resurse de tip machet
Este expus prin obiecte de tip RemoteViews
Obiectele sunt gestionate de sistem
Limitri n ceea ce privete tipul controalelor ce pot fi utilizate
Containere
FrameLayout
GridLayout
LinearLayout
RelativeLayout
Controale
AnalogClock
Button
Chronometer
ImageButton
ImageView
ProgressBar
TextView
ViewFlipper
Colecii
GridView
ListView
StackView
AdapterViewFlipper
RemoteViews
Constructor cu iniializare layout
Nume pachet, layout
Aciuni controale
Transmiterea de mesaje (obiecte de tip Intent) la apsarea controalelor
Metoda setOnClickPendingIntent(id_buton, pend_intent)
Nu este disponibil pentru elementele coleciilor!
Apeluri metode
Atributul @RemotableViewMethod
setLong()
setInt() etc
Proprieti
Macheta iniial
android:initialLayout
Dimensiuni
android:minWidth, android:minHeight
Recomandat: (numrul_de_celule * 70) 30 dp
Frecvena de actualizare
android:updatePeriodMillis
Imaginea afiat pentru aplicaie n lista de aplicaii disponibile (resurs)
android:previewImage
Receptorul
Asociat aplicaiei de tip Widget
Include metode specifice receptorilor de mesaje, dar i metode proprii
Are ca scop
Actualizarea interfeei
Definirea mecanismelor de tratare evenimentelor generate de interaciunea cu aplicaia
AppWidgetProvider
Derivat din BroadcastReceiver
Notificri specifice aplicaiei
actualizare
activare
dezactivare
tergere
AppWidgetManager
Actualizarea strii aplicaiilor de tip Widget
Obinerea de informaii despre aplicaiile de tip Widget instalate
Transmiterea structurii interfeei
updateAppWidget(id_widget, remote_views)
updateAppWidget(ComponentName, remote_views)
Activitatea de configurare
Configurarea i actualizarea aplicaiei
Lansat n momentul crerii aplicaiei
Activitatea primete ca parametru prin mesaj identificatorul aplicaiei
AppWidgetManager.EXTRA_APPWIDGET_ID
Utilizarea coleciilor
Se bazeaz pe un serviciu pentru popularea coleciei
RemoteViewsService
Necesit un adaptor special care implementeaz interfaa
RemoteViewsService.RemoteViewsFactory
Adaptorul este asociat cu metoda setRemoteAdapter() din clasa RemoteViews
RemoteViewsService
Responsabil cu returnarea unui obiect care implementeaz interfaa:
- RemoteViewsService.RemoteViewsFactory
Implementeaz metoda onGetViewFactory()
RemoteViewsFactory
Constructor
Context
Obiect de tip Intent
onCreate()
apelat la crearea obiectului de tip factory
onDataSetChanged()
apelat la notificarea de actualizare a coleciei
onDestroy()
getViewAt()
invocat pentru fiecare element al coleciei n parte
returneaz un obiect de tip RemoteViews
se completeaz mesajul de tip ablon cu valori concrete, legate de poziia curent
n colecie
getCount()
returneaz numrul de elemente ale coleciei
getItemId()
Returneaz identificatorul elementului de la poziia dat
getLoadingView()
Permite utilizarea unui obiect personalizat pentru iniializarea controlului
null se utilizeaz cel implicit
hasStableIds()
Specific dac un identificator refer acelai obiect
getViewTypeCount()
Numrul de tipuri de controale returnate de clasa de tip factory
Cursul 8
Resurse de tip multimedia
Locale
Incluse n pachetul aplicaiei (resurse i coninut)
Sistemul de fiiere
Biblioteci globale media
Disponibile la distan (server)
Accesibile prin diferite protocoale
HTTP, HTTPS
RSTP etc.
Operaii
Redare
Prezentarea coninutului media ntr-o form specific
Captare
Preluarea coninutului media i salvarea sau retransmiterea acestuia
Prelucrare
Modificarea coninutului media sau aplicarea de transformri specifice acestuia (rotiri,
translatri, modificare frecvene etc.)
Imagini
Afiare (ecran, n memorie)
Captare imagini (camera, memorie, ecran)
Prelucrare imagini
Audio
Redare clipuri audio cu posibiliti de control al derulrii
nregistrare clipuri audio (Microfon)
Prelucrare clipuri audio (frecven, volum etc.)
Video
Redare clipuri video cu posibiliti de control al derulrii
nregistrare clipuri video (Camera i microfon)
Prelucrare clipuri video
Redare
Sursa media
nregistrare
Sursa (camera, microfon etc.)
Destinaia
fiier local
fiier la distan
streaming etc.
Formatul fiierului
Codec-ul utilizat
Multimedia Android
Pachete:
android.media
android.hardware
Includerea de capabiliti hardware
camera, autofocus, flash, front
Includerea de permisiuni de acces
camera
microfon
memoria extern
Internet etc.
Referirea resurselor
Referire prin identificator, URI sau cale
Incluse n proiect (directorul raw)
Identificator resurs: R.raw.id_resurs
Fiiere locale
Uri: file:///sdcard/Audio3.mp3
Cale: /sdcard/Audio3.mp3
Fiiere la distan (protocoale RTSP, HTTP/HTTPS)
Uri: http://pdm.ase.ro/Audio.mp3
MediaStore
Furnizor de coninut
Acces global la clipurile media din sistem
Clase specializate pe coninut:
MediaStore.Audio
MediaStore.Video
MediaStore.Images
Exemplu MediaStore
String[] coloane = {
MediaStore.Images.ImageColumns._ID, MediaStore.Images.ImageColumns.DATA };
String sortare = MediaStore.Images.ImageColumns._ID + " DESC";
Cursor imagini = getContentResolver().query( MediaStore.Images.Media.EXTERNAL_CON-
TENT_URI, coloane, null, null, sortare);
try {
if (imagini.moveToFirst()) {
int indexData = imagini.getColumnIndex(
MediaStore.Images.ImageColumns.DATA);
String caleImagine = imagini.getString(indexData);
Bitmap fotografie = BitmapFactory.decodeFile( Uri.parse(caleImagine).getPath());
imagini.close();
}
} catch (Exception ex) { ex.printStackTrace();
}
REDAREA CLIPURILOR
Clasa MediaPlayer
Clasa MediaController
player.setLooping(true);
player.start();
//eliberarea resurselor ocupate
if (player != null) {
player.stop();
player.release();
player = null;
}
Clasa SoundPool
Gestioneaz o colecie de clipuri audio de scurt durat preluate din resurse i ncrcate n
memorie
Redare rapid, consum redus de resurse
Posibilitate de redare simultan
Metode
load()
play(), stop()
autoResume(), autoPlay()
setOnLoadCompleteListener()
@Override
public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
float lVol = 1f; float rVol = 1f;
//id, vol dr., vol. st., prioritate (0 - min), loop (-1 continuu), rate 1 - normal
//soundPool.play(sampleId, rVol, lVol, 0, 0, 1);}
});
Clasa AudioTrack
Nivel sczut
Control
Frecven, format, tip sunet (mono/stereo), dimensiune zon tampon
Posibilitate modificare dinamic a coninutului audio
Secvene de tsonuri
REDAREA CLIPURILOR VIDEO
Clasa VideoView
Control care permite redare clipurilor video
Metode control clip:
start(), pause(), stopPlayback()
Metode informare
getDuration(), getCurrentPosition(), isPlaying()
Asociere clipuri
setVideoPath(String)
setVideoUri(Uri)
Asociere controale control
setMediaController(MediaController)
NREGISTRAREA CLIPURILOR
Clasa MediaRecoder
Necesit parcurgerea unor etape bine-stabilite
1. Stabilirea sursei de intrare: microfon, camera etc.
setAudioSource()
setVideoSource()
2. Stabilirea fiierului de ieire
setOutputFile()
3. Stabilirea formatului acestuia
setOutputFormat()
4. Stabilirea tipului de codificare audio/audio
setAudioEncoder()
setVideoEncoder()
5. Dimensiunea clipului
setVideoSize()
6. Numrul de cadre pe secund
setVideoFrameRate()
7. Suprafaa pe care se previzualizeaz coninutul video
setPreviewDisplay()
1. Fr parametri
2. Parametri
Cheia: MediaStore.EXTRA_OUTPUT
Valoare: Uri (colecia de clipuri)
3. Parametri
Cheia: MediaStore.EXTRA_OUTPUT
Valoare: Uri (sistemul de fiiere)
int CAPTEAZA_IMAGINE = 1;
private void fotoCameraIntent() {
Intent capteazaImagine = new
Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(capteazaImagine,
CAPTEAZA_IMAGINE);
}
...
@Override
protected void onActivityResult(int codCerere,int codRezultat, Intent data) {
if (resultCode == Activity.RESULT_OK && requestCode ==CAPTEAZA_IMAGINE) {
Bundle rezultat = data.getExtras();
fotografie = (Bitmap) rezultat.get("data");
}
}
Clasa Camera
Iniializare
CameraParameters
Camera.open(idCamera)/open()
Camera.getNumberOfCameras()
setPreviewDisplay(SurfaceHolder)
lock()/unlock()
takePicture()
Captarea imaginilor
PictureCallback pcb = new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
try {
/*Preluare ir de octei imagine i prelucrare*/
}
catch (IOException ex) {
/*tratare excepie */
}
}};
camera.takePicture(null, null, pcb);
//eliberare resurse
vRecorder.stop();
vRecorder.reset();
vRecorder.release();
vRecorder = null;
//reconectare serviciu camera
camera.reconnect();
Previzualizare
Control special
Derivare din clasa SurfaceView
Utilizeaz un obiect de tip SurfaceHolder
Utilizare interfaa SurfaceHolder.Callback -notificri cu privire la modificare suprafeei:
surfaceChanged() - iniializarea camerei(parametri)
surfaceCreated() - previzualizarea imaginilor
surfaceDestroyed() - eliberarea resurselor
Utilizarea API camera2
android.hardware.camera2
CameraManager
CameraDevice
CameraCharacteristics
CameraCaptureSession
CaptureRequest
Cursul 9
Grafic 3D
- Biblioteca OpenGL ES
Subset OpenGL
- Android, suport pentru versiunile
1.x (API 1)
2.0 (API 8)
3.0 (API 18)
3.1 (API 21)
OpenGL ES
- Clasele snt definite n pachetele
android.opengl
android.opengl.GLES10
android.opengl.GLES11
android.opengl.GLES20
android.opengl.GLES30
android.opengl.GLES31
- Interfeele OpenGL ES sunt definite n pachetele
javax.microedition.khronos.egl
javax.microedition.khronos.opengles
Matrice de transformare
Dimensiunile 4 x 4
Matricea model
controleaz transformrile cu privire la obiect (model)
Matricea View
controleaz transformrile cu privire la camer (view)
Matricea de proiecie
controleaz transformrile cu privire la perspectiv
Transformri
Coordonatele obiectului (definit prin intermediul vrfurilor)
transformate n coordonatele camerei
Coordonatele camerei
transformate n coordonatele planului de decupare
Normalizarea coordonatelor
Coordonatele planului de decupare
transformate n coordonatele ecranului (fereastra de vizionare).
Grafic 3D
Component vizual specializat
clas care implementeaz interfaa GLSurfaceView
Operaiile de desenare
clas care implementeaz interfaa GLSurfaceView.Renderer
GLSurfaceView.Renderer
Metode cu apel invers apelabile:
la iniializarea suprafeei
onSurfaceCreated()
public void onSurfaceCreated(GL10 gl, EGLConfig config)
la modificarea suprafeei
onSurfaceChanged()
public void onSurfaceChanged(GL10 gl, int width, int height)
- Stabilire fereastr de vizionare
- Stabilire perspectiv
la desenare
onDrawFrame()
public void onDrawFrame(GL10 gl)
Pregtire suprafa
Stabilire poziie vizualizare
- Desenare propriu-zis
OPENGL ES 1.X
Grafic 3D
Puncte tridimensionale i matrice
Interfaa GL10
Metode (GL10)
glVertexPointer()
Definirea unui vector de vrfuri
glClear()
tergerea suprafeei
glClearColor()
stabilirea culorii de fundal
glDrawArrays()
glDrawElements()
desenare pe baz unui vector de puncte
triunghiuri (GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN),
puncte (GL_POINTS),
linii (GL_LINES, GL_LINE_STRIPE, GL_LINE_LOOP
OPENGL ES 2.0/3.X
OpenGL 2.0/3.x vs. 1.x
Operaiile de desenare i proiecie sunt controlate de programator
Control mai bun asupra prelucrrilor grafice tridimensionale
Bazate pe programe (shaders) scrise n limbajul OpenGL Shader Language
Incompatibilitate
vertexShaderCode fragmentShaderCode
precision mediump float; varying lowp vec4 v_color;
uniform mat4 u_mvpMatrix; void main()
//matricea de transformare {
attribute vec4 a_position; //pozitia gl_FragColor = v_color;
attribute vec4 a_color; //culoarea }
varying vec4 v_color;
void main()
{
gl_Position = u_mvpMatrix
* a_position;
v_color = a_color;
}
Desenarea
Clasele asociate controlului i suprafeei snt aceleai
Selectare versiune
setEGLContextClientVersion(vesiune)
Metode statice GL20
Parametrul de tip GL10 nu este utilizat
Cursul 10
Bluetooth
Tehnologia permite schimbul de informaii fr fir ntre diferite dispozitive
Viteze mult mai mari (spre deosebire de IR, NFC)
Necesitatea mperecherii dispozitivelor Bluetooth n vederea comunicrii
pierde la capitolul uurin n conectare
Profile specificaii pentru comunicaii fr fir ntre dispozitive
Radio frequency communication (RFCOMM)
Suport Android
Scanarea pentru descoperirea de dispozitive
Obinerea dispozitivelor conectate i conectarea la alte dispozitive
Transferul de date ntre dispozitive
Managementul simultan al conexiunilor
Permisiuni
android.permission.BLUETOOTH
comunicare
android.permission.BLUETOOTH_ADMIN
scanarea dispozitivelor disponibile
modificarea setrilor Bluetooth
BluetoothAdapter
Descoperirea altor dispozitive Bluetooth
Obinerea listei dispozitivelor deja mperecheate
Instanierea unui obiect de tip BluetoothDevice corespunztor unui alt dispozitiv
Crearea obiecte de tip BluetoothServerSocket care ateapt date prin socket de la alte
dispozitive
getDefaultAdapter()
iniializarea adaptorului Bluetooth disponibil
null nu exist adaptor pe dispozitiv
isEnabled()
dac serviciul este oprit, cerere de activare
ACTION_REQUEST_ENABLE
aciune pentru activarea serviciului
getBondedDevices()
lista dispozitivelor mperecheate
Set<BluetoothDevice>
getRemoteDevice(adresa)
startDiscovery()
cancelDiscovery()
BluetoothDevice
getName()
numele dispozitivului
getAddress()
adresa
getBluetoothClass()
clasa Bluetooth (tipul dispozitivului PHONE_SMART, COMPUTER_WEARABLE)
getBondState()
starea mperecherii (BOND_NONE, BOND_BONDING, BOND_BONDED)
getType()
tipul dizpozitivului (DEVICE_TYPE_CLASSIC, DEVICE_TYPE_LE
DEVICE_TYPE_DUAL, DEVICE_TYPE_UNKNOWN)
getUuids()
identificatorii
Transferul datelor
Server
Client
Operaii care blocheaz
Necesitatea utilizrii firelor de execuie
Implementare server
Obinerea unui obiect de tip BluetoothServerSocket
listenUsingRfcommWithServiceRecord(nume, uuid) din BluetoothAdapter
Ateptarea cererilor de conectare i efectuarea conexiunii
accept()
Transfer prin socket
nchiderea conexiunii
close()
Implementare client
Obinerea unui obiect de tip BluetoothDevice asociat dispozitivului de la distan
Obinerea unui obiect de tip BluetoothSocket
createRfcommSocketToServiceRecord(uuid)
Iniierea conexiunii
connect()
modul de cutare trebuie dezactivat n prealabil
Transfer prin socket
InputStream in = socket.getInputStream()
OutputStream out = socket.getOutputStream()
in.read(byte[])
out.write(byte[])
Cursul 11
NFC
Consoriul NFC Forum
Conectarea fr fir a dou dispozitive aflate la o distan foarte mic (de maxim 10 cm)
Conectare n mod direct (fr mperechere sau descoperire reciproc)
Viteze reduse (sute de Kbps)
Frecvena 13.56 MHz
Asigur schimbul de pachete de date ntre
etichete NFC i dispozitive
dispozitive
Moduri de lucru
Citire/scriere (RFID)
dispozitivul poate citi sau scrie informaii de pe sau pe etichete NFC pasive
Peer-to-peer (P2P)
dispozitivele NFC schimb date ntre ele
mod folosit de Android Beam
Emulare card
dispozitivul NFC se comport ca un simplu card
folosit n special pentru pli electronice
Etichete NFC
Type 1
Bazat pe standardul ISO14443 A
Capacitatea memoriei: 96 B, expandabil la 2 KB
Viteza de transfer: 106 kbit/s
Type 2
Bazat pe standardul ISO14443 A
Capacitatea memoriei: 48 B, expandabil la 2 KB
Viteza de transfer: 106 kbit/s
Type 3
Bazate pe sistemul Sony FeliCa
Configurate de productor
Capacitatea memoriei: 2 KB
Viteza de transfer: 212 kbit/s
Type 4
Compatibil cu standardele ISO14443 A i B
Configurate de productor
Capacitatea memoriei: pn la 32 KB
Viteza de transfer: ntre 106 kbit/s i 424 kbit/s
NXP MIFARE
Implementri proprii ale standardului ISO14443 A
Tipuri
MIFARE Classic
MIFARE DESFire
MIFARE Plus
MIFARE Ultralight
Cerine
Permisiune
android.permission.NFC
uses-feature
android.hardware.nfc
android.hardware.nfc.hce
Clase NFC
NfcAdapter
- Asociat adaptorului NFC al dispozitivului
- Obinerea adaptorului
getDefaultAdapter(Context)
- Starea adaptorului
isEnabled()
- Starea Android Beam
isNdefPushEnabled()
Ndef
Formatul NDEF
- Datele snt ncapsulate n interiorul unui obiect de tip NdefMessage
- Obiectul de tip NdefMessage conine unul sau mai multe obiecte de tip
NdefRecord
- Obiectele de tip NdefRecord conin
datele i tipul informaiei coninute de nregistrare
NdefMessage
NdefRecord
tnf modul de interpretare (Type Name Format) al cmpului type; constante
TNF_ABSOLUTE_URI (pentru adrese absolute)
TNF_MIME_MEDIA (pentru coninut de tip media) etc.
type tipul nregistrrii; constantele utilizate sunt
RTD_TEXT (pentru coninut de tip text)
RTD_URI (pentru coninut de tip Uri) etc.
id identificator unic pentru nregistrare (byte[])
payload datele efective care se doresc a fi citite sau scrise (byte[]);
coninutul integral al mesajului poate fi inclus n mai multe nregistrri
SCRIEREA/CITIREA
Generarea obiectelor de tip NdefRecord
Metode statice n clasa NdefRecord
createApplicationRecord()
aplicaie definit prin pachetul complet (API 14)
createUri()
adres referit printr-un obiect de tip Uri (API 14)
createMime()
date precizate prin MIME (API 16)
createExternal()
date externe aplicaiei (API 16)
createTextRecord,
text codificat UTF8 (API 21)
//scrierea propriu-zisa
Ndef ndef = Ndef.get(tag);
ndef.connect();
ndef.writeNdefMessage(mesajNdef);
ndef.close();
Citirea etichetelor
Atunci cnd un dispozitiv Android scaneaz o etichet NFC ncearc identificarea
tipului MIME corespunztor datelor
unui obiect de tip Uri
else {
NdefMessage mesajNdef = ndef.getCachedNdefMessage();
NdefRecord[] ndefRecords = mesajNdef.getRecords();
for (NdefRecord ndefRecord : ndefRecords) {
// doar daca este de tip text
if (ndefRecord.getTnf() == NdefRecord.TNF_WELL_KNOWN
&&Arrays.equals(ndefRecord.getType(),
NdefRecord.RTD_TEXT)) {
// obtinere continut
byte[] payload = ndefRecord.getPayload();
//preluare text din payload i utilizare
}
}
}
MODUL PEER-TO-PEER
Transmiterea de mesaje peer-to-peer
Trimiterea de mesaje ntre dou dispozitive
Android Beam
Se creeaz un obiect de tip NdefMessage
conine cel puin o nregistrare de tipul NdefRecord cu datele care vor fi transmise
Metode
setNdefPushMessage()
parametru: obiectul de tip NdefMessage care va fi transmis
setNdefPushMessageCallback()
asincron
apelat doar atunci cnd cele dou dispozitive intr n raza de comunicare
obiectul de tip NdefMessage este creat doar atunci cnd acest lucru este
necesar
prioritatea mai mare fa de setNdefPushMessage()
@Override
public NdefMessage createNdefMessage(NfcEvent event) {
String mesaj;//mesajul va fi iniializat
NdefMessage mesajNdef = new NdefMessage( new NdefRecord[]
{
NdefRecord.createMime( "application/ro.ase.pdm.nfc", mesaj.getBytes())});
return mesajNdef;
}
}
Cursul 12
Java Native Interface (JNI)
Platform care permite
apelul funciilor native din aplicaiile Java
accesarea obiectelor Java din funciile native
Codul nativ are acces la funcionalitile mainii virtuale Java
JNIEnv
Interfaa nativ Java
Pointer la tabela de funcii cu funciile JNI disponibile
Accesul la funcii care asigur interoperabilitatea ntre Java i codul nativ
Toate metodele native au acces la aceast interfa
Tipuri de date
Simple
Referine
iruri
- Nu pot fi utilizate direct
- Necesit conversie
- Creare ir nou (nativ Java)
NewString()/NewStringUTF()
- Conversie (Java nativ)
GetStringChars()/GetStringUTFChars ()
ReleaseStringChars()/ReleaseStringUTFChars()
Vectori
- Creare vector
NewTipArray()
- Copiere vector (Java nativ)
GetTipArrayRegion()
- Copiere vector (nativ - Java)
SetTipArrayRegion()
- Accesul direct
GetTipArrayElements()
ReleaseTipArrayElements()
Cmpuri
Metode
ncrcarea bibliotecilor
System.loadLibrary()
Calea curent
System.load()
Calea trebuie specificat complet
Fiierele native
Antetul metodelor native
Include implementarea nativ a codului
Toate metodele au acces la pointer la tabela de funcii cu funciile JNI disponibile
(JNIEnv)
Implementare diferit C/C++
.C, CPP
Metode native
De instan
primesc contextul n care are loc apelul
echivalentul pointerului this
Statice
Primesc un parametru asociat referinei clasei din care face parte metoda
Instrumente utile
javah
genereaz un fiier antet C/CPP (.h) corespunztor metodelor native
javap
genereaz semnturile metodelor
Etape
Instalare NDK/Verificare instalare NDK
Sursele native sunt stocate n directorul jni din proiect
Se creeaz fiierul Android.mk
Descrie fiierele surs native
Compilarea surselor native
Scriptul ndk-build
=> Rezult o bibliotec dinamic nativ (.so/.dll)
Compilarea i crearea fiierului binar Android
Biblioteca nativ este inclus n fiierul binar (apk)
Componenta NDK
Instrumente de compilare
Fiiere antet
Biblioteci
Exemple
Scripturi dedicate dezvoltrii de module native
Variabile de mediu
NDK_ROOT
Scripturi
ndk-build
Compilarea i editarea de legturi
ndk-build clean
tergerea tuturor fiierelor rezultate
Android.mk
LOCAL_PATH
Calea ctre fiierele surs
Macrodefiniia my-dir ntoarce calea ctre directorul care conine fiierul Android.mk
directiva include $(CLEAR_VARS)
include n fiierul curent coninutul unui fiier Makefile predefinit identificat de variabila
CLEAR_VARS;
reseteaz valorile variabilelor de tipul LOCAL_* folosite pentru a configura compilarea
LOCAL_MODULE
descrie numele modulului ce trebuie compilat;
modulul rezultat va purta numele de lib<nume_bibliotec>.so
LOCAL_SRC_FILES
indic lista de fiiere C sau C++ ce trebuie compilate
directiva include $(BUILD_SHARED_LIBRARY)
include n fiierul curent coninutul unui script predefinit care gestioneaz procesul de
compilare i editarea de legturi a modulului dinamic descris de variabilele LOCAL_*
Exemplu fiier Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := <nume_bibliotec>
LOCAL_SRC_FILES := <nume_ bibliotec>.cpp
include $(BUILD_SHARED_LIBRARY)
Application.mk
APP_OPTIM
APP_ABI
APP_ABI := all
APP_STL
APP_CPPFLAGS
APP_PLATFORM
APP_BUILD_SCRIPT
jobject bitmap;
jclass clasa = env->FindClass("android/graphics/Bitmap");
jmethodID metLat = env->GetMethodID(clasa,"getWidth", "()I");
jmethodID metInalt = env->GetMethodID(clasa,
"getHeight", "()I");
jint lat = env->CallIntMethod(bitmap, metLat);
jint inalt = env->CallIntMethod(bitmap, metInalt);
Tipuri ABI
armeabi asociat procesoarelor ARM care suport cel puin setul de instruciuni
ARMv5TE
armeabi-v7a asociat procesoarelor ARM cu suport extins (Thumb-2, virgul mobil etc
arm64-v8a pentru procesoarea ARM care suport arhitectura AArch64
x86 i x86_64 - asociate procesoarele bazate pe setul de instruciuni x86 sau IA-32,
respectiv x86 pe 64 bii
mips i mips64 asociate procesoarelor cu arhitectura MIPS32, repectiv MIPS64
Cursul 13
Dispozitive portabile
Procesor
Qualcomm SnapDragon 400 1.2 GHz
Bluetooth 4.x
512 MB RAM
4GB memorie nevolatil
Baterie 400 mAh
1.3 inch, 320 x 320
Android Wear instalat pe dispozitivul mobil
Cele dou dispozitive conectate folosind tehnologia Bluetooth
Conectivitatea bazat pe dispozitivul mobil
API-uri nesuportate
android.webkit
android.print
android.app.backup
android.appwidget
android.hardware.usb
Adaptoare i liste
GridViewPager
Permite navigarea vertical sau orizontal n cadrul paginilor
Coninutul este furnizat de un obiect de tip GridPagerAdapter
Indicarea pagini curente, fa de celelalte pagini, este realizat printr-un control de
tip DotsPageIndicator
FragmentGridPagerAdapter
Implementarea unui GridPagerAdapter, n care paginile snt de tip fragment
WearableListView
Control de tip list de elemente, adaptat pentru dispozitive portabile
Controale
DismissOverlayView
Control care implementeaz apsarea prelungit pentru renunare
DelayedConfirmationView
Afieaz un cronometru descresctor pentru a permite confirmarea unei aciuni
Controale imagini
CircledImageView
Control de tip ImageView nconjurat de un cerc
CrossFadeDrawable
Obiect de tip Drawable care conine dou elemente Drawable i permite
combinarea acestora
Notificri
Crearea notificrilor
Clasele
Notification i Notification.Builder sau
NotificationCompat i NotificationCompat.Builder
Stiluri
NotificationCompat.Style
BigPictureStyle, BigTextStyle, InboxStyle, MediaStyle
Trimiterea notificrilor
NotificationManager sau NotificationManagerCompat
Extensii notificri
NotificationCompat.WearableExtender
addPage()/addPages()
addAction()/addActions()
setBackground()
setHintHideIcon()
Notification.Builder
extend()
Transferul de informaii
Sincronizare
Mesaje
Fiiere
Bazat pe GoogleApiClient
Crearea clientului
Wearable.API
Sincronizarea datelor
Wearable.DataItem
PutDataRequest
DataItem.DataListener
Transmiterea mesajelor
Wearable.MessageApi
Programarea multiplatforma
Xamarin
Limbajul C#
Suport Windows, Mac
Android SDK
Android NDK
Platforme de dezvoltare
Raspberry PI
Arduino
Intel Galileo
Cursul 14
Determinarea poziiei geografice
Serviciul de localizare Android
Serviciul de localizare Google Location Services API
Clasa LocationManager
Mai multe suprancrcri ale metodei requestLocationUpdates()
Asocierea unui obiect de tip LocationListener sau PendingIntent pentru informri
cu privire la modificrile poziiei
Parametri comuni:
Intervalul minim de actualizare
Distana minim de actualizare (corelat cu intervalul de actualizare)
Ali parametri
Sursa de localizare:
GPS_PROVIDER sau NETWORK_PROVIDER din clasa LocationManager)
unui criteriu de selecie (clasa Criteria)
Obiectul care implementeaz interfaa LocationListener sau obiectul de tip
PendingIntent
removeLocationUpdates(LocationListener/PendingIntent)
Obinerea ultimei poziii cunoscute
Location getLastKnownLocation(String sursa)
Informaii despre starea receptorului GPS
GpsStatus getGpsStatus(GpsStatus status)
Interfaa LocationListener
Recepionarea de notificri la modificarea poziiei geografice
Pe baza cerinelor de actualizare (interval i distan)
Metoda principal
void onLocationChanged(Location poz)
Coordonatele accesibile prin clasa Location
Clasa Location
Coordonate
getLatitude(), getLongitude(), getAltitude()
Viteza
getSpeed()
Timp
getTime()
Acurateea localizrii
getAccuracy()
Alte informaii
GoogleApiClient.Builder
addConnectionCallbacks()
GoogleApiClient.ConnectionCallbacks
addOnConnectionFailedListener()
GoogleApiClient.OnConnectionFailedListener
addApi()
LocationServices.API
addScope()
OAuth 2.0
build()
Creare obiect GoogleApiClient
Conectare GoogleApiClient
Conectare
connect()
void onConnected(Bundle bundle)
Deconectare
disconnect()
Iniializare LocationRequest
setInterval()
Intervalul n care aplicaia recepioneaz actualizrile (ms)
setFastestInterval()
Intervalul n care aplicaia poate prelucra actualizrile (ms)
setPriority()
PRIORITY_HIGH_ACCURACY
Precizie maxim
PRIORITY_BALANCED_POWER_ACCURACY
Nivel de strad (100 m)
PRIORITY_LOW_POWER
Nivel de ora (10 km)
PRIORITY_NO_POWER
Poziia curent este recepionat de la alte aplicaii
LocationServices.FusedLocationApi.removeLocationUpdates(googleApiClient, this);
//LocationLister
Google Maps
Google Maps API v2
Se bazeaz pe serviciul Google Maps
Biblioteca opional
Inclus n Google Play services
Categoria Extras n SDK Manager
Google Play services APK trebuie s fie instalat i pe dispozitivul mobil
Faciliti
hri 3D, interior, satelit, teren, trafic, marcaje, plane suprapuse, trasare linii etc.
Iniializare
nregistrare la Google Maps Service pentru obinerea unei chei pentru Maps API
https://code.google.com/apis/console
Cheia va fi inclus n fiierul AndroidManifest.xml
Instalare Google Play services SDK
Adugarea proiectului bibliotecii Google Play services la spaiul de lucru
Referirea bibliotecii Google Play services n proiectul de lucru
Clasa GoogleMap
Controlul hrii
Iniializare
Metoda MapFragment#getMap() sau MapView#getMap()
Control camer
moveCamera(CameraUpdate)
CameraUpdateFactory
Tip hart
setMapType(tip_harta)
MAP_TYPE_NORMAL, MAP_TYPE_SATELLITE, MAP_TYPE_TERRAIN
Control setri
getUiSettings()
Google Maps
Fiierul AndroidManifest.xml
Permisiuni (minim):
INTERNET, WRITE_EXTERNAL_STORAGE,
com.google.android.providers.gsf.permission.READ_GSERVICES"
Cheia Google Maps API
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="cheia generata" />
Exemplu
if (map != null) {
LatLng latLong = new LatLng(lat, longit);
map.setMyLocationEnabled(false);
map.moveCamera( CameraUpdateFactory.
newLatLngZoom(latLong, 18));
Marker marker = map.addMarker(new MarkerOptions().position(latLong));
marker.setTitle(locatie);
marker.showInfoWindow();
}