You are on page 1of 58

Programarea dispozitivelor mo-

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

COMPONENTE SUPORT PENTRU MATERIAL DESIGN


A. Toolbar
- bara aplicatiei
- inlocuiete bara de aciune (ActionBar)
- android.support.v7.widget.Toolbar
- android.widget.Toolbar (API 21+)
Macheta activ- <android.support.v7.widget.Toolbar android:id=@+id/toolbar"
itatii android:background=@color/culoare_background" android:layout_width="match_par-
ent"
android:layout_height="?attr/actionBarSize"/>

Tema activitatii Theme.AppCompat.NoActionBar


sau
Theme.AppCompat cu stilul:

<style name=AppTheme" parent="Theme.AppCompat">


<item name=windowNoTitle">true</item>
<item name="windowActionBar">false</item>
</style>
Toolbar - Java

- Clasa derivat din AppCompatActivity,


- Metoda onCreate()
Se instaniaz obiectul de tip Toolbar
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
se asociaz obiectul de tip Toolbar:
setSupportActionBar(toolbar)
- Activare buton UP
ActionBar actionBar = getSupportActionBar();
if (actionBar != null)
{
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeAsUpIndicator(pictograma);
}
B. NavigationView si DrawerLayout
NavigationView
- Include opiunile meniului glisant
- 2 Componente
Antet
Meniul propriu-zis
- Inclus ntr-o component de tip DrawerLayout
- android.support.design.widget
- Proprieti
Poziionare
android:layout_gravity
Antet
app:headerLayout
Meniu
app:menu

<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 onDrawOver(Canvas canvas,RecyclerView parent, RecyclerView.State state)


Desenare peste coninutul elementului

public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state)
Apelat pentru calcularea dimensiunii elementului

- ItemAnimator animeaz elementele la adugare, tergere, reordonare etc.

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

- Permitea definirea relaiilor dintre controalele incluse


Comportament
Nu toate controalele snt compatibile
- Coordoneaz controalele incluse
- Animaie
- Efecte de derulare
- android.support.design.widget
- app:layout_behavior
@string/appbar_scrolling_view_behavior
- Controalele pot extinde clasa
- CoordinatorLayout.Behavior
layoutDependsOn()
onDependentViewChanged()
G. AppBarLayout
- Control linear, vertical
- Implementeaz gesturi de derulare
- Controalele incluse pot preciza comportamentul la derulare
- Bara aplicaiei devine parte a coninutului i reacioneaz la derularea acestuia
- Compatibil cu:
NestedScrollView
RecyclerView
- Funcionalitate dependent de includerea direct ntr-un container de tip
CoordinatorLayout
- android.support.design.widget
- Parametrii de derulare pentru controalele incluse
Proprietatea app:layout_scrollFlags
1. scroll: controlul va fi derulat n afara ecranului
2. enterAlways: controlul va deveni vizibil imediat ce are loc o derulare din afara
ecranului (afiare rapid)
3. enterAlwaysCollapsed: controlul va deveni vizibil, la dimensiunea minim
specificat prin minHeight, imediat ce are loc o derulare din afara ecranului; la
finalizarea derulrii controlul va fi afiat la dimensiune complet
4. exitUntilCollapsed: la derulare, controlul se va restrnge pn la dimensiunea
minim, dat de minHeight, nainte s ias din ecran
5. snap: animaia se realizeaz fr stri intermediare; controlul este ascuns sau
afiat integral
H. CollapsingToolbarLayout
- Efecte de animaie la derulare
- Pe lng bara aplicaiei pot fi incluse i alte controale
- Textul barei aplicaiei este expandat/restrns automat
- android.support.design.widget
- Moduri de restrngere (layout_collapseMode)
off
pin
parallax
I. TabLayout si ViewPager

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

Uri uri = ...


//Pachetul android.provider
ContentResolver cr = getContentResolver();
Cursor date = cr.query(uri, null, null, null, null);
if (date != null)
while(date.moveToNext())
{
//prelucrare linie curenta
}
}

Accesul la furnizorii de coninut predefinii


- Pachetul android.provider
- ContentResolver
Context#getContentResolver()

Implementarea furnizorilor de coninut


- Definire URI-ul asociat coninutului
Crearea definiiilor UriMatcher
- Implementarea clasei abstracte ContentProvider
onCreate()
metode CRUD
obinerea tipului rezultatului

- Declararea furnizorului de coninut n fiierul AndroidManifest.xml


Referirea coninutului
URI de forma content://furnizor[/cale][/id]
furnizor (authority)
identificatorul furnizorului de coninut
trebuie s fie unic pentru fiecare furnizor de coninut
cale
asigur accesul la diferite colecii de date puse la dispoziie de furnizorul de
coninut
un segment din cale poate fi asociat unei tabele dintr-o baz de date relaional
id
Identificatorul unei anumite nregistrri
Constante definite n clasa furnizorului de coninut:
Calls.CONTENT_URI = content://call_log/calls"
- Uri static Uri parse(String)
- ContentUris
static long parseId(Uri)
static Uri withAppendedId(Uri, long)
- UriMatcher:
- CALE Potrivire exact
- CALE/# CALE urmat de o valoare numeric
- CALE/* CALE urmat de un ir de caractere
- CALE/*/SUBCALE/#
- Adugare ci i asocierea de identificatori
Metoda addURI()
- Pe baza cilor furnizate este returnat identificatorul asociat
Metoda match()

Implementarea clasei abstracte ContentProvider


- onCreate()
- getType()
- query()
- insert()
- update(
- delete()

Iniializarea furnizorului de coninut


- Ruleaz n firul principal
- Operaii reduse ca durat
Evitarea deschiderii bazei de date, operaii complexe etc.
- Returneaz o valoare boolean
Rezultatul iniializrii furnizorului de coninut
Tipul MIME asociat
- Pereche de forma tip/subtip
text/xml
application/pdf
- Returnat de metoda getType()
String

Returnarea tipului asociat


- Valoarea vnd.android.cursor.item
coninutul de tip Cursor cu o singur nregistrare
ContentResolver.CURSOR_ITEM_BASE_TYPE

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

Declararea n fiierul AndroidManifest.xml


<provider
android:name="com.pdm.provider.FC"
android:authorities="com.pdm.provider.FC"
android:exported="true" >
</provider>

Cursul 5
RECEPTORI DE MESAJE

Transmiterea i recepionarea mesajelor globale


- La nivel global pot fi transmise mesaje
- Mesajele pot fi transmise din aplicaii:
de sistem
utilizator
- Aplicaiile pot reaciona la apariia mesajelor transmise global, la nivelul sistemului
- Exemple:
Finalizarea descrcrii unui fiier
Identificarea unui dispozitiv (NFC, Bluetooth etc.)
Nivelul bateriei etc.
Mesaje globale
Intent.ACTION_BATTERY_LOW
Intent.ACTION_BOOT_COMPLETED
Intent.ACTION_MEDIA_MOUNTED
Intent.ACTION_SCREEN_OFF
Telephony.Sms.Intents.SMS_RECEIVED

Recepionarea mesajelor globale


Se implementeaz clasa abstract BroadcastReceiver
Receptorii nu prezint interfa grafic
O aplicaie poate avea mai multe componente de acest tip
Includ filtre de mesaje
nregistrarea receptorilor
Receptorii sunt nregistrai:
Static: fiierul manifest XML (elementul receiver)
Dinamic: codul surs
Receptorul
Independent (XML)
Legat de componenta n care este definit (Java)

nregistrarea receptorilor (XML)


Androidmanifest.xml
<receiver android:name=".ClasaReceptor" >
<intent-filter>
<action android:name="ACTIUNE_SPECIFICA" />
</intent-filter>
</receiver>
n fiierul Java
Crearea clasei ClasaReceptor derivat din clasa abstract BroadcastReceiver
nregistrarea receptorilor (Java)
Creare obiect de tip IntentFilter
Creare obiect care implementeaz clasa abstract BroadcastReceiver
nregistrarea unui receptor
registerReceiver()
Deconectarea receptorului
unregisterReceiver()

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()

Transmiterea mesajelor globale


Mesajele snt transmise
Fr prioritate
Cu prioriti
sendBroadcast()
sendOrderedBroadcast()
Parametrul comun: mesajul (Intent)
O form care include:
Permisiunea necesar (String)
Mesaje locale
Clasa LocalBroadcastManager
android.support.v4.content
Obinere instan
LocalBroadcastManager.getInstance(Context)
Transmitere mesaj
sendBroadcast(Intent)
Asociere receptor
registerReceiver(BroadcastReceiver, IntentFilter)
Terminare asociere
unregisterReceiver(BroadcastReceiver)
Servicii
Rutine care ruleaz n paralel cu firul principal
Nu prezint interfa grafic
Permit derularea unor aciuni n fundal fr a bloca firul principal de execuie i
interaciunea cu aplicaiile
Servicii
1. predefinite (sistem)
Numeroase servicii
Notificare
Conectivitate
Descrcare fiiere
Locaie etc.
Gestionate prin clase specializate
Identificate prin constante definite n clasa Context
- Context#getSystemService(String serviciu)
serviciu: ir de caractere cu numele acestuia definit n clasa Context
returneaz un obiect de tipul serviciului:
LocationManager
AudioManager
DownloadManager
WiFiManager etc.
prin intermediul cruia acesta este utilizat.
Notificari:
private final int NOTIF_ID = 1;
String url = "url valid";
//initializare manager notificari
NotificationManager notifMgr = (NotificationManager)
getSystemService(NOTIFICATION_SERVICE);
//intent pentru comportamenul la click pe notficare
Intent intentNotificare = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intentNotificare, 0);
//creare notificare
Notification notif = new Notification.Builder(this)
.setContentTitle("Notificare")
.setSmallIcon(R.drawable.icon).setContentText("Serviciu Info")
.setContentIntent(pendingIntent)
.build()
//transmiterea notificarii notif
notifMgr.notify(NOTIF_ID, notif);
//Pentru oprirea notificrilor:
notifMgr.cancel(NOTIF_ID);
Descrcare fiiere:
DownloadManager dManager = (DownloadManager)
getSystemService(Context.DOWNLOAD_SERVICE);
//cererea de descrcare
Request request = new Request(Uri.parse(urlCurs));
request.setDescription("PDM - Curs");
long dldId = dManager.enqueue(request);
registerReceiver(descarcat, new
IntentFilter( DownloadManager.ACTION_DOWNLOAD_COMPLETE));
//...
BroadcastReceiver descarcat = new BroadcastReceiver() {
public void onReceive(Context ctxt, Intent intent)
{ /* */}
//...
unregisterReceiver(descarcat);
2. servicii utilizator
Senzori
- Componente hardware
Surs de date pentru
Msurarea micrii, orientrii i a condiiilor de mediu
Determinarea poziiei
Exemple:
- Accelerometru msoar acceleraia pe axele x, y i z (TYPE_ACCELEROMETER)
- Ambiental determin nivelul luminii ambientale exprimat n luci (TYPE_LIGHT)
- Proximitate msoar distana n centimetri dintre senzor i un obiect (TYPE_PROXIMITY)
- Busol determin atracia magnetic pe axele x, y i z (TYPE_MAGNETIC_FIELD)
- Giroscop determin viteza de rotaie n jurul axelor x, y i z, msurat n radiani/secund
(TYPE_GYROSCOPE)
- Gravitaie determin gravitaia pe axele x, y i z (TYPE_GRAVITY)
- Presiune msoar presiunea atmosferic (TYPE_PRESSURE)
- Temperatur msoar temperatur (TYPE_TEMPERATURE)
Posibilitatea de preluare a datelor
Pachetul android.hardware
Servicii
SENSOR_SERVICE
Clasa SensorManager
Clasa Sensor
Interfaa SensorEventListener

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)

Obinerea datelor de la senzori


Interfaa SensorEventListener
Modificrile senzorilor
void onSensorChanged(SensorEvent event)
Valorile citite disponibile prin: SensorEvent:
float [] values

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

nregistrarea unui obiect care va fi informat cu privire la modificrile senzorului


registerListener()
Context, senzor, perioada informrii
Eliminarea asocierii
unregisterListener()

Perioada informrii
SensorManager.
SENSOR_DELAY_NORMAL
SENSOR_DELAY_FASTEST
SENSOR_DELAY_UI
SENSOR_DELAY_GAME

Informaii senzori Exemplu


SensorManager sm = (SensorManager)getSystemService(SENSOR_SERVICE);
List<Sensor> senzori = sm.getSensorList(Sensor.TYPE_ALL);
String [] numeSenzori = new String[senzori.size()]; int i = 0;
for (Sensor senz : senzori) {
numeSenzori[i++] = "Nume: " + senz.getName() + "; Tip: " + senz.getType() + "; Max: " +
senz.getMaximumRange();

Preluare date accelerometru


//onResume()
sm.registerListener(this, senzor,SensorManager.SENSOR_DELAY_UI);
//onPause()
sm.unregisterListener(this);
//activitate
public void onSensorChanged(SensorEvent event) {
switch(event.sensor.getType()) {
case Sensor.TYPE_ACCELEROMETER:
tvValori.setText("Valori [m/s^2]");
tvValX.setText("x = " + event.values[0]);
tvValY.setText("y = " + event.values[1]);
tvValZ.setText("z = " + event.values[2]);
break;
}
}
Curs 6
Servicii utilizator
Derivate din clasa Service
Ciclu de via bine determinat
Trebuie declarate n fiierul AndroidManifest.xml

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

Evenimente din ciclul de via


Crearea serviciului
onCreate()
Pornirea serviciului client startService()
onStartCommand()
Conectarea la serviciu client bindService()
onBind()
Terminarea serviciului
onDestroy()

Declarare n fiierul manifest XML


<application ... >
<service android:name=".Serviciu" />
...
</application>
Atribute
android:icon
android:label
android:process
Servicii locale
Evenimente din ciclul de via
1. Conectarea la serviciu: startService()
Serviciul este creat: onCreate()
Se apeleaz metoda onStartCommand()
2. Conectarea la serviciu: startService()
Se apeleaz metoda onStartCommand()
3. ...
4. Terminarea serviciului: stopService()
Serviciul este terminat: onDestroy()
Se realizeaz la primul apel

Structura unui serviciu local

public class Serviciu extends Service {


//metoda trebuie implementat obligatoriu
@Override
public IBinder onBind(Intent arg0) {
return null;
}

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

Iniierea unui serviciu local


Intent intent = new Intent(this, Serviciu.class)
//Apel din client: pornirea serviciului
startService(intent);
// Apel din client: oprirea serviciului
stopService(intent);

Servicii de tip IntentService


Derivare din clasa IntentService
Pune la dispoziie o metod executat ntr-un fir de execuie distinct
Serviciul este oprit dup finalizarea prelucrrilor din metoda invocat
Rezultatele snt trasmise printr-un mesaj (Intent)
Necesar un receptor de evenimente

Structura unui serviciu de tip IntentService

public class Serviciu extends IntentService {


public Serviciu () {
super(Serviciu.class.getName());
}

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

Iniierea unui serviciu local

Intent intent = new Intent(this, Serviciu.class);


//Apel din client: pornirea serviciului
startService(intent);

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

Conectarea la serviciile la distan


Implementarea interfeei ServiceConnection
monitorizeaz starea conexiunii la serviciu
metode
onServiceConnected()
Iniializare obiect de tip interfa serviciu
onServiceDisconnected()
Metoda bindService()
Intent asociat componentei serviciului
Obiectul de tip ServiceConnection
Indicatori (repornirea/terminarea serviciului)

Terminarea execuiei serviciului


Snt reinute referine la fiecare client conectat
Deconectarea clienilor
metoda unbindService() din clasa Context
Terminarea serviciului
Apelul realizat de ctre ultimul client rmas conectat la serviciu
Structura unui serviciu la distan

public class Serviciu extends Service {


@Override
public IBinder onBind(Intent arg0) {
return new InterfataServiciu.Stub() {
//metode serviciu
}
}

@Override
public void onCreate() {
super.onCreate();
}

@Override
public void onDestroy() {
super.onDestroy();
//eliberare resurse
}
}

Iniierea unui serviciu la distan


//...
Serviciu serviciu;
//clas imbricat
class ConexiuneServiciu implements ServiceConnection {
public void onServiceConnected(ComponentName name, IBinder boundService) {
serviciu = InterfataServiciu.Stub.asInterface((IBinder) boundService);
}

public void onServiceDisconnected(ComponentName name) {


serviciu = null;
}}
Servicii
Intent intent = new Intent();
intent.setClassName("pachet", "pachet.Serviciu");
ConexiuneServiciu conexiune = new ConexiuneServiciu ();
//Apel din client: pornirea serviciului
boolean stare = bindService(intent, conexiune,
Context.BIND_AUTO_CREATE);
// Apel din client: oprirea serviciului
unbindService(conexiune);
Curs 7
Aplicaii de tip Widget
Includ ferestre care snt ataate ecranului principal (Home Screen)
Ruleaz n alt proces
Asociat aplicaiei gazd
Ocup o suprafa reprezentat prin celule
Coninutul este actualizat periodic la recepionarea notificrilor
O aplicaie poate gestiona mai multe componente de acelai tip
Sunt definite pe baza receptorilor de mesaje
Folosesc obiecte speciale pentru afiarea interfeei utilizator

Componentele aplicaiilor de tip Widget


1. Fiier de tip machet asociat interfeei
2. Fiier xml cu proprietile aplicaiei
3. Receptor de mesaje
Iniializarea interfeei utilizator
4. Opional, activitate de configurare
5. Pentru colecii, serviciu de tip adaptor
6. Intrri pentru receptor, activitatea de configurare i serviciu n fiierul manifest

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

Modificare stare controale


setTextView*()
setProgressBar()
setImageView*()
setChronometer()
setUri() etc

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

Fiierul xml cu proprieti


Salvat n directorul res/xml
Include proprietile asociate unei aplicaii de tip Widget
Referit n intrarea pentru receptor din fiierul manifest
Nodul rdcin: appwidget-provider
Asociat clasei de tip AppWidgetProviderInfo
Posibilitatea de redimensionare
android:resizeMode (vertical/horizontal)
Categoria
android:widgetCategory (home_screen/keyguard)
Macheta pentru ecranul de blocare
android:initialKeyguardLayout
Activitatea de configurare
android:configure

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

Metode n ciclul de via


onReceive()
onUpdate(Context, AppWidgetManager, int[] id_widgets)
Iniializarea interfeei utilizator
onEnabled()
onDeleted()
onDisabled()

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

Metode specifice RemoteViews


setPendingIntentTemplate()
ablonul pentru evenimentul de click pe un element din colecie
Este transmis identificatorul coleciei
Se utilizeaz n AppWidgetProvider
setOnClickFillInIntent()
Pentru evenimentul de click pe un element din colecie
Se utilizeaz n RemoteViewsFactory
Este transmis identificatorul controlului

AndroidManifest.xml: definirea aplicaiei de tip Widget

Receptorul asociat aplicaiei de tip Widget


- Elementul receiver
- Filtrul de mesaje cu aciunea
android.appwidget.action.APPWIDGET_UPDATE
- Proprieti
meta-data
android-name="android.appwidget.provider"
android:resource="@xml/fisierul_xml_cu_proprietati"
Activitatea de configurare
- Elementul activity
- Filtrul de mesaje cu aciunea
android.appwidget.action.APPWIDGET_CONFIGURE
Serviciul pt adaptor, pentru aplicaii de tip Widget care includ colecii
- Elementul service
- Permisiunea
android.permission.BIND_REMOTEVIEWS

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.

Suport clipuri media


Audio
3gp (AAC),
flac (FLAC),
mp3 (MP3),
mid (MIDI),
ogg (Ogg Vorbis)
wav (PCM/WAVE)
Video 3gp (3GPP) i mp4 (MPEG-4)
codificate H.263 i H.264.

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

Informaii despre clipuri


Artist, titlu, dimensiune, locaie etc.

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

Clase pentru redare/afiare

Clase pentru nregistrare


Utilizare aplicaii implicite

REDAREA CLIPURILOR
Clasa MediaPlayer

Red clipuri media locale i la distan


Se bazeaz pe stri:
iniializat
setDataSource()
pregtit
prepare()
n redare
start()
ntrerupt
pause()
oprit
stop()
Iniializare:
create() metod static
setDisplay(SurfaceHolder)
setDataSource(src)
Redare:
start()
stop()
pause()
setVolume(stinga, dreapta)
Eliberare resurse
release()

Clasa MediaController

Control care include butoane pentru:


redare/ntrerupere, oprire, derulare nainte/napoi, control progres
Definire: dinamic sau n XML
Sincronizat cu strile unui MediaPlayer
Afiare controale
show()
Ascundere controale
hide()
Asociere MediaPlayer
setMediaPlayer(MediaController.MediaPlayerControl)

Redarea clipurilor audio

//Redarea unui clip audio inclus n pachetul aplicaiei


MediaPlayer player = MediaPlayer.create(this, R.raw.muzica);
// sau player = MediaPlayer.create(this, uri);

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()

//nr. max de streamuri, tip stream, calitate - 0 implicit


SoundPool sp = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);
//prioritate; 1 - implicit
int idSound1 = sp.load(this, R.raw.muzica1, 1);
int idSound2 = sp.load(this, R.raw.muzica2, 1);
sp.setOnLoadCompleteListener(new OnLoadCompleteListener() {

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

//redarea unui clip video de pe card


String cale = "/sdcard/DCIM/test video.3gp";
VideoView vv = new VideoView(this);
MediaController mc = new MediaController(this);
vv.setMediaController(mc);
vv.setVideoPath(cale);
vv.requestFocus();
setContentView(vv);
vv.start();

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()

nregistrarea clipurilor audio


Utilizare MediaRecorder
Permisiunea: android.permission.RECORD_AUDIO
Selecie surse de intrare
MediaRecorder aRecorder;
//...
try {
aRecorder = new MediaRecorder();
aRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
aRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
aRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
aRecorder.setOutputFile(NUME_FISIER_AUDIO);
aRecorder.setMaxDuration(3000);
aRecorder.prepare();
aRecorder.start();
} catch(Exception ex)
{}
//Eliberarea resurselor
if (aRecorder != null) {
aRecorder.stop();
aRecorder.release();
aRecorder = null;

UTILIZAREA CAMEREI FOTO/VIDEO


Camera
Acces prin aplicaii dedicate
Intent
Utilizare clase specializate
Camera
android.permission.CAMERA

Camera: aplicaii instalate


Acces prin intermediul mesajelor (Intent)
Captare imagini
Aciune MediaStore.ACTION_IMAGE_CAPTURE
Captare video
Aciune MediaStore.ACTION_VIDEO_CAPTURE
Lansare aplicaie
void startActivityForResult(Intent intent, int cod)
Preluare rezultat
protected void onActivityResult (int requestCode, int resultCode, Intent intent)

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)

Utilizarea aplicaiilor instalate

int CAPTEAZA_IMAGINE = 1;
private void fotoCameraIntent() {
Intent capteazaImagine = new
Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(capteazaImagine,
CAPTEAZA_IMAGINE);
}

private Bitmap fotografie = null;

...

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

Utilizarea clasei Camera


Pachetul android.hardware
Clasa Camera
Depreciat ncepnd cu API 21
nlocuit cu android.hardware.camera2
API > 21 ~ 40% (aprilie 2016)
Iniializare
Detectare camera
Acces la camer
Activitate pentru vizualizare
Client pentru evenimente
Captur
Salvare fiiere
Eliberare resurse

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

Captarea coninutului video


Camera camera = Camera.open();
...
MediaRecorder vRecorder = new MediaRecorder();
//camera este eliberat pentru a putea fi accesat n aplicaie
camera.stopPreview();
camera.unlock();
//asociere camera
vRecorder.setCamera(camera);
//stabilire sursa audio/video
vRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
vRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
vRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);

//stabilire codificare video/audio


vRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
vRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
vRecorder.setOutputFile(NUME_FISIER_VIDEO);
// sh este de tip SurfaceHolder
vRecorder.setPreviewDisplay(sh.getSurface());
vRecorder.prepare();
vRecorder.start();

//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

Precizarea versiunii necesare


AndroidManifest.xml
Elementul uses-feature
Atributul android:glEsVersion
Valori
0x0002000
0x0003000
0x0003001
<uses-feature
android:glEsVersion="0x00020000"
android:required="true" />

Determinarea versiunii OpenGL ES


ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
ConfigurationInfo ci = am.getDeviceConfigurationInfo();
//ci.reqGlEsVersion: 0x20000, 0x30000, 0x30001

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

Programe de tip shader


Compilate i rulate dinamic de ctre unitatea de prelucrare grafic (GPU) a dispozitivului mobil
Stabilesc modul n care sunt redate modelele tridimensionale de ctre procesorul grafic
Definite pentru redarea
vrfurilor vertex shader
Fragmentelor (pixelilor) fragment shader

Etape din fluxul de procesare tridimensionala:


1. Varfuri
2. Rasterizare
3. Fragmente
4. Imagine

ncrcarea, compilarea i utilizarea programelor de tip shader


Exemplu Programe shader

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

Etape n utilizarea Bluetooth n aplicaii:


Activarea Bluetooth
Identificarea dispozitivelor mperecheate sau disponibile
Conectarea dispozitivelor
Canale RFCOMM
Transferul de date ntre dispozitive
Comunicarea prin Bluetooth
Descoperirea reciproc
mperecherea
dispozitivele tiu fiecare de existena celuilalt
i-au salvat reciproc adresele pentru o viitoare comunicare
Comunicarea
se realizeaz prin socket-uri folosind paradigma client-server
Modul de comunicare poate fi descris i n cadrul unui profil (ex. "mini libere)

Permisiuni
android.permission.BLUETOOTH
comunicare
android.permission.BLUETOOTH_ADMIN
scanarea dispozitivelor disponibile
modificarea setrilor Bluetooth

Clase Bluetooth API


BluetoothAdapter
adaptorul local
BluetoothDevice
dispozitiv Bluetooth la distan
obinerea de informaii: nume, adresa, clasa, starea etc.
BluetoothSocket
interfaa pentru un socket Bluetooth
BluetoothServerSocket
socket de tip server Bluetooth, care permite conectarea clienilor
ateapt conexiuni noi
BluetoothClass
descrie caracteristicile unui dispozitiv 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()

BluetoothServerSocket serverSocket = adaptor.listenUsingRfcommWithServiceRecord(nume,uuid);


BluetoothSocket socket = serverSocket.accept();
//Transfer prin socket
serverSocket.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

Bluetooth socket = device.createRfcommSocketToServiceRecord(uuid);


socket.connect();
//Transfer prin socket
Transferul datelor
Obinerea fluxurilor de intrare/ieire asociate socket-urilor
InputStream/OutputStream
Citirea/scrierea din/n fluxuri
read()/write()

InputStream in = socket.getInputStream()
OutputStream out = socket.getOutputStream()
in.read(byte[])
out.write(byte[])

Alte clase Bluetooth API


BluetoothHeadset
ofer suport pentru lucrul cu dispozitive de tip mini libere" sau cti bazate pe
tehnologia Bluetooth
BluetoothA2dp
definete modul n care poate fi transmis sunet de nalt calitate prin intermediul unei
conexiuni Bluetooth pe baza A2DP (Advanced Audio Distribution Profile)
BluetoothHealth
profilul HDP (Health Device Profile) corespunztor dispozitivelor medicale care se pot
conecta prin Bluetooth la un terminal Android

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

NDEF (NFC Data Exchange Format)


Formatul datelor transferate ntre dispozitive conforme NFC Forum
Independent de etichet
Mesaj NDEF
Conine una sau mai multe nregistrri NDEF
nregistrri NDEF
Detalii despre coninut (tip, lungime etc.)
Coninutul propriu-zis
Suport NFC Android
Clase dedicate
android.nfc
android.nfc.tech
android.nfc.cardemulation
API bazat pe standardul NDEF
Tehnologii suportate
NfcA, NfcB, NfcF, NfcV, IsoDep, Ndef, NdefFormatable
MifareClassic
MifareUltralight

Cerine
Permisiune
android.permission.NFC
uses-feature
android.hardware.nfc
android.hardware.nfc.hce

Aciuni sistem pentru NFC


ACTION_NDEF_DISCOVERED
pornete o activitate atunci cnd o etichet ce conine date NDEF este scanat i
recunoscut
ACTION_TECH_DISCOVERED
este pornit direct i n cazul n care
eticheta scanat conine informaii din care nu se pot extrage date de tipul MIME
sau URI
informaia din etichet nu este formatat NDEF, dar este corespunztoare unei
alte tehnologii cunoscute
dac nu exist activiti ce declar c pot manipula mesaje de tipul
ACTION_NDEF_DISCOVERED, atunci sistemul de expediere al etichetelor ncearc s
porneasc o activitate cu acest Intent
ACTION_TAG_DISCOVERED
pornete dac nu exist activiti care pot manipula mesajele precedente

Sistemul de expediere a etichetelor


Se ncearc invocarea unei activitati cu un mesaj de tip Intent identificat la scanarea etichetei NFC
ACTION_NDEF_DISCOVERED, ACTION_TECH_DISCOVERED
Dac nu exist nicio activitate care s manipuleze aceste tipuri de mesaje atunci
ncearc s porneasc o activitate pentru urmtorul tip de mesaj declarat
pn cnd gsete o astfel de activitate
sau pn cnd epuizeaz toate tipurile de mesaje.
Dac nu exist nicio activitate care s manipuleze niciunul dintre mesaje, atunci sistemul se
oprete

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)

Exemplu scriere text NFC:

byte[] payload;//va fi inializat cu textul


// creare inregistrare noua
NdefRecord ndefRecord = new NdefRecord(
NdefRecord.TNF_WELL_KNOWN,
NdefRecord.RTD_TEXT,
new byte[0],
payload);
NdefRecord[] ndefRecords = { ndefRecord };
NdefMessage mesajNdef = new NdefMessage(ndefRecords);

//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

Exemplu citire text NFC


tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
Ndef ndef = Ndef.get(tag);
if (ndef == null) { /*eroare, tag-ul nu suporta
ndef*/ }

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()

Exemplu trimitere mesaj


NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this);
String mesaj; //se compune mesajul
NdefMessage mesajNdef = new NdefMessage(
new NdefRecord[] { NdefRecord.createMime( application/ro.ase.pdm.nfc",
mesaj.getBytes()) });
nfcAdapter.setNdefPushMessage(mesajNdef, this);
class CNMCImpl implements CreateNdefMessageCallback {

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

}
}

//In metoda onCreate() din activitate se inregistreaza apelul asincron


nfcAdapter.setNdefPushMessageCallback( new CNMCImpl (), this);

Recepionarea mesajelor NFC


Filtrul de mesaje
aciunea
android.nfc.action.NDEF_DISCOVERED
tipul MIME asociat aplicaiei
android:mimeType="application/com.pdm.nfc"
Mesajul NDEF inclus n Intent
Cheia NfcAdapter.EXTRA_NDEF_MESSAGES
Exemplu recepionare mesaj
String actiune = getIntent().getAction();
if (actiune.equals(NfcAdapter.ACTION_NDEF_DISCOVERED)) {
Parcelable[] mesajeNdef = intent.getParcelableArrayExtra(
NfcAdapter.EXTRA_NDEF_MESSAGES);
// preluarea mesajului
NdefMessage mesajNdef = (NdefMessage) mesajeNdef[0];
String mesaj = new String(mesajNdef.getRecords()[0].getPayload());
//utilizarea mesaj
}

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

Metode interfa nativ


Creare/Conversii iruri
Tratare excepii
Creare/copiere vectori
Accesare cmpuri
Apelare metode
Acces la maina virtual Java
Sincronizare execuie

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

Fiiere n cadrul proiectului


Fiier surs Java
Include metodele implementate n mod nativ
Fiier antent C/C++
Include semnturile metodelor native
Poate fi generat pe baza fiierului Java care le expune
Fiier surs C/C++
Include implementarea metodelor native

Fiierul Java cu metode native


ncarc biblioteca cu funciile native
Expune funciile native aplicaiilor Java
Declararea metodelor
<vizibilitate> native <tip returnat> nume_metoda(<lista parametri>);
Metodele statice i de instan

ncrcarea bibliotecilor
System.loadLibrary()
Calea curent
System.load()
Calea trebuie specificat complet

Exemplu fiier Java cu metode native


public class TestNDK {
static {
System.loadLibrary("biblioteca");
}

public native String invText(String string);


public native int[] sortAsc(int[] vector);
}

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

Declararea metodelor n fiierul surs nativ

JNIEXPORT <tip compatibil returnat> JNICALL


Java_<cale clasa>_nume_metoda(
JNIEnv * , jobject, <lista parametri>);

JNIEXPORT <tip compatibil returnat> JNICALL


Java_<cale clasa>_nume_metoda(
JNIEnv *, jclass, <lista parametri>);

Declararea metodelor native


JNIEXPORT i JNICALL
destinate asigurrii compatibilitii cu mediul Windows
Tip compatibil returnat de metod
Numele metodei are o structur impus
prefixul Java_
calea complet separat cu "_" ctre clasa Java ce utilizeaz metoda nativ
numele metodei din Java
Parametrii metodei native
Pointer la interfaa Java-Nativ (JNINativeInterface), JNIEnv
Referin la obiectul cu tipul generic jobject sau jclass
Lista de parametri ai metodei Java

Accesare componentelor Java


Apeluri metode
GetMethodID()
CallTipMethod()
Referire cmpuri
GetFieldID()
SetTipField()
GetTipField()

Instrumente utile
javah
genereaz un fiier antet C/CPP (.h) corespunztor metodelor native
javap
genereaz semnturile metodelor

Android NDK (Native Development Kit)


Component a platformei de dezvoltare Android
Permite implementarea de funcionaliti n cod nativ, n limbajele C sau C++
Funcionaliti cu cerine de performan ridicate
grafic 3D
prelucrarea n timp real a sunetelor i imaginilor
prelucrare video
efectuarea de calcule complexe
Criterii de alegere
cerinele aplicaiei
complexitatea i efortul necesar implementrii native n raport cu sporul de
performan adusa

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

Accesul la componente Android

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

Application Binary Interface (ABI)


Stabilete modul n care aplicaia interacioneaz cu sistemul la execuie
Similar cu arhitectura setului de instruciuni
Informaii furnizate
Setul de instruciuni utilizat
Formatul fiierelor executabile binare
Convenii de apel
Dimensiunile i modalitatea de aliniere a datelor n memorie

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

Tipuri de aplicaii pentru Android Wear


Aplicaii dedicate dispozitivelor portabile
Carduri contextuale n fluxul de carduri
Notificri trimise de aplicaiile Android de pe dispozitivul mobil
Notificri contextuale de pe dispozitivul portabil (ceas)

Aplicaii pentru Android Wear


Necesit o aplicaie companion
Aplicaie Android standard
Numele pachetului trebuie s fie identic
Aceleai permisiuni pentru ambele aplicaii
n Google Play, aplicaia pentru dispozitivul portabil este inclus n pachetul aplicaiei mobile
Instalare automat pentru
Biblioteca Wearable UI
Notificaii
Sincronizarea aplicaiilor
Proiectarea ecranelor pentru ceas

Activiti (Android Studio)


Fr activitate
Always On
Blank Wear
Display Notification
Google Maps Wear
Watch Face

API-uri nesuportate
android.webkit
android.print
android.app.backup
android.appwidget
android.hardware.usb

ELEMENTE DE INTERFA SPECIFICE


Activiti i fragmente
WearableActivity
Clas de baz pentru activitile specifice dispozitivelor portabile
ConfirmationActivity
Activitate care afieaz animaii de confirmare dup ce utilizatorul efectueaz o
anumit aciune
CardFragment
Fragment pentru prezentarea coninutului ntr-un card
Cardul este expandabil i se deruleaz pe vertical
Containere
BoxInsetLayout
Derivat din FrameLayout
Adapteaz coninutul dup forma dispozitivului (rotund sau dreptunghiular)
WatchViewStub
Deserializeaz un container n funcie de tipul (forma) ecranului dispozitivului
portabil (ceas)

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

Serviciul de localizare Android


Se utilizeaz serviciul de localizare identificat prin:
nume: Context.LOCATION_SERVICE
Se obine un obiect de tip LocationManager
Localizare prin diferite surse:
Receptorul GPS
Reele WiFi, celule mobile
Permisiuni
android.permission.ACCESS_FINE_LOCATION
android.permission.ACCESS_COARSE_LOCATION
Iniializare serviciu de localizare
Asocierea unui obiect de tip listener cu precizarea:
Sursei utilizat la localizare
Intervalul de timp la care se face actualizarea datelor
Notificri n momentul apariiei de modificri legate de:
Poziia geografic
Starea sursei de localizare
ntreruperea asocierii cu obiectul de tip listener
Frecvena de actualizare!

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

Poziionare geografic - Exemplu

//clasa va recepiona noua poziie


class GPSListener implements LocationListener {
@Override
public void onLocationChanged(Location poz) {
/*poz.getLatitude(), poz.getLongitude(), poz.getAltitude(); */
}
//...
}
//crearea obiect utilizat pentru recepionarea actualizrilor poziiei
GPSListener gl = new GPSListener();
//iniializare serviciu localizare
LocationManager lm = (LocationManager)
getSystemService(Context.LOCATION_SERVICE);
//asociere obiect recepionare actualizri
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, gl);
//terminare asociere
lm.removeUpdates(gl);

SERVICIUL DE LOCALIZARE GOOGLE LOCATION SERVICES API


Poziionare geografic
Google Play Services
Fused Location Provider
Combin furnizorii disponibili n funcie de cerinele aplicaiei
Precizie
Consum de energie
Selectarea celui mai potrivit serviciu

1. Determinare disponibilitate Google Play Services


2. Creare i iniializare client Google API
a) GoogleApiClient
3. Implementare interfee apeluri inverse pentru conectarea la servicii
a) GoogleApiClient.ConnectionCallbacks
b) GoogleApiClient.OnConnectionFailedListener
4. Implementare interfa pentru recepionarea poziiei curente
a) com.google.android.location.LocationListener

5. Asociere obiect pentru recepionarea poziiei curente


a) LocationRequest

Iniializare client Google Play Services


GoogleApiClient
Integrarea serviciilor Google Play
Iniializare
GoogleApiClient.Builder

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

Actualizare poziie geografic


Interfaa LocationListener
pachetul com.google.android.location.
Recepionarea poziiei curente
public void onLocationChanged(Location location)
LocationServices.FusedLocationApi.requestLocationUpdates( googleApiClient,
locationRequest,this); //LocationListener

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

Clase Google Maps API v2


Pachetul com.google.android.gms.maps
MapView
Control care ncapsuleaz o hart
MapFragment
Fragment care ncapsuleaz o hart
UiSettings
Control setri interfaa hart
Marker
Pictograme pe hart
Proprieti
Titlu
Poziie (coordonate) LatLng (latitudine i longitudine)
Pictogram etc.
GoogleMaps#addMarker(MarkerOptions)
MarkerOptions
Stabilire opiuni obiect de tip Marker

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()

Clasa GoogleMap - Adgarea de figuri geometrice


Cerc
Circle addCircle(CircleOptions)
Linii
Polyline addPolyline(PolylineOptions)
Imagine
GroundOverlay addGroundOverlay(GroundOverlayOptions)
Poligon
Polygon addPolygon(PolygonOptions)

Fiierul xml asociat (res/layout)


fragment
android:id="@+id/harta"
android:name=com.google.android.gms.maps.MapFragment"

Fiierul java asociat


((MapFragment) getFragmentManager().findFragmentById(R.id.harta))
.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(GoogleMap map) {
//utilizare harta
});

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

You might also like