Luca Bedogni - unibo.it

27
Programming with Android: System Services Luca Bedogni Dipartimento di Informatica: Scienza e Ingegneria Università di Bologna

Transcript of Luca Bedogni - unibo.it

Page 1: Luca Bedogni - unibo.it

Programming with Android: System Services

Luca BedogniDipartimento di Informatica: Scienza e Ingegneria

Università di Bologna

Page 2: Luca Bedogni - unibo.it

Luca Bedogni - Programming with Android – System Services 2

System Services

ØThere is a wide list of services availableAccessibilityManagerAccountManagerActivityManagerAlarmManagerAppOpsManagerAudioManagerBatteryManagerBluetoothManagerClipboardManagerConnectivityManagerDevicePolicyManagerDisplayManagerDownloadManagerDropBoxManagerFingerprintManagerInputMethodManagerInputManager

JobSchedulerKeyguardManagerLauncherAppsLayoutInflaterLocationManagerMediaProjectionManagerMediaRouterMediaSessionManagerMidiManagerNetworkStatsManagerNfcManagerNotificationManagerNsdManagerPowerManagerPrintManagerRestrictionsManagerSearchManager

SensorManagerStorageManager,SubscriptionManagerTelecomManagerTelephonyManagerTextServicesManagerTvInputManagerUiModeManagerUsageStatsManagerUsbManagerUserManagerVibratorWallpaperServiceWifiManagerWifiP2pManagerWindowManager

Page 3: Luca Bedogni - unibo.it

Luca Bedogni - Programming with Android – System Services

BatteryManager pm = (BatteryManager) getSystemService(Context.BATTERY_SERVICE);

Battery Manager

vAndroid runs on limited capabilities devicesvIt is crucial to use the battery wiselyvThe battery service gives us information about the

power of the systemvGet it with:

3

Page 4: Luca Bedogni - unibo.it

Luca Bedogni - Programming with Android – System Services

Vibrator Service

Vibrator vibrator = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE);

vManages the vibration servicevGet it with

vSome methods:§ vibrate(long time);§ cancel();§ vibrate(long[] pattern, int repeat);

vNeeds android.permission.VIBRATE

Page 5: Luca Bedogni - unibo.it

Luca Bedogni - Programming with Android – System Services

Alarm Service

vFires an Intent in the futurevGet it with

vtype is one of:§ ELAPSED_REALTIME§ ELAPSED_REALTIME_WAKEUP§ RTC§ RTC_WAKEUP

AlarmManager as = (AlarmManager) getSystemService(Context.ALARM_SERVICE);// set(int type, long triggerAtTime, PendingIntent operation);

SystemClock.elapsedRealTime()

System.currentTimeMillis()

Page 6: Luca Bedogni - unibo.it

Luca Bedogni - Programming with Android – System Services

Alarm Service

vMore methods§ setRepeating(int type, long triggerAtTime, long interval,

PendingIntent operation);• Can use INTERVAL_HOUR, INTERVAL_HALF_DAY

§ cancel(PendingIntent operation);• Match with filterEquals(Intent anotherIntent);

Page 7: Luca Bedogni - unibo.it

Luca Bedogni - Programming with Android – System Services

Sensor Service

vInteraction with sensorsvGet it with

vVarious kind of sensors– Accelerometer– Gyroscope– Light– ….

SensorManager sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

Page 8: Luca Bedogni - unibo.it

Luca Bedogni - Programming with Android – System Services

Accelerometer

vTo measure acceleration

vGiven with 3-axes values

vUseful to inspect movements

Page 9: Luca Bedogni - unibo.it

Luca Bedogni - Programming with Android – System Services

Gyroscope

vTo measure orientation

vUsually a spinning wheel ora spinning disk

vGives angular speed

vNot so common in smartphones

Page 10: Luca Bedogni - unibo.it

Luca Bedogni - Programming with Android – System Services

Light sensor

vUsually a photodiode

vWhen exposed to light, theycreate a current

vMore current, more light

Page 11: Luca Bedogni - unibo.it

Luca Bedogni - Programming with Android – System Services

Proximity sensor

vTo measure distance fromobjects

vUseful to understand when thesmartphone is in, for instance, a pocket

vUsed to switch off screen during calls

Page 12: Luca Bedogni - unibo.it

Luca Bedogni - Programming with Android – System Services

Sensors

vNot all smartphones are created equal

vSome carry a set of sensors some others don't

vHow to know which sensors does your smartphone have?

Page 13: Luca Bedogni - unibo.it

Luca Bedogni - Programming with Android – System Services

Sensors List

vpublic List<Sensor> getSensorList(int type);Sensor Type (Hardware/Software) Used for

TYPE_ACCELEROMETER Hardware Motion detection

TYPE_AMBIENT_TEMPERATURE Hardware Temperature

TYPE_GRAVITY Can be both Motion Detection

TYPE_GYROSCOPE Hardware Rotation

TYPE_LIGHT Hardware Screen brightness

TYPE_LINEAR_ACCELERATION Can be both Acceleration along a single axis

TYPE_MAGNETIC_FIELD Hardware Compass, indoor navigation

TYPE_ORIENTATION Software Obtaining device position

TYPE_PRESSURE Hardware Obtaining the height from sea level

TYPE_PROXIMITY Hardware Setting off the screen

TYPE_RELATIVE_HUMIDITY Hardware Humidity

TYPE_ROTATION_VECTOR Can be both Motion and Rotation detection

Page 14: Luca Bedogni - unibo.it

Luca Bedogni - Programming with Android – System Services

How to “use” a Sensor

vEach Sensor contains information about the vendor, type and others

vImplement SensorEventListener§ onAccuracyChanged(Sensor sensor, int accuracy)§ onSensorChanged(SensorEvent event)§ registerListener(SensorEventListener listener, Sensor

sensor, int rate)• rate is one of

– SENSOR_DELAY_NORMAL– SENSOR_DELAY_FASTEST (default)

Page 15: Luca Bedogni - unibo.it

Luca Bedogni - Programming with Android – System Services

Requesting sensor updates

Sensor can report updates with different speeds:- SENSOR_DELAY_FASTEST: as fast as possible- SENSOR_DELAY_GAME: suitable for games- SENSOR_DELAY_UI: for interface changes- SENSOR_DELAY_NORMAL: for all other uses

15

sm = (SensorManager)getSystemService(Context.SENSOR_SERVICE);Sensor sensorLight = sm.getDefaultSensor(Sensor.TYPE_LIGHT); sm.registerListener(this, sensorLight, SensorManager.SENSOR_DELAY_NORMAL);

public void onSensorChanged(SensorEvent event) {if (event.sensor.getType() == Sensor.TYPE_LIGHT) {

// doSomething} else if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {

// doSomething}

}

Page 16: Luca Bedogni - unibo.it

Luca Bedogni - Programming with Android – System Services

Virtual Sensor

• In addition to the hardware sensors, there are a number of possible virtual sensors• Gravity• Linear Acceleration• Orientation• Rotation

• Readings from hardware sensors are computed to offer aggregated data

16

Page 17: Luca Bedogni - unibo.it

Luca Bedogni - Programming with Android – System Services

Sensor Challenges

• Bias• Sensor reading is off by a constant value

• Drift• Data is shifted without cause

• Settling time• Initial sensor readings may be inaccurate

• Noise• Data can’t report a reliable and steady value

• Interference• From the environment

17

Page 18: Luca Bedogni - unibo.it

Luca Bedogni - Programming with Android – System Services

Detecting User’s activities

• Detecting the user activity is of paramount importance• Start vehicle related apps while the user is driving• Start tracking distances if the user is walking• Activate fitness apps

• How?• Reading raw values and use machine learning models• Exploit Activity Recognition API

• Permission

18

<uses-permission android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION" />

Page 19: Luca Bedogni - unibo.it

Luca Bedogni - Programming with Android – System Services

Requesting Activity notifications

19

List<ActivityTransition> transitions = new ArrayList<>();

transitions.add(new ActivityTransition.Builder().setActivityType(DetectedActivity.IN_VEHICLE).setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_ENTER).build());

transitions.add(new ActivityTransition.Builder().setActivityType(DetectedActivity.IN_VEHICLE).setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT).build());

transitions.add(new ActivityTransition.Builder().setActivityType(DetectedActivity.WALKING).setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT).build());

Page 20: Luca Bedogni - unibo.it

Luca Bedogni - Programming with Android – System Services

Requesting Activity notifications

Build the request

And register it

20

ActivityTransitionRequest request = new ActivityTransitionRequest(transitions);

Task<Void> task =ActivityRecognition.getClient(context).requestActivityTransitionUpdates(request, myPendingIntent);

task.addOnSuccessListener(new OnSuccessListener<Void>() {@Overridepublic void onSuccess(Void result) { // do something }

});task.addOnFailureListener(new OnFailureListener() {

@Overridepublic void onFailure(Exception e) { // do something }

});

Page 21: Luca Bedogni - unibo.it

Luca Bedogni - Programming with Android – System Services

Receiving Activity notifications

• Performed as a Broadcast Receiver• Implement onReceive()

• Notifications are ordered

• Remember to de-register notifications

21

Task<Void> task = ActivityRecognition.getClient(context).removeActivityTransitionUpdates(myPendingIntent);

Page 22: Luca Bedogni - unibo.it

Luca Bedogni - Programming with Android – System Services

Audio Service

vAble to§ select a stream and control sound§ adjust the volume§ change ring type§ play effects

Page 23: Luca Bedogni - unibo.it

Luca Bedogni - Programming with Android – System Services

Telephony Service

vInteracts with callsvGet it with

vAsk the device about call information§ getCallState()§ getDataState()§ getDataActivity()§ getNetworkType()§ isNetworkRoaming()

TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);

Page 24: Luca Bedogni - unibo.it

Luca Bedogni - Programming with Android – System Services

SMS Service

vSend text messagesvGet it with

vTo send a message call:§ sendTextMessage(String dest, String sc, String text,

PendingIntent sent, PendingIntent delivery);• sent and delivery: two intents to be fired when the message is

sent and/or delivered

SmsManager sms = SmsManager.getDefault();

Page 25: Luca Bedogni - unibo.it

Luca Bedogni - Programming with Android – System Services

Connectivity Service

vCheck device network statevGet it with

vCheck WI-FI, GPRS vNotify connection changesvNeeds

§ android.permission.ACCESS_NETWORK_STATE§ android.permission.CHANGE_NETWORK_STATE

String serId = Context.CONNECTIVITY_SERVICE;ConnectivityManager cm = (ConnectivityManager) Context.getSystemService(serId);

Page 26: Luca Bedogni - unibo.it

Luca Bedogni - Programming with Android – System Services

Wi-Fi Service

vManages the Wi-Fi connectionvGet it with

vCheck Wi-Fi§ getWifiState()

• Returns WIFI_STATE_DISABLED, WIFI_STATE_DISABLING, WIFI_STATE_ENABLED, WIFI_STATE_ENABLING, WIFI_STATE_UNKNOWN

§ isWifiEnabled() / setWifiEnabled()vLists all the configured wifi connections

§ getConfiguredNetworks()

WifiManager wfm = (WifiManager) getSystemService(Context.WIFI_SERVICE)

Page 27: Luca Bedogni - unibo.it

Luca Bedogni - Programming with Android – System Services

Wi-Fi Service

vCheck/edit wi-fi connection§ addNetwork(WifiConfiguration config)§ updateNetwork(WifiConfiguration config)§ removeNetwork(int netid)

vScan for wi-fi networks§ startScan()

vBe notified about wi-fi changes§ Broadcast Intent: SCAN_RESULTS_AVAILABLE_ACTION

• Call getScanResults()