Upload
others
View
9
Download
0
Embed Size (px)
Citation preview
Dispozitive și aplicații mobile
Cursul 12
Sumar
• Utilizarea serviciilor Android• Determinarea poziției geografice• Google Maps în aplicații
SERVICII
Servicii
• Rutine care rulează în paralel cu firul principal • Nu prezintă interfaţă grafică • Permit derularea unor acţiuni în fundal fără a bloca firul
principal de execuţie şi interacţiunea cu aplicaţiile• Servicii predefinite (sistem) și servicii utilizator
Servicii
• Servicii locale– Rulează în același proces cu aplicația care a pornit serviciul
• Servicii la distanță– Rulează în propriul proces– Comunicare inter-proces
• RPC, AIDL (Android Interface Definition Language) etc.
Servicii de sistem
• Servicii predefinite– Notificare– Conectivitate– Descărcare fișiere– Alarme– Localizare etc.
• Gestionate prin clase specializate• Acces prin intermediul clasei Context
Servicii predefinite
• getSystemService(String serviciu) – clasa Context– serviciu:
• șir de caractere cu numele acestuia, definit în clasa Context
– returnează un obiect de tipul serviciului:• LocationManager• AudioManager• DownloadManager• WiFiManager etc.
prin intermediul căruia acesta este utilizat.
Servicii predefinite
Servciu Constantă asociată (clasa Context)
Alarm ALARM_SERVICE
Bluetooth AUDIO_SERVICE
Location LOCATION_SERVICE
Notification NOTIFICATION_SERVICE
Sensor SENSOR_SERVICE
Telephony TELEPHONY_SERVICE
Wifi WIFI_SERVICE
PendingIntent
• Mesaj transmis unei aplicații pentru efectuarea unor operații cu permisiunile aplicației sursă
• Acțiunea se execută în viitor– Aplicația care a transmis mesajul poate să fie inactivă în momentul
execuției acestuia
PendingIntent• Implementează interfața Parcelable• Parametri de inițializare
– context, identificator, Intent, indicatori• Inițializare (metode statice)
– Pentru lansarea unei activități• getActivity()
– Pentru transmiterea unui mesaj global• getBroadcast()
– Pentru lansarea unui serviciu• getService()
• Indicatori– FLAG_ONE_SHOT, FLAG_NO_CREATE, – FLAG_CANCEL_CURRENT, FLAG_UPDATE_CURRENT
Servicii predefinite – Exempluprivate final int NOTIF_ID = 1; String url = "url valid";
//initializare manager notificariNotificationManager notifMgr = (NotificationManager)
getSystemService(NOTIFICATION_SERVICE);
//comportamenul la click pe notficareIntent intentNotificare = new
Intent(Intent.ACTION_VIEW, Uri.parse(url)); PendingIntent pendingIntent =
PendingIntent.getActivity(this, 0, intentNotificare, 0);
Servicii predefinite – Exemplul 1 (cont.)Notification notif = new Notification.Builder(this)
.setContentTitle("Notificare")
.setSmallIcon(R.drawable.icon)
.setContentText("Serviciu Info")
.setContentIntent(pendingIntent).build()
//transmiterea notificarii notifnotifMgr.notify(NOTIF_ID, notif);
//Pentru oprirea notificărilor:notifMgr.cancel(NOTIF_ID);
Servicii predefinite – Exemplul 2
DownloadManager dManager = (DownloadManager) getSystemService(
Context.DOWNLOAD_SERVICE);
Request request = new Request(Uri.parse(urlCurs));
request.setDescription("PDM - Curs");long idd = dManager.enqueue(request);
Servicii predefinite – Exemplul 2 (cont.)//asociere receptorregisterReceiver(descarcat, new IntentFilter(
DownloadManager.ACTION_DOWNLOAD_COMPLETE));
//definire receptorBroadcastReceiver descarcat = new BroadcastReceiver() {
public void onReceive(Context ctxt, Intent intent) { //fișierul a fost descărcat}//eliminare asociere receptorunregisterReceiver(descarcat);
Servicii utilizator
• Derivare din clasa Service• Derivare din clasa IntentService• Declarare în fișierul manifest XML
<application ... ><service android:name=".Serviciu" />...
</application>
DETERMINAREA POZIȚIEI GEOGRAFICE
Poziționarea geografică
• Se utilizează serviciul de localizare identificat prin nume:Context.LOCATION_SERVICE– Se obține un obiect de tip LocationManager
• Localizare prin diferite surse:– Receptorul GPS– Rețele WiFi, celule mobile
• Permisiuni– android.permission.ACCESS_FINE_LOCATION– android.permission.ACCESS_COARSE_LOCATION
Poziționare geografică
• Inițializare serviciu de localizare• Asocierea unui obiect de tip listener cu precizarea:
– Sursei utilizată la localizare– Intervalul de timp la care se face actualizarea datelor
• Notificări în momentul apariției de modificări legate de:– Poziția geografică– Starea sursei de localizare
• Întreruperea asocierii cu obiectul de tip listener• Frecvența de actualizare!
Asociere furnizori serviciu de localizare • Metoda requestLocationUpdates() din clasa LocationManager• Informări cu privire la modificările poziției geografice: obiecte de tip
LocationListener sau PendingIntent• Parametri comuni:
– Intervalul minim de actualizare– Distanța minimă de actualizare (corelată cu intervalul de actualizare)
• Alți parametri– Sursa de localizare:
• Constanta GPS_PROVIDER sau NETWORK_PROVIDER (LocationManager) • unui criteriu de selecție (clasa Criteria)
– Obiectul care implementează interfața LocationListener sau obiectul de tip PendingIntent
• Metoda requestSingleUpdate()
Eliminarea asocierii
• Metoda removeUpdates() din clasa LocationManager• Parametrul
– Obiectul de tip LocationListener– Obiectul de tip PendingIntent
Clasa LocationManager
• Obținerea ultimei poziții cunoscute– Location getLastKnownLocation(String sursa)
• Informații despre starea receptorului GPS– GpsStatus getGpsStatus(GpsStatus status)
• Selectarea celui mai bun furnizor pe baza criteriilor definite– String getBestProvider(Criteria criteriu,
boolean doarFurnizoriActivi)
Interfața LocationListener
• Recepționarea de notificări la modificarea poziției geografice– Pe baza cerințelor de actualizare (interval și distanță)
• Metoda principală– void onLocationChanged(Location poz)
• Coordonatele accesibile prin clasa Location
• Alte metode– onProviderEnabled()– onProviderDisabled() – onStatusChanged()
Clasa Location
• Coordonate– getLatitude(), getLongitude(), getAltitude()
• Viteza– getSpeed()
• Timp– getTime()
• Acuratețea localizării– getAccuracy()
• Alte informații
Poziționare geografică - Exempluclass LocListener implements LocationListener {
@Overridepublic void onLocationChanged(Location poz) {
/*poz.getLatitude(), poz.getLongitude(), poz.getAltitude(); */ }
//…}
Poziționare geografică - ExempluLocListener locListener = new LocListener();
LocationManager locManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
//asociere furnzizor servicii localizarelocManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER, 0, 0, locListener);
//dezactivare asociare servicii localizarelocManager.removeUpdates(locListener);
Obținerea adreselor
• Clasa Geocoder• Servicii de backend• Determinare disponibilitate serviciu
– Metode statică isPresent()
• Inițializare– Constructor cu un parametru de tip Context
• Permisiune INTERNET
Obținerea adreselor• Metode
– getFromLocation(lat, long, nrMaxAdrese)– getFromLocationName()
• Liste de adrese– Clasa Address– List<Address>
• Clasa Address– getCountry()– getCountryCode()– getLocality()– getAddressLine() etc.
Obținerea adreselorif (Geocoder.isPresent()) {
Geocoder geocoder = new Geocoder(getApplicationContext());try {
List<Address> adrese = geocoder.getFromLocation(lat, lon, 1);if (adrese.size() > 0) {
//adrese.get(0).getCountryName() //adrese.get(0).getLocality()) //etc.
}}catch (IOException ex) {
ex.printStackTrace();}
}
UTILIZAREA GOOGLE MAPS
Google Maps
• Google Maps API v2• Se bazează pe serviciul Google Maps• Biblioteca opțională• Inclusă în Google Play services
– Categoria Extras în SDK Manager• Google Play services APK trebuie să fie instalat și pe dispozitivul
mobil• Facilități
– hărți 3D, interior, satelit, teren, trafic, marcaje, plane suprapuse, trasare linii etc.
Inițializare
• Înregistrare la Google Maps Service pentru obținerea unei chei pentru Maps API– https://code.google.com/apis/console– Cheia va fi inclusă în fișierul AndroidManifest.xml
• Instalare Google Play services SDK• Adăugarea proiectului bibliotecii Google Play services la spațiul
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, SupportMapFragment– Fragment care încapsulează o hartă
• UiSettings– Control setări interfața hartă
Inițializarea hărții
• Inițializare– Clasele MapFragment, MapView sau SupportMapFragment– Metoda getMapAsync()
• Interfața OnMapReadyCallback– Metoda onMapReady(GoogleMap map)
• Stabilirea tipului hărtii– Metoda setMapType(tip_harta)
• MAP_TYPE_NORMAL, MAP_TYPE_SATELLITE, MAP_TYPE_TERRAIN
Control setări
• Clasa UiSettings• Inițializare: getUiSettings()• Facilități
– Controale mărire/micșorare– Activare gesturi control– Afișare busolă– Buton localizare– Bară controale
Control cameră• Parametri vizualizare
– Locație– Unghi înclinare– Zoom
• Clase– CameraUpdate– CameraPosition– Obținere CameraUpdate
• CameraUpdateFactory• Metode
– moveCamera(CameraUpdate)– animateCamera(CameraUpdate)
Clasa GoogleMap - Adăgarea de figuri geometrice
• Cerc– Circle addCircle(CircleOptions)
• Linii– Polyline addPolyline(PolylineOptions)
• Imagine– GroundOverlay addGroundOverlay(GroundOverlayOptions)
• Poligon– Polygon addPolygon(PolygonOptions)
Marcaje
• Clasa Marker– Pictograme pe hartă– Proprietăți
• Titlu • Poziție (coordonate) – LatLng (latitudine și longitudine)• Pictogramă• etc.
– Metoda addMarker(MarkerOptions) din clasa GoogleMaps• Clasa MarkerOptions
– Stabilire opțiuni obiect de tip Marker
Google Maps – Implementare
• Fișierul xml asociat (res/layout)– fragment
• android:id="@+id/harta"• android:name="com.google.android.gms.maps.MapFragment"
• Fișierul java asociat– MapFragment mf = ((MapFragment) getFragmentManager()
.findFragmentById(R.id.harta)) ; – mf.getMapAsync(onMapReadyCallback);
Google Maps – Implementare@Overridepublic void onMapReady(GoogleMap googleMap) {
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();
}
AndroidManifest.xml
• Permisiuni (minim):– ACCCES_FINE_LOCATION pentru map.setMyLocationEnabled(true)
• Cheia Google Maps API– <meta-data android:name="com.google.android.maps.v2.API_KEY"
android:value="cheia generata" />
Bibliografie
• S. Komatineni, D. MacLean – Pro Android 4, Apress, 2012• R. Meier – Professional Android 4 Application Development,
Wiley, 2012 • P. Pocatilu, Programarea dispozitivelor mobile, Editura ASE,
2012• P. Pocatilu, I. Ivan ș.a. – Programarea aplicațiilor Android,
Editura, ASE, 2015• http://developer.android.com