Presentation is loading. Please wait.

Presentation is loading. Please wait.

CSS216 MOBILE PROGRAMMING Android, Chapter 11 Book: “Professional Android™ 2 Application Development” by Reto Meier, 2010 by: Andrey Bogdanchikov (

Similar presentations


Presentation on theme: "CSS216 MOBILE PROGRAMMING Android, Chapter 11 Book: “Professional Android™ 2 Application Development” by Reto Meier, 2010 by: Andrey Bogdanchikov ("— Presentation transcript:

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

2 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

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

4 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

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

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

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

8 Initializing audio content for 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);

9 Alternating way Using setDataSource and prepare to initialize audio playback MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setDataSource("/sdcard/test.3gp");mediaPlayer.prepare();

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

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

12 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.seekTo(videoView.getDuration()/2);videoView.start(); [... do something... ] videoView.stopPlayback();

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

14 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); mediaPlayer.setLooping(true); When playing video resources, you can use getFrame to take a Bitmap screen grab of video media at the specified frame.

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

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

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

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

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

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

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

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

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

24 Taking a picture using an Intent 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); } // example you can check in the book

25 Controlling the Camera and Taking Pictures To access the camera hardware directly, you need to add the CAMERA permission to your application manifest. 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();

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

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

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

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

30 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

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

32 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");

33 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_CONTEN T_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));

34 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…

35 https://parse.comhttps://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.

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

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

38 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:" T18:33:42Z", updatedAt:" T18: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.

39 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 query = ParseQuery.getQuery("GameScore"); query.getInBackground("xWMyZ4YEGZ", new GetCallback () { public void done(ParseObject object, ParseException e) { if (e == null) { // object will be your game score } else { // something went wrong } });

40 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");

41 Signing up to parse.com from your application ParseUser user = new ParseUser(); user.setUsername("my name"); user.setPassword("my pass"); // other fields can be set just like with ParseObject user.put("phone", " "); 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 } });

42 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. } });

43 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.comhttps://parse.com You can read more about how to use parse.com framework in https://parse.com/docs/android_guide (Self- study)https://parse.com/docs/android_guide Good Luck

44 THE END Thank you


Download ppt "CSS216 MOBILE PROGRAMMING Android, Chapter 11 Book: “Professional Android™ 2 Application Development” by Reto Meier, 2010 by: Andrey Bogdanchikov ("

Similar presentations


Ads by Google