Android Audio Video - PowerPoint PPT Presentation

About This Presentation
Title:

Android Audio Video

Description:

Android Audio Video Mobile Application Development Selected Topics CPIT 490 * – PowerPoint PPT presentation

Number of Views:188
Avg rating:3.0/5.0
Slides: 57
Provided by: Vill107
Category:

less

Transcript and Presenter's Notes

Title: Android Audio Video


1
Android Audio Video
  • Mobile Application Development
  • Selected Topics CPIT 490

2
Objective
  • Playing Audio Video
  • Media Player
  • Recording Audio Video
  • Media Recorder
  • Taking Video, Picture, Audio
  • Speech Recognition
  • Telephony
  • Initiating phone calls
  • Reading the phone and SIM states
  • Monitoring changes to the phone

3
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

4
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 youve finished playback, call
    mediaPlayer.release() to free the associated
    resources.
  • Media Player reference
  • http//developer.android.com/reference/android/med
    ia/MediaPlayer.html

5
Media Player
  • The Media Players 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.

6
Preparing for Audio Playback
  • Use the static method, passing in the application
    Context and create 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
  • Context appContext getApplicationContext()
  • MediaPlayer resourcePlayer MediaPlayer.create(
    appContext, R.raw.my_audio)
  • MediaPlayer filePlayer MediaPlayer.create(appCo
    ntext, Uri.parse("file//sdcard/localfile.mp3"))
  • MediaPlayer urlPlayer MediaPlayer.create(appCo
    ntext, Uri.parse("http//site.com/audio/audio.mp3"
    ))
  • MediaPlayer contentPlayer MediaPlayer.create(a
    ppContext, Settings.System.DEFAULT_RINGTONE_URI
    )

7
Preparing for Audio Playback
  • 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
  • MediaPlayer mediaPlayer new MediaPlayer()
  • mediaPlayer.setDataSource("/sdcard/test.3gp")
  • mediaPlayer.prepare()

8
Preparing for Video Playback
  • Need to specify a display surface on which to
    show the video.
  • ltVideoView androidid"_at_id/VideoView
  • androidlayout_height"fill_parent"
  • androidlayout_width"fill_parent"
    gt
  • lt/VideoViewgt
  • ltSurfaceView androidid"_at_id/surface"
  • androidlayout_width"wrap_content"
    androidlayout_height"wrap_content"
  • androidlayout_gravity"center"gt
  • lt/SurfaceViewgt
  • 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.

9
Video Playback using Video View
  • 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
  • streamingVideoView.setVideoUri("http//www.mysite.
    com/videos/myvideo.3gp")
  • localVideoView.setVideoPath("/sdcard/test2.3gp")

10
Video Playback using Video View
  • 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.
  •   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()

11
Setting a Surface for Video Playback
  • 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

12
Surface for Video Playback
  • Sample layout including a Surface View
  • lt?xml version"1.0" encoding"utf-8"?gt
  • ltLinearLayout xmlnsandroid"http//schemas.and
    roid.com/apk/res/android"
  • androidorientation"vertical"
  • androidlayout_width"fill_parent"
  • androidlayout_height"fill_parent"gt
  • ltSurfaceView androidid"_at_id/surface"
  • androidlayout_width"wrap_content"
  • androidlayout_height"wrap_content"
  • androidlayout_gravity"center"gt
  • lt/SurfaceViewgt
  • lt/LinearLayoutgt

13
Surface for Video Playback
  • Initializing and assigning a Surface View to a
    Media Player (1)
  • public class MyActivity extends Activity
    implements SurfaceHolder.Callback
  • private MediaPlayer mediaPlayer
  • _at_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_BU
    FFERS)
  • holder.setFixedSize(400, 300)

14
Surface for Video Playback
  • Initializing and assigning a Surface View to a
    Media Player (2)
  • public void surfaceCreated(SurfaceHolder
    holder)
  • try mediaPlayer.setDisplay(holder)
  • mediaPlayer.setDataSource("/sdcard/test2.3g
    p")
  • 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)

15
Controlling Playback
  • 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.
  •   mediaPlayer.start()
  • int pos mediaPlayer.getCurrentPosition()
  • int duration mediaPlayer.getDuration()
  • mediaPlayer.seekTo(pos (duration-pos)/10)
  • . . . wait for a duration . . .
  • mediaPlayer.stop()

16
Controlling Playback
  • Use the isLooping and setLooping methods to
    specify if the media being played should loop
    when it completes.
  • if (!mediaPlayer.isLooping())
    mediaPlayer.setLooping(true)
  • To enable a Wake Lock that will keep the screen
    on during video playback use the
    setScreenOnWhilePlaying method.
  •   mediaPlayer.setScreenOnWhilePlaying(true)
  • 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.
  • mediaPlayer.setVolume(1f, 0.5f)

17
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.

18
Using Intents to Record Audio/Video
  • Use the ACTION_VIDEO_CAPTURE Media Store static
    constant in an Intent passed to
    startActivityForResult to launch the native
    video camera Activity.
  • startActivityForResult (new Intent(MediaStore.ACTI
    ON_VIDEO_CAPTURE), RECORD_VIDEO)
  • 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.

19
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.AC
    TION_VIDEO_CAPTURE)
  • if (outputpath ! null)
    intent.putExtra(MediaStore.EXTRA_OUTPUT,
    outputpath)
  • intent.putExtra(MediaStore.EXTRA_VIDEO_QU
    ALITY, HIGH_VIDEO_QUALITY)
  • startActivityForResult(intent,
    RECORD_VIDEO)
  • _at_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

20
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.
  • ltuses-permission androidname"android.permission.
    RECORD_AUDIO"/gt
  • ltuses-permission androidname"android.permission.
    RECORD_VIDEO"/gt
  • 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/med
    ia/MediaRecorder.html

21
Using the Media Recorder
  • 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.

22
Configure Audio/Video Recording
  • MediaRecorder mediaRecorder new
    MediaRecorder()
  • // Configure the input sources
  • mediaRecorder.setAudioSource(MediaRecorder.Aud
    ioSource.MIC)
  • mediaRecorder.setVideoSource(MediaRecorder.Vid
    eoSource.CAMERA)
  • // Set the output format
  • mediaRecorder.setOutputFormat(MediaRecorder.Ou
    tputFormat.DEFAULT)
  • // Specify the audio and video encoding
  • mediaRecorder.setAudioEncoder(MediaRecorder.Au
    dioEncoder.DEFAULT)
  • mediaRecorder.setVideoEncoder(MediaRecorder.Vi
    deoEncoder.DEFAULT)
  • // Specify the output file
  • mediaRecorder.setOutputFile("/sdcard/myoutputf
    ile.mp4")
  • // Prepare to record
  • mediaRecorder.prepare()
  • mediaRecorder.start()
  • mediaRecorder.stop()
  • mediaRecorder.release()

23
Using Camera and Taking Pictures
  • The easiest way is using the ACTION_IMAGE_CAPTURE
    Media Store static constant in an Intent passed
    to startActivityForResult
  •  startActivityForResult (new Intent(
    MediaStore.ACTION_IMAGE_CAPTURE), TAKE_PICTURE)
  • 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.

24
Taking Pictures using Intent
  • private static int TAKE_PICTURE 1
  • private Uri outputFileUri
  • private void getThumbailPicture()
  • Intent intent new Intent(MediaStore.ACT
    ION_IMAGE_CAPTURE)
  • startActivityForResult(intent,
    TAKE_PICTURE)
  • private void saveFullImage()
  • Intent intent new Intent(MediaStore.ACT
    ION_IMAGE_CAPTURE)
  • File file new File(Environment.getExter
    nalStorageDirectory(), "test.jpg")
  • outputFileUri Uri.fromFile(file)
  • intent.putExtra(MediaStore.EXTRA_OUTPUT,
    outputFileUri)
  • startActivityForResult(intent,
    TAKE_PICTURE)

25
Taking Pictures using Intent
  • _at_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("dat
    a"))
  • Bitmap thumbnail picData.getParcelab
    leExtra("data")
  • // TODO Do something with the
    thumbnail
  • else
  • // TODO Do something with the full image
    stored in outputFileUri

26
Using Camera
  • Need to add the CAMERA permission to your
    application manifest.
  • ltuses-permission androidname"android.permission.
    CAMERA"/gt
  • To access the Camera Service, use open method
    on the Camera class. When youre done,
    relinquish your hold on Camera by calling
    release
  • Camera camera Camera.open()
  • . . . Do things with the camera . . .
  • camera.release()
  • To modify camera settings, use the set methods
    on Camera.Parameters object. Then, call
    Cameras setParameters method to pass modified
    Parameters object.
  • Camera.Parameters parameters
    camera.getParameters()
  • ListltStringgt colorEffects
    parameters.getSupportedColorEffects()
  • if (colorEffects.contains(Camera.Parameters.EF
    FECT_SEPIA))
  • parameters.setColorEffect(Camera.Param
    eters.EFFECT_SEPIA)
  • camera.setParameters(parameters)
  • Parameter Reference
  • http//developer.android.com/reference/android/har
    dware/Camera.Parameters.html

27
Using Camera
  • Monitor the success of the Camera auto focus
    operation by adding an AutoFocusCallback to the
    Camera object.
  • camera.autoFocus(new AutoFocusCallback()
  • public void onAutoFocus(boolean success,
    Camera camera)
  • // TODO Do something on
    Auto-Focus success
  • )
  • To view the live camera stream, include a Surface
    View.
  • Implement a SurfaceHolder.Callback to listen
    for surfaces 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
  • _at_Override
  • public void onCreate(Bundle
    savedInstanceState)
  • super.onCreate(savedInstanceState)
    setContentView(R.layout.main)
  • SurfaceView surface (SurfaceView)findViewById(R
    .id.surface)
  • SurfaceHolder holder surface.getHolder()

28
Using Camera
  • holder.addCallback(this)
  • holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BU
    FFERS)
  • holder.setFixedSize(400, 300)
  • public void surfaceCreated(SurfaceHolder
    holder)
  • if (mediaRecorder null)
  • try camera camera.open() camera.setPreviewDi
    splay(holder)
  • camera.startPreview()
  • . . . Draw on the Surface .
    . .
  • catch (IOException e)
    Log.d("CAMERA", e.getMessage())
  • public void surfaceDestroyed(SurfaceHolder
    holder)
  • camera.stopPreview() camera.release()

29
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.

30
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/t
    est.jpg")
  • outStream.write(data)
  • outStream.close()
  • catch (FileNotFoundException e)
    Log.d("CAMERA", e.getMessage())
  • catch (IOException e) Log.d("CAMERA",
    e.getMessage())

31
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_LANGUAG
    E_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.

32
Speech Recognition (Example)
  • Voice recognition in English, returning one
    result, with custom prompt.
  •   Intent intent new Intent(RecognizerIntent.AC
    TION_RECOGNIZE_SPEECH)
  • // Specify free form input
  • intent.putExtra(RecognizerIntent.EXTRA_LANGUAG
    E_MODEL,
  • RecognizerIntent.LANGUAGE_MODEL_FREE_FORM)
  • intent.putExtra(RecognizerIntent.EXTRA_PROMPT,
    "or forever hold your peace")
  • intent.putExtra(RecognizerIntent.EXTRA_MAX_RES
    ULTS, 1)
  • intent.putExtra(RecognizerIntent.EXTRA_LANGUAG
    E, Locale.ENGLISH)
  • startActivityForResult(intent,
    VOICE_RECOGNITION)

33
Speech Recognition (Example)
  • The results are returned through the
    onActivityResult handler as an Array List of
    strings in the EXTRA_RESULTS extra each
    represents a potential match.
  •   _at_Override
  • protected void onActivityResult(int
    requestCode, int resultCode, Intent data)
  • if (requestCode VOICE VOICE_RECOGNITION
    resultCode RESULT_OK)
  • ArrayListltStringgt results
  • results data.getStringArrayListExtra(Recognizer
    Intent.EXTRA_RESULTS)
  • // TODO Do something with the recognized voice
    strings
  • super.onActivityResult(requestCode,
    resultCode, data)

34
Telephony 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 cant create your own in
    call Activity
  • The screen that is displayed when an incoming
    call is received or an outgoing call has been
    placed.

35
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).
  • Doesnt require any permissions
  • The standard way applications should initiate
    calls.
  • Intent intent new Intent(Intent.ACTION_DIAL,
    Uri.parse("tel1234567"))
  • startActivity(intent)

36
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.
  • ltuses-permission androidname "
    android.permission.READ_PHONE_STATE " /gt
  • Telephony Manager Reference
  • http//developer.android.com/reference/android/tel
    ephony/TelephonyManager.html

37
Reading Phone Details
  • // Read the phones type
  • int phoneType telephonyManager.getPhoneTyp
    e()
  • 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.getDe
    viceSoftwareVersion()
  • // Get the phones number
  • String phoneNumber telephonyManager.getLine1N
    umber()

38
Reading Data Connection Status
  • int dataActivity telephonyManager.getDataActivit
    y()
  • 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

39
Reading Network Details
  • // Get connected network country ISO code
  • String networkCountry telephonyManager.getNet
    workCountryIso()
  • // Get the connected network operator ID (MCC
    MNC)
  • String networkOperatorId telephonyManager.get
    NetworkOperator()
  • // Get the connected network operator name
  • String networkName telephonyManager.getNetwor
    kOperatorName()
  • // Get the type of network you are connected
    to
  • int networkType telephonyManager.getNetworkTy
    pe()
  • 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

40
Reading SIM Details
  • int simState telephonyManager.getSimState()
  • switch (simState) case (TelephonyManager.SIM
    _STATE_ABSENT) break
  • case (TelephonyManager.SIM_STATE_NETWORK_L
    OCKED) break
  • case (TelephonyManager.SIM_STATE_PIN_REQUI
    RED) break
  • case (TelephonyManager.SIM_STATE_PUK_REQUI
    RED) break
  • case (TelephonyManager.SIM_STATE_UNKNOWN)
    break
  • case (TelephonyManager.SIM_STATE_READY)
  • // Get the SIM country ISO code
  • String simCountry telephonyManager.getSimCountr
    yIso()
  • // Get the operator code of the active SIM (MCC
    MNC)
  • String simOperatorCode telephonyManager.getSimO
    perator()
  • // Get the name of the SIM operator
  • String simOperatorName telephonyManager.getSimO
    peratorName()
  • // -- Requires READ_PHONE_STATE uses-permission
    --
  • // Get the SIMs serial number
  • String simSerial telephonyManager.getSimSerialN
    umber()
  • break default break

41
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/tel
    ephony/PhoneStateListener.html

42
Monitoring Phone Status
  • Phone State Listener skeleton class
  • PhoneStateListener phoneStateListener new
    PhoneStateListener()
  • public void onCallForwardingIndicatorChan
    ged(boolean cfi)
  • public void onCallStateChanged(int
    state, String incomingNumber)
  • public void onCellLocationChanged(CellLoc
    ation location)
  • public void onDataActivity(int
    direction)
  • public void onDataConnectionStateChanged(
    int state)
  • public void onMessageWaitingIndicatorChan
    ged(boolean mwi)
  • public void onServiceStateChanged(Service
    State serviceState)
  • public void onSignalStrengthChanged(int
    asu)
  • Registering a Phone State Listener
  • telephonyManager.listen(phoneStateListener,
    PhoneStateListener.LISTEN_CALL_FORWARDING_INDICATO
    R PhoneStateListener.LISTEN_CALL_STATE
    PhoneStateListener.LISTEN_CELL_LOCATION
    PhoneStateListener.LISTEN_DATA_ACTIVITY
    PhoneStateListener.LISTEN_DATA_CONNECTION_STATE
    PhoneStateListener.LISTEN_MESSAGE_WAITING_INDICA
    TOR PhoneStateListener.LISTEN_SERVICE_STATE
    PhoneStateListener.LISTEN_SIGNAL_STRENGTH)

43
Monitoring Phone Calls
  • 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
  •   PhoneStateListener callStateListener new
    PhoneStateListener()
  • public void onCallStateChanged(int
    state, String incomingNumber)
  • // TODO React to incoming call.
  • telephonyManager.listen(callStateListener,
    PhoneStateListener.LISTEN_CALL_STATE)

44
Tracking Cell Location Changes
  • Override onCellLocationChanged to listen for
    cell location changes
  • Add the ACCESS_COARSE_LOCATION permission to your
    application manifest.
  • ltuses-permission androidname "
    android.permission.ACCESS_COARSE_LOCATION " /gt
  • Handler receives a CellLocation object that
    includes methods for extracting the cell ID (
    getCid ) and the current LAC ( getLac ).
  • PhoneStateListener cellLocationListener new
    PhoneStateListener()
  • public void onCellLocationChanged(CellLoc
    ation location)
  • GsmCellLocation gsmLocation
    (GsmCellLocation)location
  • Toast.makeText(getApplicationContext(),
    String.valueOf(gsmLocation.getCid()),
  • Toast.LENGTH_LONG).show()
  • telephonyManager.listen(cellLocationListener,
    PhoneStateListener.LISTEN_CELL_LOCATION)

45
Tracking Service Changes
  • 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.
  • PhoneStateListener serviceStateListener new
    PhoneStateListener()
  • public void onServiceStateChanged(ServiceS
    tate serviceState)
  • if (serviceState.getState()
    ServiceState.STATE_IN_SERVICE)
  • String toastText serviceState.getOperatorAlphaL
    ong()
  • Toast.makeText(getApplicationContext(),
    toastText, Toast.LENGTH_SHORT)
  • telephonyManager.listen(serviceStateListener,
    PhoneStateListener.LISTEN_SERVICE_STATE)
  • ServiceState Reference
  • http//developer.android.com/reference/android/tel
    ephony/ServiceState.html

46
Monitoring Data Connection/Activity
  • Override onDataActivity to track data transfer
    activity, and onDataConnectionStateChanged to
    request notifications for data connection state
    changes.
  • 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(i
    nt 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
    )

47
Using Camera
  • Permissions in Manifest
  • Using the Camera
  • ltuses-permission androidnameandroid.permission.
    CAMERA /gt
  • ltuses-feature androidnameandorid.hardware.camer
    a /gt
  • Writing to External Storage
  • ltuses-permission androidnameandroid.permission.
    WRITE_EXTERNAL_STORAGE /gt
  • Steps to using Camera
  • Intent
  • Intent intent new Intent(MediaStore.ACTION_IMAGE
    _CAPTURE)
  • File Name
  • File folder new File(Environment.getExternalStor
    ageDirectory(), FolderName)
  • Need to mkdirs()
  • File image new File(folder, imageName.jpg)

48
Using Camera
  • Steps to using camera
  • File URI
  • Uri fileUri Uri.fromFile(image)
  • Starting the Camera
  • intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri)
  • startActivityForResult(intent, requestCode)
  • Retrieve the image After user is ok with
    captured image, retrieve the image using
    onActivityResult
  • Can retrieve the image using the File Uri put in
    as an extra to the Camera intent

49
Example 1 - SoundPool
  • 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, it is possible to check
    if the loading is complete via
    OnLoadCompleteListener .
  • Mediaplayer is better suited for longer music
    and movies.

50
Example of SoundPool
  • 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//hamsterrepubli
    c.com/ohrrpgce/Free_Sound_Effects.html , put it
    into your "res/raw" folder under the name
    "sound1.ogg".
  • main.xml
  • lt?xml version "1.0" encoding "utf-8" ?gt
  • ltLinearLayout xmlnsandroid
    "http//schemas.android.com/apk/res/android"
  • androidorientation "vertical"
    androidlayout_width "fill_parent"
    androidlayout_height "fill_parent" gt
  • ltTextView androidtext "Click on the
    screen to start playing"
  • androidid
    "_at_id/textView1" androidlayout_width
    "fill_parent"
  • androidlayout_heig
    ht "fill_parent" gt
  • lt/TextViewgt
  • lt/LinearLayoutgt

51
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.OnLoadCompleteList
    ener
  • 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

52
Example of SoundPool
  • / Called when the activity is first created. /
  • _at_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(AudioManag
    er.STREAM_MUSIC)
  • // Load the sound
  • soundPool new SoundPool(10,
    AudioManager.STREAM_MUSIC, 0)
  • soundPool.setOnLoadCompleteListener(
    new OnLoadCompleteListener()
  • _at_Override
  • public void onLoadComplete(SoundPool
    soundPool, int sampleId, int status)
  • loaded true )
  • soundID soundPool.load( this ,
    R.raw.sound1, 1)

53
Example of SoundPool
  • _at_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

54
Example of Video View
  • A simple example using VideoView to play 3gp from
    YouTube
  • main.xml
  • lt?xml version"1.0 encoding"utf---8"?gt
  • ltLinearLayout xmlnsandroid"
  • http//schemas.android.com/apk/res/android"
  • androidorientation"vertical" androidlayout_widt
    h"fill_parent"
  • androidlayout_height"fill_parent gt
  • ltTextView androidlayout_width"fill_parent"
  • androidlayout_height"wrap_content"
  • androidtext"_at_string/hello" /gt
  • ltLinearLayout androidorientation"vertical"
  • androidlayout_width"fill_parent"
    androidlayout_height"wrap_content"gt
  • ltVideoView androidid"_at_id/myvideoview"
    androidlayout_width"fill_parent"
  • androidlayout_height"wrap_content" /gt
  • lt/LinearLayoutgt lt/LinearLayoutgt

55
Example of Video View
  • 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//ltREPLACE WITH PATH TO
    YouTube video (3gp)gt"
  • / Called when the activity is first created. /
  • _at_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()

56
References
  • App Development for Smart Devices
  • http//www.cs.odu.edu/cs495/
Write a Comment
User Comments (0)
About PowerShow.com