Programowanie aplikacji dla technologii mobilnych mgr inż. Anton Smoliński
Agenda Lokalizacja GPS WI-FI Sieć komórkowa Google Location Services API Motion Sensors Accelerometer Gravity Gyroscope LinearAccelerometer RotationVector Significant Motion Step Counter Step Detector Position Sensors Game Rotation Vector Geomagnetic Rotation Vector Orientation Geomagnetic Field Proximity Environment Sensors Light Pressure Temperature Humidity 2
Lokalizacja 3
. Lokalizacja W systemie Android istnieją 2 sposoby obsługi informacji dotyczących lokalizacji android.location Google Location Services for Android (API) Google API udostępnia więcej elementów oraz automatyzuje pewne czynności, wymaga jednak rejestracji Google Play Services 4
Lokalizacja Dwa sposoby pobierania danych lokalizacyjnych: GPS Bardzo dokładne Działa raczej tylko na zewnątrz Szybko zużywa baterię Wolno zwraca dane Network Location Provider (wi-fi, cellural) Działa i wewnątrz i na zewnątrz Szybko zwraca dane Zużywa mniej baterii 5
Lokalizacja LocationManager locationmanager = (LocationManager) this.getsystemservice(context.location_service); LocationListener locationlistener = new LocationListener() { public void onlocationchanged(location location) { makeuseofnewlocation(location); } public void onstatuschanged(string provider, int status, Bundle extras) {} public void onproviderenabled(string provider) {} public void onproviderdisabled(string provider) {} }; locationmanager.requestlocationupdates(locationmanager.network_provider, REFRESH_TIME, REFRESH_DISTANCE, locationlistener); 6
Lokalizacja Używając NETWORK_PROVIDER oraz GPS_PROVIDER, musisz ustawić permissions ACCESS_FINE_LOCATION. ACCESS_COARSE_LOCATION zawiera uprawnienia permissions tylko dla NETWORK_PROVIDER Aby korzystać z obu metod należy zarejestrować dwa sensory 7
Lokalizacja Racjonalne użycie baterii Czy potrzeba 2 sensorów czy jednego? Kiedy nasłuchiwać? Jak długo nasłuchiwać? Używanie lastknownlocation Kończenie nasłuchiwania 8
Google Play Location Service Google udostępnia API lokalizacyjne, które automatyzuje wiele elementów, np. używa zarówno GPS jak i Sieci do określenia lokalizacji Zarządza optymalnym wykorzystaniem energii/dokładnością Umożliwia obsługę GoogleMaps z zaimplementowanymi gestami i innymi opcjami (pinezki, polygony) 9
Google Play Location API mlastlocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); if (mlastlocation!= null) { mlatitudetext.settext(string.valueof(mlastlocation.getlatitude())); mlongitudetext.settext(string.valueof(mlastlocation.getlongitude())); } if (mrequestinglocationupdates) { startlocationupdates(); } protected void startlocationupdates() { LocationServices.FusedLocationApi.requestLocationUpdates( mgoogleapiclient, mlocationrequest, this); } 10
Motion Sensors 11
Sensory Do obsługi sensorów służy Sensor Framework SensorManager Tworzenie listingów, rejestracja i zwalnianie sensorów, informacje o sensorach jak dokładność, kalibracja itp. Sensor Utworzenie instancji konkretnego sensora. Zawiera interfejs umożliwiający korzystanie z danego sensora. SensorEvent Klasa zawierająca informacje o zdarzeniach wywołanych danym sensorem (np., zebrane dane, czas zbierania danych, dokładność danych) SensorEventListener Interfejs umożliwiający tworzenie własnych zdarzeń przy zmianach w odczytach sensorów. 12
Obsługa sensorów private SensorManager msensormanager; msensormanager = (SensorManager) getsystemservice(context.sensor_service); List<Sensor> devicesensors = msensormanager.getsensorlist(sensor.type_all); private Sensor msensor = msensormanager.getdefaultsensor (Sensor.TYPE_MAGNETIC_FIELD); public class SensorActivity extends Activity implements SensorEventListener { @Override public final void onsensorchanged(sensorevent event) {} @Override protected void onresume() { super.onresume(); msensormanager.registerlistener(this, mlight, SensorManager.SENSOR_DELAY_NORMAL); } @Override protected void onpause() { super.onpause(); msensormanager.unregisterlistener(this); } } 13
Używanie sensorów Zwalniaj nieużywane sensory (unregister) Testuj na urządzeniu fizycznym a nie emulatorze onsensorchanged() powinna być jak najszybsza Unikaj używania wycofanych typów sensorów Przed użyciem sensora sprawdź, czy istnieje Wybierz opóźnienia sensora dopasowane do potrzeb 14
Motion Sensors TYPE_ACCELEROMETER Rodzaj: Sprzętowy Najczęściej używany do: wykrycie ruchu, potrząśnięcia itp Zwracane wartości: SensorEvent.values[0] oś x SensorEvent.values[1] oś y SensorEvent.values[2] oś z Zwracana jednostka: m/s 2 Pomiar przyspieszenia działającego na urządzenie (łącznie z siłą grawitacji) Należy pamiętać, o korekcji sensora o ok. 9.81m/s 2 15
Motion Sensors TYPE_GRAVITY Rodzaj: Sprzętowy lub programowy Najczęściej używany do: wykrycie ruchu, potrząśnięcia itp Zwracane wartości: SensorEvent.values[0] oś x SensorEvent.values[1] oś y SensorEvent.values[2] oś z Zwracana jednostka: m/s 2 Pomiar przyspieszenia ziemskiego działającego na urządzenie (łącznie z siłą grawitacji) Gdy urządzenie leży odczyty GRAVITY i ACCELEROMETER powinny być identyczne 16
Motion Sensors TYPE_GYROSCOPE Rodzaj: Sprzętowy Najczęściej używany do: wykrycie obrotu, przekręcenie itp Zwracane wartości: SensorEvent.values[0] oś x SensorEvent.values[1] oś y SensorEvent.values[2] oś z Zwracana jednostka: rad/s Zwraca nachylenie urządzenia według zadanych osi Sensor zwraca czyste dane, które warto wyczyścić (z szumów) porównując je z danymi z innych sensorów np. gravity 17
Motion Sensors TYPE_LINEAR_ACCELEROMETER Rodzaj: Sprzętowy lub programowy Najczęściej używany do: wykrycie ruchu według wybranej osi Zwracane wartości: SensorEvent.values[0] oś x SensorEvent.values[1] oś y SensorEvent.values[2] oś z Zwracana jednostka: m/s 2 Pomiar przyspieszenia działającego na urządzenie (bez uwzględnienia siły grawitacji) Od wyniku z ACCELEROMETER różni się odjętą wartością siły grawitacji 18
Motion Sensors TYPE_ROTATION_VECTOR Rodzaj: Sprzętowy lub programowy Najczęściej używany do: wykrycie ruchu i obrotu Zwracane wartości: SensorEvent.values[0] oś x SensorEvent.values[1] oś y SensorEvent.values[2] oś z SensorEvent.values[3] Skalar z wektora rotacji Zwracana jednostka: brak Pomiar wektora kąta i osi wobec którego urządzenie się obraca Oś y wskazuje północ 19
Motion Sensors TYPE_SIGNIFICANT_MOTION Zwracane wartości: brak Zwracana jednostka: brak Automatyczny sensor uruchamiany, gdy użytkownik (wraz z urządzeniem) wykona znaczący ruch, np. Chodzenie Bieganie Jazda na rowerze Jazda samochodem 20
Motion Sensors TYPE_STEP_COUNTER Rodzaj: Programowy Najczęściej używany do: zliczanie kroków Zwracane wartości: SensorEvent.values[0] liczba zrobionych kroków Zwracana jednostka: liczba kroków Pomiar kroków od ostatniej rejestracji sensora Ma większe opóźnienie (10sekund), lecz lepszą dokładność niż Step Detector 21
Motion Sensors TYPE_STEP_DETECTOR Rodzaj: Programowy Najczęściej używany do: wykrycie kroku Zwracane wartości: brak Zwracana jednostka: brak Automatyczny sensor uruchamiany, gdy użytkownik (wraz z urządzeniem) wykona krok Opóźnienie sensora wynosi ok 2 sek. 22
Position Sensors 23
Position Sensors TYPE_GAME_ROTATION_VECTOR Rodzaj: Sprzętowy lub programowy Najczęściej używany do: wykrycie ruchu i obrotu Zwracane wartości: SensorEvent.values[0] oś x SensorEvent.values[1] oś y SensorEvent.values[2] oś z Zwracana jednostka: brak Nie wykorzystuje sensora pola magnetycznego Dokładny pomiar obrotu, gdy nie ma potrzeby wiedzieć, gdzie jest północ (np. w grach) 24
Position Sensors TYPE_GEOMAGNETIC_ROTATION_VECTOR Rodzaj: Sprzętowy lub programowy Najczęściej używany do: wykrycie ruchu i obrotu Zwracane wartości: SensorEvent.values[0] oś x SensorEvent.values[1] oś y SensorEvent.values[2] oś z Zwracana jednostka: brak Pomiar obrotu urządzenia za pomocą pola magnetycznego Niska dokładność Niskie zużycie baterii 25
Position Sensors TYPE_ORIENTATION Rodzaj: Programowy Najczęściej używany do: wskazanie pozycji urządzenia Zwracane wartości: SensorEvent.values[0] Azymut SensorEvent.values[1] Stopień SensorEvent.values[2] Obrót Zwracana jednostka: stopnie Pomiar położenie urządzenia względem osi ziemi 26
Position Sensors Pi TYPE_MAGNETIC_FIELD Rodzaj: Sprzętowy Najczęściej używany do: stworzenie kompasu Zwracane wartości: SensorEvent.values[0] siła pola względem osi x SensorEvent.values[1] siła pola względem osi y SensorEvent.values[2] siła pola względem osi z Zwracana jednostka: mikrotesle Pomiar natężenia pola magnetycznego 27
Position Sensors TYPE_MAGNETIC_FIELD_UNCALIBRATED Rodzaj: Sprzętowy Najczęściej używany do: stworzenie kompasu Zwracane wartości: SensorEvent.values[0] siła pola względem osi x SensorEvent.values[1] siła pola względem osi y SensorEvent.values[2] siła pola względem osi z SensorEvent.values[3] szacowane odchylenie osi x SensorEvent.values[4] szacowane odchylenie osi y SensorEvent.values[5] szacowane odchylenie osi z Zwracana jednostka: mikrotesle Pomiar natężenia pola magnetycznego bez wygładzenia Dokładniejszy, ale wymaga kalibracji 28
Position Sensors Pi TYPE_PROXIMITY Rodzaj: Sprzętowy Najczęściej używany do: wykrycie odległości telefonu od twarzy Zwracane wartości: SensorEvent.values[0] Odległość od sensora Zwracana jednostka: cm Sensor może zwracać także wartości NEAR albo FAR 29
Environment Sensors 30
Environment Sensors TYPE_AMBIENT_TEMPERATURE Rodzaj: Sprzętowy Najczęściej używany do: pomiar temperatury powietrza Zwracane wartości: SensorEvent.values[0] temperatura powietrza Zwracana jednostka: stopnie celsjusza Pomiar temperatury powietrza wokół urządzenia 31
Environment Sensors TYPE_LIGHT Rodzaj: Sprzętowy Najczęściej używany do: rozjaśniania, przyciemniania ekranu Zwracane wartości: SensorEvent.values[0] Natężenie światła Zwracana jednostka: luxy (lx) Pomiar natężenia światła padającego na sensor 32
Environment Sensors TYPE_PRESSURE Rodzaj: Sprzętowy Najczęściej używany do: pomiaru ciśnienia powietrza Zwracane wartości: SensorEvent.values[0] ciśnienie powietrza Zwracana jednostka: hpa lub mbar Pomiar ciśnienia atmosferycznego działające na urządzenie 33
Environment Sensors TYPE_RELATIVE_HUMIDITY Rodzaj: Sprzętowy Najczęściej używany do: pomiar wilgotności Zwracane wartości: SensorEvent.values[0] wilgotność powietrza Zwracana jednostka: procenty Procentowy pomiar wilgotności powietrza 34
Environment Sensors TYPE_TEMPERATURE Rodzaj: Sprzętowy Najczęściej używany do: pomiar temperatury urządzenia Zwracane wartości: SensorEvent.values[0] temperatura Zwracana jednostka: stopnie celsjusza Wykonywany jest pomiar temperatury urządzenia (najczęściej jest to tożsamy z max(temp. procesora, temp. baterii)) 35
Korzystanie z Sensorów public class SensorActivity extends Activity implements SensorEventListener { private SensorManager msensormanager; private Sensor mpressure; @Override public final void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); msensormanager = (SensorManager) getsystemservice(context.sensor_service); mpressure = msensormanager.getdefaultsensor(sensor.type_p RESSURE); } @Override public final void onaccuracychanged(sensor sensor, int accuracy) { } @Override public final void onsensorchanged(sensorevent event) { float millibars_of_pressure = event.values[0]; } @Override protected void onresume() { super.onresume(); msensormanager.registerlistener(this, mpressure, SensorManager.SENSOR_DELAY_NORMAL); } } @Override protected void onpause() { super.onpause(); msensormanager.unregisterlistener(this); } 36
Koniec! mgr inż. Anton Smoliński 37