lec #7: audio, video & telephony - old dominion...

60
App Development for Smart Devices CS 495/595 - Fall 2012 Tamer Nadeem Dept. of Computer Science Lec #7: Audio, Video & Telephony

Upload: vudien

Post on 18-Mar-2018

218 views

Category:

Documents


1 download

TRANSCRIPT

App Development for Smart Devices � �

CS 495/595 - Fall 2012 �

Tamer Nadeem �Dept. of Computer Science�

Lec #7: Audio, Video & Telephony�

Page 2 Fall 2012 CS 495/595 - App Development for Smart Devices

• Playing Audio & Video � Recording Audio & Video •  Media Player � Media Recorder

� Taking Video, Picture, Audio

• Speech Recognition � Telephony � Initiating phone calls � Reading the phone and SIM states � Monitoring changes to the phone

• Student Presentations – NeuroPhone: Brain-Mobile Phone Interface using a Wireless EEG Headset

•  Presenter: Corey Campbell – Detecting driver phone use leveraging car speakers

•  Presenter: Sarwar Sha – COBRA: Color Barcode Streaming for Smartphone Systems

•  Presenter: Drew Carpenter

Objective

Page 3 Fall 2012 CS 495/595 - App Development for Smart Devices

Playing Audio & Video

Page 4 Fall 2012 CS 495/595 - App Development for Smart Devices

Media Format

•  Audio Formats: – Wav (PCM uncompressed), AAC, MP3, WMA, AMR, OGG, MIDI – Native: 44.1kHz 16 bit stereo – Best sampling: 11kHz, 22kHz, or 44.1kHz – Remember headphones – Good free recording tool: audacity

•  Video Formats: – MP4 (MPEG-4 low bit rate) – H.263 (3GP) – H.264 (AVC)

More details: http://developer.android.com/guide/appendix/media-formats.html

Page 5 Fall 2012 CS 495/595 - App Development for Smart Devices

Media Player

•  Comprehensive MediaPlayer to simplify the playback of audio and video.

•  MediaPlayer can play media stored in application resources, local files, Content Providers, or streamed from a network URL.

•  To play a media resource, create a new MediaPlayer instance, initialize it with a media source, and prepare it for playback.

•  Once you’ve finished playback, call mediaPlayer.release() to free the associated resources.

Media Player reference: http://developer.android.com/reference/android/media/MediaPlayer.html

Page 6 Fall 2012 CS 495/595 - App Development for Smart Devices

Media Player

•  T h e M e d i a P l a y e r ’ s management of audio and video files and streams is handled as a state machine.

➤ Initialize the Media Player with media to play. ➤ Prepare the Media Player for playback. ➤ Start the playback. ➤ Pause or stop the playback prior to its completing. ➤ Playback complete.

Page 7 Fall 2012 CS 495/595 - App Development for Smart Devices

•  Use the static create method, passing in the application Context and one of the following: ➤ A resource identifier ➤ A URI to a local file using the file:// schema ➤ A URI to an online audio resource as a URL ➤ A URI to a local Content Provider row

Preparing for Audio Playback

Context appContext = getApplicationContext(); MediaPlayer resourcePlayer = MediaPlayer.create(appContext,

R.raw.my_audio); MediaPlayer filePlayer = MediaPlayer.create(appContext,

Uri.parse("file://sdcard/localfile.mp3")); MediaPlayer urlPlayer = MediaPlayer.create(appContext,

Uri.parse("http://site.com/audio/audio.mp3")); MediaPlayer contentPlayer = MediaPlayer.create(appContext,

Settings.System.DEFAULT_RINGTONE_URI);

Page 8 Fall 2012 CS 495/595 - App Development for Smart Devices

•  Alternatively, use the setDataSource method on an existing Media Player instance. ➤ Accepts a file path, Content Provider URI, streaming media URL path, or File Descriptor. ➤ Call prepare on the Media Player before you begin playback

Preparing for Audio Playback

MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setDataSource("/sdcard/test.3gp"); mediaPlayer.prepare();

Page 9 Fall 2012 CS 495/595 - App Development for Smart Devices

•  Need to specify a display surface on which to show the video.

Preparing for Video Playback

•  Two methods: ➤ Use the VideoView control, encapsulates the creation of a display surface and allocation and preparation of video content within a Media Player. ➤ Specify your own display surface and manipulate the underlying Media Player instance directly.

<VideoView android:id="@+id/VideoView“ android:layout_height="fill_parent" android:layout_width="fill_parent" >

</VideoView> <SurfaceView android:id="@+id/surface"

android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center">

</SurfaceView>

Page 10 Fall 2012 CS 495/595 - App Development for Smart Devices

•  The Video View supports the playback of local or streaming video as supported by the Media Player component.

•  Video Views conveniently encapsulate the initialization of the Media Player.

•  To assign a video to play, call setVideoPath or setVideoUri to specify the path to a local file, or the URI of a Content Provider or remote video stream:

Video Playback using Video View

streamingVideoView.setVideoUri("http://www.mysite.com/videos/myvideo.3gp");

localVideoView.setVideoPath("/sdcard/test2.3gp");

Page 11 Fall 2012 CS 495/595 - App Development for Smart Devices

Video Playback using Video View

VideoView videoView = (VideoView)findViewById(R.id.videoview); videoView.setKeepScreenOn(true); videoView.setVideoPath("/sdcard/test2.3gp"); if (videoView.canSeekForward()) videoView.seekTo(videoView.getDuration()/2); videoView.start(); [. . . do something . . . ] videoView.stopPlayback();

•  Control playback using the start, stopPlayback, pause, and seekTo methods.

•  The Video View also includes the setKeepScreenOn method to apply a screen Wake Lock that will prevent the screen from being dimmed while playback is in progress.

Page 12 Fall 2012 CS 495/595 - App Development for Smart Devices

•  The Media Player view video content by preparing a Surface onto which the video will be displayed.

•  The Media Player requires a SurfaceHolder object for displaying video content, assigned using the setDisplay method.

•  Once created and assigned the Surface Holder to your Media Player, use the setDataSource method to specify the path, URL, or Content Provider URI of the video resource to play.

•  Call prepare to initialize the Media Player in preparation for playback

•  To include a Surface Holder in your UI layout you use the SurfaceView control as shown in the sample layout XML

Setting a Surface for Video Playback

Page 13 Fall 2012 CS 495/595 - App Development for Smart Devices

Surface for Video Playback

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent">

<SurfaceView android:id="@+id/surface"

android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center">

</SurfaceView> </LinearLayout>

•  Sample layout including a Surface View

Page 14 Fall 2012 CS 495/595 - App Development for Smart Devices

Surface for Video Playback

public class MyActivity extends Activity implements SurfaceHolder.Callback { private MediaPlayer mediaPlayer; @Override public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState); setContentView(R.layout.main);

mediaPlayer = new MediaPlayer(); SurfaceView surface = (SurfaceView)findViewById(R.id.surface); SurfaceHolder holder = surface.getHolder(); holder.addCallback(this); holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); holder.setFixedSize(400, 300);

}

•  Initializing and assigning a Surface View to a Media Player (1)

Page 15 Fall 2012 CS 495/595 - App Development for Smart Devices

Surface for Video Playback

public void surfaceCreated(SurfaceHolder holder) { try { mediaPlayer.setDisplay(holder);

mediaPlayer.setDataSource("/sdcard/test2.3gp"); mediaPlayer.prepare(); mediaPlayer.start(); } catch (IllegalArgumentException e) { Log.d("MEDIA_PLAYER", e.getMessage()); } catch (IllegalStateException e) { Log.d("MEDIA_PLAYER", e.getMessage()); } catch (IOException e) { Log.d("MEDIA_PLAYER", e.getMessage()); }

}

public void surfaceDestroyed(SurfaceHolder holder) { mediaPlayer.release();

}

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } }

•  Initializing and assigning a Surface View to a Media Player (2)

Page 16 Fall 2012 CS 495/595 - App Development for Smart Devices

Controlling Playback

mediaPlayer.start(); int pos = mediaPlayer.getCurrentPosition(); int duration = mediaPlayer.getDuration(); mediaPlayer.seekTo(pos + (duration-pos)/10); [ . . . wait for a duration . . . ] mediaPlayer.stop();

•  Once a Media Player is prepared, call start to begin playback.

•  Use the stop and pause methods to stop or pause playback.

•  The Media Player also provides the getDuration method to find the length of the media being played, and getCurrentPosition to find the playback position. Use seekTo to jump to a specific position.

Page 17 Fall 2012 CS 495/595 - App Development for Smart Devices

Controlling Playback

if (!mediaPlayer.isLooping()) mediaPlayer.setLooping(true);

•  Use the isLooping and setLooping methods to specify if the media being played should loop when it completes.

mediaPlayer.setScreenOnWhilePlaying(true);

•  To enable a Wake Lock that will keep the screen on during video playback use the setScreenOnWhilePlaying method.

mediaPlayer.setVolume(1f, 0.5f);

•  To control the volume for each channel during playback using the setVolume method. It takes a scalar float value between 0 and 1 for both the left and right channels.

Page 18 Fall 2012 CS 495/595 - App Development for Smart Devices

Recording Audio & Video

Page 19 Fall 2012 CS 495/595 - App Development for Smart Devices

Recording Audio and Video

•  Two alternatives for recording audio and video within your application:

•  The simplest is to use Intents to launch the video camera app. This option lets you specify the output location and video recording quality, while letting the native video recording application handle the user experience and error handling.

•  The other is to use the Media Recorder class. This option lets you to replace the native app, get more fine-grained control over the video capture UI or recording settings.

Page 20 Fall 2012 CS 495/595 - App Development for Smart Devices

Using Intents to Record Audio/Video

startActivityForResult (new Intent(MediaStore.ACTION_VIDEO_CAPTURE), RECORD_VIDEO);

•  Use the ACTION_VIDEO_CAPTURE Media Store static constant in an Intent passed to startActivityForResult to launch the native video camera Activity.

•  The video capture action supports two optional extras

➤ MediaStore.EXTRA_OUTPUT - By default, the video recorded will be stored in the default Media Store. If you want to record it elsewhere, you can specify an alternative URI using this extra.

➤ MediaStore.EXTRA_VIDEO_QUALITY - The video record action allows you to specify an image quality using an integer value: 0 for low (MMS) quality videos or 1 for high (full resolution) videos. By default, the high resolution mode will be used.

Page 21 Fall 2012 CS 495/595 - App Development for Smart Devices

Using Intents to Record Video private static int RECORD_VIDEO = 1; private static int HIGH_VIDEO_QUALITY = 1; private static int MMS_VIDEO_QUALITY = 0; private void recordVideo(Uri outputpath) { Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);

if (outputpath != null) intent.putExtra(MediaStore.EXTRA_OUTPUT, outputpath);

intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, HIGH_VIDEO_QUALITY);

startActivityForResult(intent, RECORD_VIDEO); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == RECORD_VIDEO) {

Uri recordedVideo = data.getData(); // TODO Do something with the recorded video

} }

Page 22 Fall 2012 CS 495/595 - App Development for Smart Devices

Using the Media Recorder •  Multimedia recording is handled by MediaRecorder class to record

audio and/or video files

•  Your application needs the RECORD_AUDIO and/or RECORD_VIDEO permissions in manifest file. o  <uses-permission android:name="android.permission.RECORD_AUDIO"/> o  <uses-permission android:name="android.permission.RECORD_VIDEO"/>

•  To record, create a new Media Recorder object.

•  Call release on Media Recorder object to free the associated resources

Reference: http://developer.android.com/reference/android/media/MediaRecorder.html

Page 23 Fall 2012 CS 495/595 - App Development for Smart Devices

•  The Media Recorder manages recording as a state machine. •  ➤ Create a new Media Recorder.

•  ➤ Assign it the input sources to record from.

•  ➤ Define the output format.

•  ➤ Specify the audio and video encoder, frame rate, and output size.

•  ➤ Select an output file.

•  ➤ Prepare for recording.

•  ➤ Record.

•  ➤ End recording.

Using the Media Recorder

Page 24 Fall 2012 CS 495/595 - App Development for Smart Devices

Configure Audio/Video Recording

MediaRecorder mediaRecorder = new MediaRecorder(); // Configure the input sources mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

// Set the output format mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);

// Specify the audio and video encoding mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);

// Specify the output file mediaRecorder.setOutputFile("/sdcard/myoutputfile.mp4");

// Prepare to record mediaRecorder.prepare();

[ … ] mediaRecorder.start();

[ … ] mediaRecorder.stop(); mediaRecorder.release();

Page 25 Fall 2012 CS 495/595 - App Development for Smart Devices

Using Camera and Taking Pictures

startActivityForResult (new Intent(MediaStore.ACTION_IMAGE_CAPTURE), TAKE_PICTURE);

•  The easiest way is using the ACTION_IMAGE_CAPTURE Media Store static constant in an Intent passed to startActivityForResult

•  The image capture action supports two modes: ➤ Thumbnail - By default, the picture taken will return a thumbnail Bitmap in the data extra within the Intent parameter returned in onActivityResult. Call getParcelableExtra specifying the extra name data on the Intent parameter to return the thumbnail as a Bitmap.

➤ Full image - Specify an output URI using a MediaStore.EXTRA_OUTPUT extra in the launch Intent, the full-size image taken by the camera will be saved to the specified location. No thumbnail will be returned in the Activity result callback and the result Intent data will be null.

Page 26 Fall 2012 CS 495/595 - App Development for Smart Devices

Taking Pictures using Intent

private static int TAKE_PICTURE = 1; private Uri outputFileUri; private void getThumbailPicture() { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, TAKE_PICTURE); } private void saveFullImage() { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); File file = new File(Environment.getExternalStorageDirectory(), "test.jpg"); outputFileUri = Uri.fromFile(file); intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); startActivityForResult(intent, TAKE_PICTURE); }

Page 27 Fall 2012 CS 495/595 - App Development for Smart Devices

Taking Pictures using Intent

@Override protected void onActivityResult(int requestCode, int resultCode, Intent picData) { if (requestCode == TAKE_PICTURE) {

Uri imageUri = null;

// Check if the result includes a thumbnail Bitmap if (picData != null) { if (picData.hasExtra("data")) { Bitmap thumbnail = picData.getParcelableExtra("data"); // TODO Do something with the thumbnail } } else { // TODO Do something with the full image stored // in outputFileUri }

} }

Page 28 Fall 2012 CS 495/595 - App Development for Smart Devices

Using Camera

Camera camera = Camera.open(); [ . . . Do things with the camera . . . ] camera.release();

•  Need to add the CAMERA permission to your application manifest. o  <uses-permission android:name="android.permission.CAMERA"/>

•  To access the Camera Service, use open method on the Camera class. When you’re done, relinquish your hold on Camera by calling release

•  To modify camera settings, use the set* methods on Camera.Parameters object. Then, call Camera’s setParameters method to pass modified Parameters object.

Camera.Parameters parameters = camera.getParameters(); List<String> colorEffects = parameters.getSupportedColorEffects(); if (colorEffects.contains(Camera.Parameters.EFFECT_SEPIA)) parameters.setColorEffect(Camera.Parameters.EFFECT_SEPIA); camera.setParameters(parameters);

Parameter Reference: http://developer.android.com/reference/android/hardware/Camera.Parameters.html

Page 29 Fall 2012 CS 495/595 - App Development for Smart Devices

Using Camera

camera.autoFocus(new AutoFocusCallback() { public void onAutoFocus(boolean success, Camera camera) { // TODO Do something on Auto-Focus success } });

•  Monitor the success of the Camera auto focus operation by adding an AutoFocusCallback to the Camera object.

•  To view the live camera stream, include a Surface View. •  Implement a SurfaceHolder.Callback to listen for surface’s construction,

before passing it in to the setPreviewDisplay method of Camera object. •  A call to startPreview will begin the streaming and stopPreview will end it

public class MyActivity extends Activity implements SurfaceHolder.Callback { private Camera camera; @Override public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState); setContentView(R.layout.main); SurfaceView surface = (SurfaceView)findViewById(R.id.surface); SurfaceHolder holder = surface.getHolder();

Page 30 Fall 2012 CS 495/595 - App Development for Smart Devices

Using Camera holder.addCallback(this); holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); holder.setFixedSize(400, 300);

}

public void surfaceCreated(SurfaceHolder holder) { if (mediaRecorder == null) {

try { camera = camera.open();

camera.setPreviewDisplay(holder); camera.startPreview(); [ . . . Draw on the Surface . . . ] } catch (IOException e) { Log.d("CAMERA", e.getMessage()); } } }

public void surfaceDestroyed(SurfaceHolder holder) { camera.stopPreview();

camera.release(); } }

Page 31 Fall 2012 CS 495/595 - App Development for Smart Devices

Taking Pictures using Camera •  Call takePicture and pass in a ShutterCallback and two

PictureCallback implementations (for RAW and JPEG-encoded).

•  The shutter callback is triggered immediately after the shutter is closed. private void takePicture() { camera.takePicture(shutterCallback, rawCallback, jpegCallback); } ShutterCallback shutterCallback = new ShutterCallback() { public void onShutter() {

// TODO Do something when the shutter closes. } }; PictureCallback rawCallback = new PictureCallback() { public void onPictureTaken(byte[] data, Camera camera) {

// TODO Do something with the image RAW data. } };

Page 32 Fall 2012 CS 495/595 - App Development for Smart Devices

Taking Pictures using Camera

PictureCallback jpegCallback = new PictureCallback() { public void onPictureTaken(byte[] data, Camera camera) {

// Save the image JPEG data to the SD card FileOutputStream outStream = null; try { outStream = new FileOutputStream("/sdcard/test.jpg"); outStream.write(data); outStream.close(); } catch (FileNotFoundException e) { Log.d("CAMERA", e.getMessage()); } catch (IOException e) { Log.d("CAMERA", e.getMessage()); }

} };

Page 33 Fall 2012 CS 495/595 - App Development for Smart Devices

Speech Recognition

Page 34 Fall 2012 CS 495/595 - App Development for Smart Devices

Speech Recognition •  Android supports voice input and speech recognition using the

RecognizerIntent class.

•  Voice recognition is initiated by calling startNewActivityForResult, passing in an Intent with RecognizerIntent.ACTION_RECOGNIZE_SPEECH

•  Intent must include RecognizerIntent.EXTRA_LANGUAGE_MODEL extra to specify the language model used to parse the input audio (LANGUAGE_MODEL_FREE_FORM, or LANGUAGE_MODEL_WEB_SEARCH).

•  You can also specify a number of optional extras: ➤ EXTRA_PROMPT Specify a string that will be displayed in the voice input dialog to prompt the user to speak. ➤ EXTRA_MAXRESULTS Integer value to limit the number of potential recognition results returned. ➤ EXTRA_LANGUAGE Specify an input language other than the device default.

Page 35 Fall 2012 CS 495/595 - App Development for Smart Devices

Speech Recognition (Example)

Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH) // Specify free form input intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "or forever hold your peace"); intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 1); intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.ENGLISH); startActivityForResult(intent, VOICE_RECOGNITION);

•  Voice recognition in English, returning one result, with custom prompt.

Page 36 Fall 2012 CS 495/595 - App Development for Smart Devices

Speech Recognition (Example)

@Override protected void onActivityResult(int requestCode, int resultCode,

Intent data) { if (requestCode == VOICE VOICE_RECOGNITION &&

resultCode == RESULT_OK) { ArrayList<String> results; results = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS); // TODO Do something with the recognized voice strings

} super.onActivityResult(requestCode, resultCode, data); }

•  The results are returned through the onActivityResult handler as an Array List of strings in the EXTRA_RESULTS extra each represents a potential match.

Page 37 Fall 2012 CS 495/595 - App Development for Smart Devices

Telephony

Page 38 Fall 2012 CS 495/595 - App Development for Smart Devices

Overview

•  The Android telephony APIs allows: ➤ Access the underlying telephone hardware stack

➤ Create your own dialer

➤ Integrate call handling and phone state monitoring •  For security, you can’t create your own ‘‘in call’’ Activity ➤ The screen that is displayed when an incoming call is received or an outgoing call has been placed.

Page 39 Fall 2012 CS 495/595 - App Development for Smart Devices

Launching the Dialer

•  Use Intent Intent.ACTION_DIAL to launch dialer activity. •  Specify the number to dial using the tel: schema as the data

component of the Intent. •  Allows you to manage the call initialization (the default dialer

asks the user to explicitly initiate the call). •  Doesn’t require any permissions •  The standard way applications should initiate calls.

Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:1234567")); startActivity(intent);

Page 40 Fall 2012 CS 495/595 - App Development for Smart Devices

Telephony Manager •  Access to the telephony APIs is managed by the

Telephony Manager String srvcName = Context.TELEPHONY_SERVICE; TelephonyManager telephonyManager = (TelephonyManager)getSystemService(srvcName);

•  Thru Telephony Manager you can obtain: ➤ the phone type (GSM or CDMA), ➤ unique ID (IMEI or MEID), ➤ software version, ➤ number.

•  Requires the READ_PHONE_STATE uses-permission be included in the application manifest.

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

Telephony Manager Reference: http://developer.android.com/reference/android/telephony/TelephonyManager.html

Page 41 Fall 2012 CS 495/595 - App Development for Smart Devices

Telephony Manager

Sensor Manager Location Manager Telephony

Manager

Page 42 Fall 2012 CS 495/595 - App Development for Smart Devices

Reading Phone Details // Read the phone’s type int phoneType = telephonyManager.getPhoneType(); switch (phoneType) { case (TelephonyManager.PHONE_TYPE_CDMA): //do something

break; case (TelephonyManager.PHONE_TYPE_GSM) : //do something

break; case (TelephonyManager.PHONE_TYPE_NONE): //do something

break; default:

break; }

// -- These require READ_PHONE_STATE uses-permission -- // Read the IMEI for GSM or MEID for CDMA String deviceId = telephonyManager.getDeviceId();

// Read the software version on the phone (note -- not the SDK version) String softwareVersion = telephonyManager.getDeviceSoftwareVersion();

// Get the phone’s number String phoneNumber = telephonyManager.getLine1Number();

Page 43 Fall 2012 CS 495/595 - App Development for Smart Devices

Reading Data Connection Status int dataActivity = telephonyManager.getDataActivity(); int dataState = telephonyManager.getDataState(); switch (dataActivity) { case TelephonyManager.DATA_ACTIVITY_IN: //Currently receiving IP PPP traffic.

break; case TelephonyManager.DATA_ACTIVITY_OUT: //Currently sending IP PPP traffic.

break; case TelephonyManager.DATA_ACTIVITY_INOUT: //Currently both IN & OUT

break; case TelephonyManager.DATA_ACTIVITY_NONE: //No traffic.

break; }

switch (dataState) { case TelephonyManager.DATA_CONNECTED: //Connected.

break; case TelephonyManager.DATA_CONNECTING: //Currently setting up data connection

break; case TelephonyManager.DATA_DISCONNECTED: //Disconnected

break; case TelephonyManager.DATA_SUSPENDED: //Suspended

break; }

Page 44 Fall 2012 CS 495/595 - App Development for Smart Devices

Reading Network Details // Get connected network country ISO code String networkCountry = telephonyManager.getNetworkCountryIso();

// Get the connected network operator ID (MCC + MNC) String networkOperatorId = telephonyManager.getNetworkOperator();

// Get the connected network operator name String networkName = telephonyManager.getNetworkOperatorName();

// Get the type of network you are connected to int networkType = telephonyManager.getNetworkType(); switch (networkType) { case (TelephonyManager.NETWORK_TYPE_1xRTT): /* … */ break; case (TelephonyManager.NETWORK_TYPE_CDMA) : /* … */ break; case (TelephonyManager.NETWORK_TYPE_EDGE) : /* … */ break; case (TelephonyManager.NETWORK_TYPE_EVDO_0) : /* … */ break; case (TelephonyManager.NETWORK_TYPE_EVDO_A) : /* … */ break; case (TelephonyManager.NETWORK_TYPE_GPRS) : /* … */ break; case (TelephonyManager.NETWORK_TYPE_HSDPA) : /* … */ break; case (TelephonyManager.NETWORK_TYPE_HSPA) : /* … */ break; case (TelephonyManager.NETWORK_TYPE_HSUPA) : /* … */ break; case (TelephonyManager.NETWORK_TYPE_UMTS) : /* … */ break; case (TelephonyManager.NETWORK_TYPE_UNKNOWN): /* … */ break; default: break; }

Info about Service Providers in USA: http://en.wikipedia.org/wiki/List_of_United_States_wireless_communications_service_providers

Page 45 Fall 2012 CS 495/595 - App Development for Smart Devices

Reading SIM Details int simState = telephonyManager.getSimState(); switch (simState) { case (TelephonyManager.SIM_STATE_ABSENT): break; case (TelephonyManager.SIM_STATE_NETWORK_LOCKED): break; case (TelephonyManager.SIM_STATE_PIN_REQUIRED): break; case (TelephonyManager.SIM_STATE_PUK_REQUIRED): break; case (TelephonyManager.SIM_STATE_UNKNOWN): break; case (TelephonyManager.SIM_STATE_READY): {

// Get the SIM country ISO code String simCountry = telephonyManager.getSimCountryIso(); // Get the operator code of the active SIM (MCC + MNC) String simOperatorCode = telephonyManager.getSimOperator(); // Get the name of the SIM operator String simOperatorName = telephonyManager.getSimOperatorName(); // -- Requires READ_PHONE_STATE uses-permission --

// Get the SIM’s serial number String simSerial = telephonyManager.getSimSerialNumber(); break;

} default: break; }

Page 46 Fall 2012 CS 495/595 - App Development for Smart Devices

Monitoring Phone Status •  Android lets you: ➤ monitor phone state, ➤ retrieve incoming phone numbers, ➤ observe changes to data connections, signal strength, and network connectivity.

•  Must specify the READ_PHONE_STATE uses-permission in its manifest

•  Extend PhoneStateListener class to listen and respond to: ➤ Phone state change events including call state (ringing, off hook, etc.), ➤ Cell location changes, ➤ Voice-mail and call-forwarding status, ➤ Phone service changes, ➤ Changes in mobile signal strength.

PhoneStateListener Reference: http://developer.android.com/reference/android/telephony/PhoneStateListener.html

Page 47 Fall 2012 CS 495/595 - App Development for Smart Devices

Monitoring Phone Status

PhoneStateListener phoneStateListener = new PhoneStateListener() { public void onCallForwardingIndicatorChanged(boolean cfi) {} public void onCallStateChanged(int state, String incomingNumber) {} public void onCellLocationChanged(CellLocation location) {} public void onDataActivity(int direction) {} public void onDataConnectionStateChanged(int state) {} public void onMessageWaitingIndicatorChanged(boolean mwi) {} public void onServiceStateChanged(ServiceState serviceState) {} public void onSignalStrengthChanged(int asu) {} };

•  Phone State Listener skeleton class

telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_FORWARDING_INDICATOR | PhoneStateListener.LISTEN_CALL_STATE | PhoneStateListener.LISTEN_CELL_LOCATION | PhoneStateListener.LISTEN_DATA_ACTIVITY | PhoneStateListener.LISTEN_DATA_CONNECTION_STATE | PhoneStateListener.LISTEN_MESSAGE_WAITING_INDICATOR | PhoneStateListener.LISTEN_SERVICE_STATE | PhoneStateListener.LISTEN_SIGNAL_STRENGTH);

•  Registering a Phone State Listener

Page 48 Fall 2012 CS 495/595 - App Development for Smart Devices

Monitoring Phone Calls

PhoneStateListener callStateListener = new PhoneStateListener() { public void onCallStateChanged(int state, String incomingNumber) { // TODO React to incoming call. } }; telephonyManager.listen(callStateListener, PhoneStateListener.LISTEN_CALL_STATE);

•  The onCallStateChanged handler receives the phone number associated with incoming calls, and the state parameter represents the current call state:

➤ TelephonyManager.CALL_STATE_IDLE When the phone is neither ringing nor in a call ➤ TelephonyManager.CALL_STATE_RINGING When the phone is ringing ➤ TelephonyManager.CALL_STATE_OFFHOOK When the phone is currently in a call

Page 49 Fall 2012 CS 495/595 - App Development for Smart Devices

Tracking Cell Location Changes

PhoneStateListener cellLocationListener = new PhoneStateListener() { public void onCellLocationChanged(CellLocation location) { GsmCellLocation gsmLocation = (GsmCellLocation)location;

Toast.makeText(getApplicationContext(), String.valueOf(gsmLocation.getCid()), Toast.LENGTH_LONG).show();

} }; telephonyManager.listen(cellLocationListener, PhoneStateListener.LISTEN_CELL_LOCATION);

•  Override onCellLocationChanged to listen for cell location changes

•  Add the ACCESS_COARSE_LOCATION permission to your application manifest.

•  Handler receives a CellLocation object that includes methods for extracting the cell ID (getCid) and the current LAC (getLac).

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

Page 50 Fall 2012 CS 495/595 - App Development for Smart Devices

Tracking Service Changes

PhoneStateListener serviceStateListener = new PhoneStateListener() { public void onServiceStateChanged(ServiceState serviceState) { if (serviceState.getState() == ServiceState.STATE_IN_SERVICE) {

String toastText = serviceState.getOperatorAlphaLong(); Toast.makeText(getApplicationContext(), toastText, Toast.LENGTH_SHORT);

} } };

telephonyManager.listen(serviceStateListener, PhoneStateListener.LISTEN_SERVICE_STATE);

•  The onServiceStateChanged handler tracks the service •  Use the ServiceState parameter with getState method to find details

of the current service state. ➤ STATE_IN_SERVICE Normal phone service is available. ➤ STATE_EMERGENCY_ONLY Phone service is available only for emergency calls. ➤ STATE_OUT_OF_SERVICE No cell phone service is currently available. ➤ STATE_POWER_OFF The phone radio is turned off

•  getOperator* methods to retrieve details on the operator while getRoaming tells you if the device is using a roaming profile.

ServiceState Reference: http://developer.android.com/reference/android/telephony/ServiceState.html

Page 51 Fall 2012 CS 495/595 - App Development for Smart Devices

Monitoring Data Connection/Activity

PhoneStateListener dataStateListener = new PhoneStateListener() { public void onDataActivity(int direction) { switch (direction) {

case TelephonyManager.DATA_ACTIVITY_IN : break; case TelephonyManager.DATA_ACTIVITY_OUT : break; case TelephonyManager.DATA_ACTIVITY_INOUT : break; case TelephonyManager.DATA_ACTIVITY_NONE : break;

} } public void onDataConnectionStateChanged(int state) { switch (state) {

case TelephonyManager.DATA_CONNECTED : break; case TelephonyManager.DATA_CONNECTING : break; case TelephonyManager.DATA_DISCONNECTED : break; case TelephonyManager.DATA_SUSPENDED : break;

} } };

telephonyManager.listen(dataStateListener, PhoneStateListener.LISTEN_DATA_ACTIVITY | PhoneStateListener.LISTEN_DATA_CONNECTION_STATE);

•  Override onDataActivity to track data transfer activity, and onDataConnectionStateChanged to request notifications for data connection state changes.

Page 52 Fall 2012 CS 495/595 - App Development for Smart Devices

Questions?

Page 53 Fall 2012 CS 495/595 - App Development for Smart Devices

• Example - SoundPool

• Example - VideoView

To DO

Page 54 Fall 2012 CS 495/595 - App Development for Smart Devices

•  Android provides two API's for playing sounds: SoundPool and MediaPlayer.

•  SoundPool can be used for small audio clips. It can repeat sounds and play several sounds simultaneously. The sound files played with SoundPool should not exceed 1 MB.

•  SoundPool does load the file asynchronously. In recent Android SDK, i t is possib le to check i f the loading is complete v ia OnLoadCompleteListener.

•  Mediaplayer is better suited for longer music and movies.

SoundPool

Page 55 Fall 2012 CS 495/595 - App Development for Smart Devices

•  Create an application that will start playing a sound once the finger touches the display. Create an Android project “cs.edu.odu.cs495.soundpool" with the Activity "PlaySound“

•  Get a free sound effect from http://hamsterrepublic.com/ohrrpgce/Free_Sound_Effects.html, put it into your "res/raw" folder under the name "sound1.ogg".

Example of SoundPool

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:text="Click on the screen to start playing" android:id="@+id/textView1" android:layout_width="fill_parent" android:layout_height="fill_parent"> </TextView> </LinearLayout>

main.xml

Page 56 Fall 2012 CS 495/595 - App Development for Smart Devices

Example of SoundPool

package edu.odu.cs.cs495.soundpool; import android.app.Activity; import android.media.AudioManager; import android.media.SoundPool; import android.media.SoundPool.OnLoadCompleteListener; import android.os.Bundle; import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; public class PlaySound extends Activity implements OnTouchListener { private SoundPool soundPool; private int soundID; boolean loaded = false;

Page 57 Fall 2012 CS 495/595 - App Development for Smart Devices

Example of SoundPool

/** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); View view = findViewById(R.id.textView1); view.setOnTouchListener(this); // Set the hardware buttons to control the music this.setVolumeControlStream(AudioManager.STREAM_MUSIC); // Load the sound soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0); soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() { @Override public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {

loaded = true; }

}); soundID = soundPool.load(this, R.raw.sound1, 1); }

Page 58 Fall 2012 CS 495/595 - App Development for Smart Devices

Example of SoundPool

@Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { // Getting the user sound settings

AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE); float actualVolume = (float) audioManager. getStreamVolume(AudioManager.STREAM_MUSIC); float maxVolume = (float) audioManager. getStreamMaxVolume(AudioManager.STREAM_MUSIC); float volume = actualVolume / maxVolume; // Is the sound loaded already? if (loaded) { soundPool.play(soundID, volume, volume, 1, 0, 1f); Log.e("Test", "Played sound"); }

} return false; } }

Page 59 Fall 2012 CS 495/595 - App Development for Smart Devices

<?xml  version="1.0"  encoding="utf-­‐8"?>  <LinearLayout  xmlns:android="http://schemas.android.com/apk/res/android"        android:orientation="vertical"        android:layout_width="fill_parent"        android:layout_height="fill_parent"        >        <TextView  android:layout_width="fill_parent"          android:layout_height="wrap_content"          android:text="@string/hello"        />        <LinearLayout  android:orientation="vertical"  

       android:layout_width="fill_parent"          android:layout_height="wrap_content">  

             <VideoView  android:id="@+id/myvideoview"                  android:layout_width="fill_parent"                  android:layout_height="wrap_content"  />  

     </LinearLayout>  </LinearLayout>

•  A simple example using VideoView to play 3gp from YouTube

Example of VideoView

main.xml

Page 60 Fall 2012 CS 495/595 - App Development for Smart Devices

Example of VideoView package  edu.odu.cs.cs495.MyVideoView;      import  android.app.Activity;  import  android.net.Uri;  import  android.os.Bundle;  import  android.widget.MediaController;  import  android.widget.VideoView;      public  class  MyVideoView  extends  Activity  {      String  SrcPath  =  "rtsp://<REPLACE  WITH  PATH  TO  YouTube  video  (3gp)>";            /**  Called  when  the  activity  is  first  created.  */        @Override        public  void  onCreate(Bundle  savedInstanceState)  {                super.onCreate(savedInstanceState);                setContentView(R.layout.main);                VideoView  myVideoView  =  (VideoView)findViewById(R.id.myvideoview);                myVideoView.setVideoURI(Uri.parse(SrcPath));                myVideoView.setMediaController(new  MediaController(this));                myVideoView.requestFocus();                myVideoView.start();        }  }