CSS216 MOBILE PROGRAMMING Android, Chapter 11 Book: “Professional Android™ 2 Application...

44
CSS216 MOBILE PROGRAMMING Android, Chapter 11 Book: “Professional Android™ 2 Application Development” by Reto Meier, 2010 by: Andrey Bogdanchikov ( [email protected] )

Transcript of CSS216 MOBILE PROGRAMMING Android, Chapter 11 Book: “Professional Android™ 2 Application...

Page 1: CSS216 MOBILE PROGRAMMING Android, Chapter 11 Book: “Professional Android™ 2 Application Development” by Reto Meier, 2010 by: Andrey Bogdanchikov ( andrey.bogdanchikov@sdu.edu.kz.

CSS216 MOBILE PROGRAMMING

Android, Chapter 11

Book: “Professional Android™ 2 Application Development” by Reto Meier, 2010

by: Andrey Bogdanchikov ( [email protected] )

Page 2: CSS216 MOBILE PROGRAMMING Android, Chapter 11 Book: “Professional Android™ 2 Application Development” by Reto Meier, 2010 by: Andrey Bogdanchikov ( andrey.bogdanchikov@sdu.edu.kz.

Outline(Audio, Video, and Using the Camera)

• Playing audio and video with the Media Player• Packaging audio as an application resource• Using the Video View for video playback• Recording audio and video with the Media Recorder• Recording video and taking pictures using Intents• Previewing recorded video and displaying live camera

streams• Taking pictures and controlling the camera• Adding media to the Media Store• Manipulating raw audio• Parse.com introduction• Parse objects• Signing up to parse.com from your application

Page 3: CSS216 MOBILE PROGRAMMING Android, Chapter 11 Book: “Professional Android™ 2 Application Development” by Reto Meier, 2010 by: Andrey Bogdanchikov ( andrey.bogdanchikov@sdu.edu.kz.

Introduction• The only modern technology that can compete with mobile

phones for ubiquity is the portable digital media player. As a result, the multimedia capabilities of mobile devices are a significant consideration for many consumers.

• Android’s open platform and provider-agnostic philosophy ensures that it offers a multimedia API capable of playing and recording a wide range of image, audio, and video formats, both locally and streamed.

• The Camera API and OpenCORE multimedia platform expose these capabilities to your applications, providing comprehensive multimedia functionality.

Page 4: CSS216 MOBILE PROGRAMMING Android, Chapter 11 Book: “Professional Android™ 2 Application Development” by Reto Meier, 2010 by: Andrey Bogdanchikov ( andrey.bogdanchikov@sdu.edu.kz.

Playing audio and video• Android includes a comprehensive Media Player to simplify

the playback of audio and video. This section describes how to use it to control and manipulate media playback within your applications.

• Android 2.1 (API level 7) supports the following multimedia formats for playback as part of the base framework.

• Audio• ➤ AAC LC/LTP HE-AACv1 (AAC+) HE-AACv2 ➤ ➤

(Enhanced AAC+) AMR-NB AMR-WB MP3 MIDI ➤ ➤ ➤ ➤ Ogg Vorbis PCM / WAVE➤ ➤

• Video• ➤ H.263 H.264 AVC MPEG-4 SP➤ ➤

Page 5: CSS216 MOBILE PROGRAMMING Android, Chapter 11 Book: “Professional Android™ 2 Application Development” by Reto Meier, 2010 by: Andrey Bogdanchikov ( andrey.bogdanchikov@sdu.edu.kz.

Introducing the Media Player

• Multimedia playback in Android is handled by the MediaPlayer class. You can play media stored in application resources, local files, Content Providers, or streamed from a network URL.

• In each case, the file format and type of multimedia being played is abstracted from you as a developer.

• The Media Player’s management of audio and video files and streams is handled as a state machine. In the most simplistic terms, transitions through the state machine can be described as follows:• 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 6: CSS216 MOBILE PROGRAMMING Android, Chapter 11 Book: “Professional Android™ 2 Application Development” by Reto Meier, 2010 by: Andrey Bogdanchikov ( andrey.bogdanchikov@sdu.edu.kz.

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

• The following section describes how to initialize and prepare the Media Player. After that, you’ll learn to control the playback to start, pause, stop, or seek the prepared media.

• In each case, once you’ve finished playback, call release on your Media Player object to free the associated resources:• mediaPlayer.release();

• Android supports a limited number of simultaneous Media Player objects; not releasing them can cause runtime exceptions when the system runs out of resources.

Page 7: CSS216 MOBILE PROGRAMMING Android, Chapter 11 Book: “Professional Android™ 2 Application Development” by Reto Meier, 2010 by: Andrey Bogdanchikov ( andrey.bogdanchikov@sdu.edu.kz.

Preparing Audio for Playback• There are a number of ways you can play audio content through the Media Player. You can include it as an application resource, play it from local files or Content Providers, or stream it from a remote URL.

Page 8: CSS216 MOBILE PROGRAMMING Android, Chapter 11 Book: “Professional Android™ 2 Application Development” by Reto Meier, 2010 by: Andrey Bogdanchikov ( andrey.bogdanchikov@sdu.edu.kz.

Initializing audio content for playbackContext 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 9: CSS216 MOBILE PROGRAMMING Android, Chapter 11 Book: “Professional Android™ 2 Application Development” by Reto Meier, 2010 by: Andrey Bogdanchikov ( andrey.bogdanchikov@sdu.edu.kz.

Alternating way• Using setDataSource and prepare to initialize audio

playback

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

Page 10: CSS216 MOBILE PROGRAMMING Android, Chapter 11 Book: “Professional Android™ 2 Application Development” by Reto Meier, 2010 by: Andrey Bogdanchikov ( andrey.bogdanchikov@sdu.edu.kz.

Preparing for Video Playback• Playback of video content is slightly more involved than audio.

To show a video, you must specify a display surface on which to show it. The following sections describe two alternatives for the playback of video content.

• The first, using the Video View control, encapsulates the creation of a display surface and allocation and preparation of video content within a Media Player.

• The second technique allows you to specify your own display surface and manipulate the underlying Media Player instance directly.

Page 11: CSS216 MOBILE PROGRAMMING Android, Chapter 11 Book: “Professional Android™ 2 Application Development” by Reto Meier, 2010 by: Andrey Bogdanchikov ( andrey.bogdanchikov@sdu.edu.kz.

Playing Video Using the Video View• The simplest way to play back video is to use the VideoView

control. The Video View includes a Surface on which the video is displayed and encapsulates and manages a Media Player to manage the video playback.

• Video Views conveniently encapsulate the initialization of the Media Player. To assign a video to play, simply 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");• Once initialized, you can 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: CSS216 MOBILE PROGRAMMING Android, Chapter 11 Book: “Professional Android™ 2 Application Development” by Reto Meier, 2010 by: Andrey Bogdanchikov ( andrey.bogdanchikov@sdu.edu.kz.

Video playback using a Video View

VideoView videoView = (VideoView)findViewById(R.id.surface);

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

Page 13: CSS216 MOBILE PROGRAMMING Android, Chapter 11 Book: “Professional Android™ 2 Application Development” by Reto Meier, 2010 by: Andrey Bogdanchikov ( andrey.bogdanchikov@sdu.edu.kz.

Controlling Playback• Once a Media Player is prepared, call start to begin

playback of the associated media:• mediaPlayer.start();• 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 in the media.

Page 14: CSS216 MOBILE PROGRAMMING Android, Chapter 11 Book: “Professional Android™ 2 Application Development” by Reto Meier, 2010 by: Andrey Bogdanchikov ( andrey.bogdanchikov@sdu.edu.kz.

Managing Media Playback Output• The Media Player provides methods to control the volume

of the output, manage the screen lock during playback, and set the looping status.

• It is not currently possible to play audio into a phone conversation; the Media Player always plays audio using the standard output device — the speaker or connected Bluetooth headset.

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

if (!mediaPlayer.isLooping()) mediaPlayer.setLooping(true);• When playing video resources, you can use getFrame to

take a Bitmap screen grab of video media at the specified frame.

Page 15: CSS216 MOBILE PROGRAMMING Android, Chapter 11 Book: “Professional Android™ 2 Application Development” by Reto Meier, 2010 by: Andrey Bogdanchikov ( andrey.bogdanchikov@sdu.edu.kz.

Recording audio and video• Android offers two alternatives for recording audio and video

within your application.• The simplest technique 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.

• In cases where you want to replace the native app, or simply need more fine-grained control over the video capture UI or recording settings, you can use the Media Recorder class.

Page 16: CSS216 MOBILE PROGRAMMING Android, Chapter 11 Book: “Professional Android™ 2 Application Development” by Reto Meier, 2010 by: Andrey Bogdanchikov ( andrey.bogdanchikov@sdu.edu.kz.

Using Intents to Record Video• The easiest way to initiate video recording is using the

ACTION_VIDEO_CAPTURE Media Store static constant in an Intent passed to startActivityForResult.

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

• This will launch the native video camera Activity, allowing users to start, stop, review, and retake their video, and preventing you from having to rewrite the entire video camera application.

Page 17: CSS216 MOBILE PROGRAMMING Android, Chapter 11 Book: “Professional Android™ 2 Application Development” by Reto Meier, 2010 by: Andrey Bogdanchikov ( andrey.bogdanchikov@sdu.edu.kz.

Video quality and store place• The video capture action supports two optional extras,

available as static constants from the MediaStore class:• ➤ EXTRA_OUTPUT By default, the video recorded by the

video capture action will be stored in the default Media Store. If you want to record it elsewhere, you can specify an alternative URI using this extra.

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

Page 18: CSS216 MOBILE PROGRAMMING Android, Chapter 11 Book: “Professional Android™ 2 Application Development” by Reto Meier, 2010 by: Andrey Bogdanchikov ( andrey.bogdanchikov@sdu.edu.kz.

Using the Media Recorder• Multimedia recording is handled by the aptly named MediaRecorder

class. You can use it to record audio and/or video files that can be used in your own applications, or added to the Media Store.

• To record audio or video, create a new Media Recorder object.

MediaRecorder mediaRecorder = new MediaRecorder();• Before you can record any media in Android, your application needs

the RECORD_AUDIO and / or RECORD_VIDEO permissions. Add uses-permission tags for each of them, as required, in your application manifest.

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

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

• The Media Recorder lets you specify the audio and video source, the output file format, and the audio and video encoders to use when recording your file.

Page 19: CSS216 MOBILE PROGRAMMING Android, Chapter 11 Book: “Professional Android™ 2 Application Development” by Reto Meier, 2010 by: Andrey Bogdanchikov ( andrey.bogdanchikov@sdu.edu.kz.

• Much like the Media Player, the Media Recorder manages recording as a state machine. That means that the order in which you configure and manage the Media Recorder is important.

• In the simplest terms, the transitions through the state machine can be described as follows:

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

• Once you’ve finished recording your media, callrelease on your Media Recorder object to free the associated resources.• mediaRecorder.release();

Page 20: CSS216 MOBILE PROGRAMMING Android, Chapter 11 Book: “Professional Android™ 2 Application Development” by Reto Meier, 2010 by: Andrey Bogdanchikov ( andrey.bogdanchikov@sdu.edu.kz.

Configuring and Controlling Video Recording• As described in the state model above, before recording

you must specify the input sources, output format, audio and video encoder, and an output file — in that order.

• The setAudioSource and setVideoSource methods let you specify a MediaRecorder.AudioSource or MediaRecorder.VideoSource static constant that define the audio and video source, respectively. Once you’ve selected your input sources, select the output format using the setOutputFormat method to specify a MediaRecorder.OutputFormat constant.

• Use the set[audio/video]Encoder methods to specify an audio or video encoder constant from the MediaRecorder.[Audio/Video]Encoder class. Take this opportunity to set the frame rate or video output size if desired.

• Finally, assign a file to store the recorded media using the setOutputFile method before calling prepare.

Page 21: CSS216 MOBILE PROGRAMMING Android, Chapter 11 Book: “Professional Android™ 2 Application Development” by Reto Meier, 2010 by: Andrey Bogdanchikov ( andrey.bogdanchikov@sdu.edu.kz.

Configuring the Media Recorder

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();

Page 22: CSS216 MOBILE PROGRAMMING Android, Chapter 11 Book: “Professional Android™ 2 Application Development” by Reto Meier, 2010 by: Andrey Bogdanchikov ( andrey.bogdanchikov@sdu.edu.kz.

Using the camera and taking pictures

• The popularity of digital cameras (particularly within phone handsets) has caused their prices to drop just as their size has shrunk dramatically. It’s now becoming difficult to even find a mobile phone without a camera, and Android devices are certainly no exception.

• The G1 was released in 2008 with a 3.2-megapixel camera. Today several devices feature 5-megapixel cameras, with one model sporting an 8.1-megapixel sensor.

• In nowadays some devices have cameras that can capture as best as professional camera, even with some extra features like slow-motion, color effects, etc.

Page 23: CSS216 MOBILE PROGRAMMING Android, Chapter 11 Book: “Professional Android™ 2 Application Development” by Reto Meier, 2010 by: Andrey Bogdanchikov ( andrey.bogdanchikov@sdu.edu.kz.

Using Intents to Take Pictures• The easiest way to take a picture using the device camera 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);

• This will launch the camera Activity, allowing users to modify the image settings manually, and preventing you from having to rewrite the entire camera application. The image capture action supports two modes, thumbnail and full image.• ➤ Thumbnail By default, the picture taken by the image capture action will return a

thumbnail Bitmap in the data extra within the Intent parameter returned in onActivityResult. As shown in Listing 11-11, call getParcelableExtra specifying the extra name data on the Intent parameter to return the thumbnail as a Bitmap.

• ➤ Full image If you 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. In this case no thumbnail will be returned in the Activity result callback and the result Intent data will be null.

Page 24: CSS216 MOBILE PROGRAMMING Android, Chapter 11 Book: “Professional Android™ 2 Application Development” by Reto Meier, 2010 by: Andrey Bogdanchikov ( andrey.bogdanchikov@sdu.edu.kz.

Taking a picture using an Intentprivate 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);

}

// example you can check in the book

Page 25: CSS216 MOBILE PROGRAMMING Android, Chapter 11 Book: “Professional Android™ 2 Application Development” by Reto Meier, 2010 by: Andrey Bogdanchikov ( andrey.bogdanchikov@sdu.edu.kz.

Controlling the Camera and Taking Pictures

• To access the camera hardware directly, you need to add the CAMERA permission to your application manifest.

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

• Use the Camera class to adjust camera settings, specify image preferences, and take pictures. To access the Camera Service, use the static open method on the Camera class. When your application has finished with the Camera, remember to relinquish your hold on it by calling release, as shown in the simple pattern.

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

Page 26: CSS216 MOBILE PROGRAMMING Android, Chapter 11 Book: “Professional Android™ 2 Application Development” by Reto Meier, 2010 by: Andrey Bogdanchikov ( andrey.bogdanchikov@sdu.edu.kz.

Reading and modifying camera settings

• Android 2.0 (API level 5) introduced a wide range of Camera Parameters, each with a setter and getter including:• [get/set]SceneMode Takes or returns a SCENE_MODE_* static string

constant from the Camera Parameters class. Each scene mode describes a particular scene type (party, beach, sunset, etc.).

• [get/set]FlashMode Takes or returns a FLASH_MODE_* static string constant. Lets you specify the flash mode as on, off, red-eye reduction, or flashlight mode.

• [get/set]WhiteBalance Takes or returns a WHITE_BALANCE_* static string constant to describe the white balance of the scene being photographed.

• [get/set]ColorEffect Takes or returns a EFFECT_* static string constant to modify how the image is presented. Available color effects include sepia tone or black and white.

• [get/set]FocusMode Takes or returns a FOCUS_MODE_* static string constant to specify how the camera autofocus should attempt to focus the camera.

Page 27: CSS216 MOBILE PROGRAMMING Android, Chapter 11 Book: “Professional Android™ 2 Application Development” by Reto Meier, 2010 by: Andrey Bogdanchikov ( andrey.bogdanchikov@sdu.edu.kz.

Taking a Picture• Take a picture by calling takePicture on a Camera object

and passing in a ShutterCallback and two PictureCallback implementations (one for the RAW and one for JPEG-encoded images).

• Each picture callback will receive a byte array representing the image in the appropriate format, while the shutter callback is triggered immediately after the shutter is closed.

Page 28: CSS216 MOBILE PROGRAMMING Android, Chapter 11 Book: “Professional Android™ 2 Application Development” by Reto Meier, 2010 by: Andrey Bogdanchikov ( andrey.bogdanchikov@sdu.edu.kz.

private void takePicture() { camera.takePicture(shutterCallback, rawCallback, jpegCallback);}ShutterCallback shutterCallback = new ShutterCallback() {

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

// Save the image JPEG data to the SD cardFileOutputStream 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 29: CSS216 MOBILE PROGRAMMING Android, Chapter 11 Book: “Professional Android™ 2 Application Development” by Reto Meier, 2010 by: Andrey Bogdanchikov ( andrey.bogdanchikov@sdu.edu.kz.

Adding new media to the media store

• By default, media files created by your application will be unavailable to other applications. As a result, it’s good practice to insert it into the Media Store to make it available to other applications.

• Android provides two alternatives for inserting media into the Media Store, either using the Media Scanner to interpret your file and insert it automatically, or manually inserting a new record in the appropriate Content Provider.

Page 30: CSS216 MOBILE PROGRAMMING Android, Chapter 11 Book: “Professional Android™ 2 Application Development” by Reto Meier, 2010 by: Andrey Bogdanchikov ( andrey.bogdanchikov@sdu.edu.kz.

Using the Media Scanner• If you have recorded new media of any kind, the

MediaScannerConnection class provides a simple way for you to add it to the Media Store without needing to construct the full record for the Media Store Content Provider.

• Before you can use the scanFile method to initiate a content scan on your file, you must call connect and wait for the connection to the Media Scanner to complete.

• This call is asynchronous, so you will need to implement a MediaScannerConnectionClient to notify you when the connection has been made. You can use this same class to notify you when the scan is complete, at which point you can disconnect your Media Scanner Connection

Page 31: CSS216 MOBILE PROGRAMMING Android, Chapter 11 Book: “Professional Android™ 2 Application Development” by Reto Meier, 2010 by: Andrey Bogdanchikov ( andrey.bogdanchikov@sdu.edu.kz.

Adding files to the Media Store using the Media Scanner

MediaScannerConnectionClient mediaScannerClient = new

MediaScannerConnectionClient() {

private MediaScannerConnection msc = null;

{

msc = new MediaScannerConnection(getApplicationContext(), this);

msc.connect();

}

public void onMediaScannerConnected() {

msc.scanFile("/sdcard/test1.jpg", null);

}

public void onScanCompleted(String path, Uri uri) {

msc.disconnect();

}

};

Page 32: CSS216 MOBILE PROGRAMMING Android, Chapter 11 Book: “Professional Android™ 2 Application Development” by Reto Meier, 2010 by: Andrey Bogdanchikov ( andrey.bogdanchikov@sdu.edu.kz.

Inserting Media into the Media Store• Rather than relying on the Media Scanner you can add new media to

theMedia Store by creating a new ContentValues object and inserting it into the appropriate Media Store Content Provider yourself.

• The metadata you specify here can include the title, time stamp, and geocoding information for your new media file, as shown in the code snippet below:

ContentValues content = new ContentValues(3);

content.put(Audio.AudioColumns.TITLE, "TheSoundandtheFury");

content.put(Audio.AudioColumns.DATE_ADDED,

System.currentTimeMillis() / 1000);

content.put(Audio.Media.MIME_TYPE, "audio/amr");

• You must also specify the absolute path of the media file being added.

content.put(MediaStore.Audio.Media.DATA, "/sdcard/myoutputfile.mp4");

Page 33: CSS216 MOBILE PROGRAMMING Android, Chapter 11 Book: “Professional Android™ 2 Application Development” by Reto Meier, 2010 by: Andrey Bogdanchikov ( andrey.bogdanchikov@sdu.edu.kz.

• Get access to the application’s ContentResolver, and use it to insert this new row into the Media Store as shown in the following code snippet.

ContentResolver resolver = getContentResolver();

Uri uri = resolver.insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, content);

• Once the media file has been inserted into the Media Store you should announce its availability using a broadcast Intent as shown below.

sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri));

Page 34: CSS216 MOBILE PROGRAMMING Android, Chapter 11 Book: “Professional Android™ 2 Application Development” by Reto Meier, 2010 by: Andrey Bogdanchikov ( andrey.bogdanchikov@sdu.edu.kz.

Raw audio manipulation• The AudioTrack and AudioRecord classes let you record

audio directly from the audio input hardware of the device, and stream PCM audio buffers directly to the audio hardware for playback.

• Using the Audio Track streaming mode you can process incoming audio and playback in near real time, letting you manipulate incoming or outgoing audio and perform signal processing on raw audio on the device.

• This topic is for self-study…

Page 35: CSS216 MOBILE PROGRAMMING Android, Chapter 11 Book: “Professional Android™ 2 Application Development” by Reto Meier, 2010 by: Andrey Bogdanchikov ( andrey.bogdanchikov@sdu.edu.kz.

https://parse.com introduction• The Parse platform provides a complete backend solution

for your mobile application. Its goal is to totally eliminate the need for writing server code or maintaining servers.

• On Parse, you create an App for each of your mobile applications. Each App has its own application id and client key that you apply to your SDK install. Your account on Parse can accommodate multiple Apps. This is useful even if you have one application, since you can deploy different versions for test and production.

Page 36: CSS216 MOBILE PROGRAMMING Android, Chapter 11 Book: “Professional Android™ 2 Application Development” by Reto Meier, 2010 by: Andrey Bogdanchikov ( andrey.bogdanchikov@sdu.edu.kz.

Parse objects• Storing data on Parse is built around the ParseObject. Each

ParseObject contains key-value pairs of JSON-compatible data. • This data is schemaless, which means that you don't need to

specify ahead of time what keys exist on each ParseObject. You simply set whatever key-value pairs you want, and our backend will store it.

• For example, let's say you're tracking high scores for a game. A single ParseObject could contain:

• score: 1337, playerName: "Sean Plott", cheatMode: false

• Keys must be alphanumeric strings. Values can be strings, numbers, booleans, or even arrays and objects - anything that can be JSON-encoded.

Page 37: CSS216 MOBILE PROGRAMMING Android, Chapter 11 Book: “Professional Android™ 2 Application Development” by Reto Meier, 2010 by: Andrey Bogdanchikov ( andrey.bogdanchikov@sdu.edu.kz.

Saving Objects• Let's say you want to save the GameScore described above

to the Parse Cloud. The interface is similar to a Map, plus the saveInBackground method:

• ParseObject gameScore = new ParseObject("GameScore");• gameScore.put("score", 1337);• gameScore.put("playerName", "Sean Plott");• gameScore.put("cheatMode", false);• gameScore.saveInBackground();

Page 38: CSS216 MOBILE PROGRAMMING Android, Chapter 11 Book: “Professional Android™ 2 Application Development” by Reto Meier, 2010 by: Andrey Bogdanchikov ( andrey.bogdanchikov@sdu.edu.kz.

Check Object• After this code runs, you will probably be wondering if anything

really happened. To make sure the data was saved, you can look at the Data Browser in your app on Parse. You should see something like this:

• objectId: "xWMyZ4YEGZ", score: 1337, playerName: "Sean Plott", cheatMode: false, createdAt:"2011-06-10T18:33:42Z", updatedAt:"2011-06-10T18:33:42Z"

• There are two things to note here. You didn't have to configure or set up a new Class called GameScore before running this code. Your Parse app lazily creates this Class for you when it first encounters it.

Page 39: CSS216 MOBILE PROGRAMMING Android, Chapter 11 Book: “Professional Android™ 2 Application Development” by Reto Meier, 2010 by: Andrey Bogdanchikov ( andrey.bogdanchikov@sdu.edu.kz.

Retrieving Objects• Saving data to the cloud is fun, but it's even more fun to get that data out

again. If you have the objectId, you can retrieve the whole ParseObject using a ParseQuery:

• ParseQuery<ParseObject> query = ParseQuery.getQuery("GameScore");• query.getInBackground("xWMyZ4YEGZ", new

GetCallback<ParseObject>() {• public void done(ParseObject object, ParseException e) {• if (e == null) {• // object will be your game score• } else {• // something went wrong• }• }• });

Page 40: CSS216 MOBILE PROGRAMMING Android, Chapter 11 Book: “Professional Android™ 2 Application Development” by Reto Meier, 2010 by: Andrey Bogdanchikov ( andrey.bogdanchikov@sdu.edu.kz.

Get data• To get the values out of the ParseObject, there's a getX

method for each data type:

• int score = gameScore.getInt("score");• String playerName = gameScore.getString("playerName");• boolean cheatMode = gameScore.getBoolean("cheatMode");

Page 41: CSS216 MOBILE PROGRAMMING Android, Chapter 11 Book: “Professional Android™ 2 Application Development” by Reto Meier, 2010 by: Andrey Bogdanchikov ( andrey.bogdanchikov@sdu.edu.kz.

Signing up to parse.com from your application

• ParseUser user = new ParseUser();• user.setUsername("my name");• user.setPassword("my pass");• user.setEmail("[email protected]");• // other fields can be set just like with ParseObject• user.put("phone", "650-253-0000");• user.signUpInBackground(new SignUpCallback() {• public void done(ParseException e) {• if (e == null) {• // Hooray! Let them use the app now.• } else {• // Sign up didn't succeed. Look at the ParseException• // to figure out what went wrong• }• }• });

Page 42: CSS216 MOBILE PROGRAMMING Android, Chapter 11 Book: “Professional Android™ 2 Application Development” by Reto Meier, 2010 by: Andrey Bogdanchikov ( andrey.bogdanchikov@sdu.edu.kz.

Logging In• Of course, after you allow users to sign up, you need be able to let

them log in to their account in the future. To do this, you can use the class method logInInBackground.

• ParseUser.logInInBackground("Jerry", "showmethemoney", new LogInCallback() {

• public void done(ParseUser user, ParseException e) {• if (user != null) {• // Hooray! The user is logged in.• } else {• // Signup failed. Look at the ParseException to see what

happened.• }• }• });

Page 43: CSS216 MOBILE PROGRAMMING Android, Chapter 11 Book: “Professional Android™ 2 Application Development” by Reto Meier, 2010 by: Andrey Bogdanchikov ( andrey.bogdanchikov@sdu.edu.kz.

Download, install and enjoy• Before you can use it, you should download and install

corresponding files into your application.• Link and tutorials are present on the site https://parse.com• You can read more about how to use parse.com

framework in https://parse.com/docs/android_guide (Self-study)

• Good Luck

Page 44: CSS216 MOBILE PROGRAMMING Android, Chapter 11 Book: “Professional Android™ 2 Application Development” by Reto Meier, 2010 by: Andrey Bogdanchikov ( andrey.bogdanchikov@sdu.edu.kz.

THE ENDThank you