Android Sensors & Async Callbacks Jules White Bradley Dept. of Electrical and Computer Engineering Virginia Tech

Slides:



Advertisements
Similar presentations
Android Application Development Tutorial. Topics Lecture 4 Overview Overview of Sensors Programming Tutorial 1: Tracking location with GPS and Google.
Advertisements

Threads, Surface Views and Real-Time Games. Background Most of the Android apps we’ve covered so far have been single threaded – And Event driven – An.
The Android Activity Lifecycle. Slide 2 Introduction Working with the Android logging system Rotation and multiple layouts Understanding the Android activity.
Sensors.  Hardware devices that take measurements of the physical environment  Some examples  3-axis Accelerometer  3-axis Magnetic field sensor 
Location & Maps.  Mobile applications can benefit from being location-aware, e.g.,  Routing from a current to a desired location  Searching for stores.
Android wifi-based localization. Localization types Android allows (location providers) – GPS (GPS_PROVIDER) – Cell tower + wifi (NETWORK_PROVIDER) You.
Introduction to Smartphone Sensors
Android sensors.
Cosc 4730 Android TabActivity and ListView. TabActivity A TabActivity allows for multiple “tabs”. – Each Tab is it’s own activity and the “root” activity.
CS378 - Mobile Computing Location.
CS378 - Mobile Computing Sensing and Sensors. Sensors "I should have paid more attention in Physics 41" Most devices have built in sensors to measure.
CS378 - Mobile Computing Sensing and Sensors. Sensors "I should have paid more attention in Physics 41" Most devices have built in sensors to measure.
1 Android: Event Handler Blocking, Android Inter-Thread, Process Communications 10/11/2012 Y. Richard Yang.
Programming Mobile Applications with Android September, Albacete, Spain Jesus Martínez-Gómez.
Getting Started with Android APIs Ivan Wong. Motivation - “Datasheet” - Recently exposed to what’s available in Android - So let’s see what API’s are.
Mobile Application Development Selected Topics – CPIT 490
Software Architecture of Android Yaodong Bi, Ph.D. Department of Computing Sciences University of Scranton.
Lecture # 9 Hardware Sensor. Topics 2  SensorManger & Sensor  SensorEvent & SensorEventListener  Example Application.
Mobile Programming Lecture 9 Bound Service, Location, Sensors, IntentFilter.
1 Localization and Sensing Nilanjan Banerjee Mobile Systems Programming (Acknowledgement: Jules White) University of Arkansas Fayetteville, AR
Sensing. Possible sensors on devices – Documented in SensorEvent class Accelerometer (m/s 2 ) – acceleration in x, y, z axes Magnetic Field (micro Tesla)
Doodlz App Android How to Program © by Pearson Education, Inc. All Rights Reserved.
Cosc 5/4730 Broadcast Receiver. Broadcast receiver A broadcast receiver (short receiver) – is an Android component which allows you to register for system.
16 Services and Broadcast Receivers CSNB544 Mobile Application Development Thanks to Utexas Austin.
Android Accessing GPS Ken Nguyen Clayton State University 2012.
1 CMSC 628: Introduction to Mobile Computing Nilanjan Banerjee Introduction to Mobile Computing University of Maryland Baltimore County
LAB 1CSIS04021 Briefing on Assignment One & RMI Programming February 13, 2007.
Sensors – Part I SE 395/595.
로봇을 조종하자 3/4 UNIT 17 로봇 SW 콘텐츠 교육원 조용수. 학습 목표 스마트 폰의 센서를 사용할 수 있다. 2.
CS378 - Mobile Computing Sensing and Sensors Part 2.
Services A Service is an application component that can perform long-running operations in the background and does not provide a user interface. An application.
Introduction to Socket Programming in Android Jules White Bradley Dept. of Electrical and Computer Engineering Virginia Tech
Location. GPS Global Positioning System – At least 4 satellites typically used 3 required extra for error detection and altitude typically accurate within.
Maps Dr. David Janzen Except as otherwise noted, the content of this presentation is licensed under the Creative Commons Attribution 2.5 License.
Sensors in android. App being more applicable Keeping track of your heart beat while jogging. Pointing the phone camera towards the night sky to know.
Sensors – Part 2 SE 395/595. Location in Android LocationManager class – Configure providers and their listeners LocationListener class – Handles update.
Conway’s Game Of Live 1 Fall 2014 CS7020: Game Design and Development.
CS378 - Mobile Computing Sensing and Sensors Part 2.
Lecture 4: Sensors Topics: Motion, Position, and Environmental Sensors Date: Feb 11, 2016.
Event-driven design will set you free The Observer Pattern 1.
Location Based Services. Android location APIs make it easy for you to build location-aware applications, without needing to focus on the details of the.
Class on Fragments & threads. Fragments fragment is a modular section of an activity, which has its own lifecycle, receives its own input events, and.
CPE 490/590 – Smartphone Development
CHAPTER 8 Sensors and Camera. Chapter objectives: Understand Motion Sensors, Environmental Sensors and Positional Sensors Learn how to acquire measurement.
CS371m - Mobile Computing Sensing and Sensors.
The Doodlz app enables you to paint by dragging one or more fingers across the screen. The app provides options for setting the drawing color.
1. 2 Android location services Determining a device’s current location Tracking device movements Proximity alerts.
CS499 – Mobile Application Development Fall 2013 Location & Maps.
Android Android Sensors Android Sensors: – Accelerometer – Gravity sensor – Linear Acceleration sensor – Magnetic Field sensor – Orientation.
Sensors in Android.
Vijay Kumar Kolagani Dr. Yingcai Xiao
Lecture 4: Sensors Topics: Motion, Position, and Environmental Sensors
Android – Event Handling
Lecture 4: Sensors Topics: Motion, Position, and Environmental Sensors.
What's Happening Today Working with Images
Android Location Based Services
Sensors, maps and fragments:
Vijay Kumar Kolagani Dr. Yingcai Xiao
Location Service and Sensors
CS499 – Mobile Application Development
Vijay Kumar Kolagani Dr. Yingcai Xiao
CIS 470 Mobile App Development
Android Topics Asynchronous Callsbacks
Activities and Intents
Android Programming Tutorial
Lecture 4: Sensors Topics: Motion, Position, and Environmental Sensors.
Mobile Programming Sensors in Android.
CS378 - Mobile Computing Location and Maps.
SE4S701 Mobile Application Development
CIS 694/EEC 693 Android Sensor Programming
Presentation transcript:

Android Sensors & Async Callbacks Jules White Bradley Dept. of Electrical and Computer Engineering Virginia Tech

Android Sensors Overview Android Sensors: MIC Camera Temperature Location (GPS or Network) Orientation Accelerometer Proximity Pressure Light

Async Callbacks Android’s sensors are controlled by external services and only send events when they choose to An app must register a callback to be notified of a sensor event Each sensor has a related XXXListener interface that your callback must implement E.g. LocationListener SensorManager Your App Sensor Event Register Callback

Getting the Relevant System Service The non-media (e.g. not camera) sensors are managed by a variety of XXXXManager classes: LocationManager (GPS) SensorManager (accelerometer, gyro, proximity, light, temp) The first step in registering is to obtain a reference to the relevant manager Every Activity has a getSystemService() method that can be used to obtain a reference to the needed manager public class MyActivity … { private SensorManager sensorManager_; public void onCreate(){ … sensorManager_ = (SensorManager) getSystemService(SENSOR_SERVICE); }

Registering for Location Updates The LocationManager handles registrations for GPS and network location updates In order for an object to receive updates from GPS, it must implement the LocationListener interface Once the LocationManager is obtained, an object registers for updates by calling requestLocationUpdates (there are multiple versions you can use) The arguments passed into the requestLocationUpdates method determine the granularity of location changes that will generate an event send updates that are at least X meters apart send updates at least this far apart in time send updates that have this minimum accuracy public class MyActivity … implements LocationListener{ private LocationManager locationManager_; public void onCreate(){ … locationManager_ = (LocationManager) getSystemService(LOCATION_SERVICE); locationManager_.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10, Criteria.ACCURACY_FINE, this); }

Location Providers The phone’s location can be determined from multiple providers GPS Network GPS location updates consume significantly more power than network location updates but are more accurate GPS: 25 seconds * 140mA = 1mAh Network: 2 seconds * 180mA = 0.1mAh The provider argument determines which method will be used to get a location for you You can also register for the PASSIVE_PROVIDER which only updates you if another app is actively using GPS / Network location public class MyActivity … implements LocationListener{ private LocationManager locationManager_; public void onCreate(){ … locationManager_ = (LocationManager) getSystemService(LOCATION_SERVICE); locationManager_.requestLocationUpdates(LocationManager.PASSIVE_PROVIDER, 10, Criteria.ACCURACY_FINE, this); }

The LocationListener Interface public class MyActivity … implements LocationListener{ … // Called when your GPS location public void onLocationChanged(Location location) { } // Called when a provider gets turned off by the user in the public void onProviderDisabled(String provider) { } // Called when a provider is turned on by the user in the public void onProviderEnabled(String provider) { } // Signals a state change in the GPS (e.g. you head through a tunnel and // it loses its fix on your public void onStatusChanged(String provider, int status, Bundle extras) { }

Location Information public class MyActivity … implements LocationListener{ … // Called when your GPS location public void onLocationChanged(Location location) { double altitude = location.getAltitude(); double longitude = location.getLongitude(); double latitude = location.getLatitude(); float speed = location.getSpeed(); float bearing = location.getBearing(); float accuracy = location.getAccuracy(); //in meters long time = location.getTime(); //when the fix was obtained // Other useful Location functions: // // location.distanceTo(dest) // location.bearingTo(dest) }

Being a Good Citizen… It is very important that you unregister your App when you no longer need updates For example, you should always unregister your listener when your Activity is paused! If you unregister when you pause, you must also reregister when you resume This is true for all sensors! public class MyActivity … { private LocationManager locationManager_; public void onCreate(Bundle savedInstanceState) { … locationManager_ = (LocationManager)getSystemService(LOCATION_SERVICE); } protected void onPause() { super.onPause(); locationManager_.removeUpdates(this); } protected void onResume() { super.onResume(); locationManager_.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10, Criteria.ACCURACY_FINE, this); } … }

Registering for Sensor Updates The SensorManager handles registrations for Accelerometer, Temp, Light, Gyro In order for an object to receive updates from GPS, it must implement the SensorEventListener interface Once the SensorManager is obtained, you must obtain a reference to the specific sensor you are interested in updates from The arguments passed into the registerListener method determine the sensor that you are connected to and the rate at which it will send you updates public class MyActivity … implements SensorListener{ private Sensor accelerometer_; private SensorManager sensorManager_; public void connectToAccelerometer() { sensorManager_ = (SensorManager)getSystemService(SENSOR_MANAGER); accelerometer_ = sensorManager_.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); sensorManager_.registerListener(this, accelerometer_, SensorManager.SENSOR_DELAY_NORMAL); }

The SensorEventListener Interface public class MyActivity … implements SensorListener{ // Called when a registered sensor changes public void onSensorChanged(SensorEvent sensorEvent) { if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { float xaccel = sensorEvent.values[0]; float yaccel = sensorEvent.values[1]; float zaccel = sensorEvent.values[2]; } // Called when a registered sensor's accuracy public void onAccuracyChanged(Sensor arg0, int arg1) { // TODO Auto-generated method stub } Because there is one interface for multiple types of sensors, listening to multiple sensors requires switching on the type of event (or creating separate listener objects) Also forces registration at the same rate per listener Simple approach:

The SensorEventListener Interface public class MyActivity … { private class AccelListener implements SensorListener { public void onSensorChanged(SensorEvent sensorEvent) { … } public void onAccuracyChanged(Sensor arg0, int arg1) {} } private class LightListener implements SensorListener { public void onSensorChanged(SensorEvent sensorEvent) { … } public void onAccuracyChanged(Sensor arg0, int arg1) {} } private SensorListener accelListener_ = new AccelListener(); private SensorListener lightListener_ = new LightListener(); … public void onResume(){ … sensorManager_.registerListener(accelListener, accelerometer, SensorManager.SENSOR_DELAY_GAME); sensorManager_.registerListener(lightListener, lightsensor, SensorManager.SENSOR_DELAY_NORMAL); } public void onPause(){ sensorManager_.unregisterListener(accelListener_); sensorManager_.unregisterListener(lightListener_); } Another approach for multiple sensors (probably better):

Android System Services Each App runs in its own process Each Android system service, such as the LocationManager, also runs in its own thread This has important implications: 1.Communication with the system services is through IPC 2.The thread that delivers an event will be a special thread that is dedicated to processing incoming IPC calls 3.If you directly update the GUI from any thread other than the display thread, bad things happen

How to Update the GUI with Sensor Data Android has a built in mechanism for queuing work that needs to be run on the display thread The Handler class allows you to create a queue inside of your Activity that can store work for the display thread You create a handler once and then post work to it public class MyActivity … implements SensorListener{ private class AccelWork implements Runnable { private Location data_; public AccelWork(Location d){data_ = d;} public void run(){ //do something with the data to the GUI } private Handler myHandler_ = new Handler(); // Called when a registered sensor changes public void onSensorChanged(SensorEvent sensorEvent) { AccelWork work = new AccelWork(sensorEvent); myHandler_.post(work); }

How to Update the GUI with Sensor Data The lazy approach public class MyActivity … implements SensorListener{ private Handler myHandler_ = new Handler(); // Called when a registered sensor changes public void onSensorChanged(final SensorEvent sensorEvent) { myHandler_.post( new Runnable(){ public void run(){ //do something with the sensorEvent data //to the gui } ); }