// ******************************************************************* // // ** Chapter 11 Code Listings ** // // ** Professional Android 2 Application Development ** // // ** Reto Meier ** // // ** (c)2010 Wrox ** // // ******************************************************************* // // ** Media Playback ********************************************** // // ******************************************************************* // ** Listing 11-1: 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); // ******************************************************************* // ** Listing 11-2: Using setDataSource and prepare to initialize audio playback MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setDataSource("/sdcard/test.3gp"); mediaPlayer.prepare(); // ******************************************************************* // ** Listing 11-3: 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(); // ******************************************************************* // ** Listing 11-4: Sample layout including a Surface View // ******************************************************************* // ** Listing 11-5: Initializing and assigning a Surface View to a Media Player public class MyActivity extends Activity implements SurfaceHolder.Callback { private MediaPlayer mediaPlayer; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mediaPlayer = new MediaPlayer(); SurfaceView surface = (SurfaceView)findViewById(R.id.surface); SurfaceHolder holder = surface.getHolder(); holder.addCallback(this); holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); holder.setFixedSize(400, 300); } public void surfaceCreated(SurfaceHolder holder) { try { mediaPlayer.setDisplay(holder); } 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) { } } // ******************************************************************* // ** Listing 11-6: Initializing video for playback using the Media Player public void surfaceCreated(SurfaceHolder holder) { try { mediaPlayer.setDisplay(holder); mediaPlayer.setDataSource("/sdcard/test2.3gp"); mediaPlayer.prepare(); mediaPlayer.start(); } catch (IllegalArgumentException e) { Log.d("MEDIA_PLAYER", e.getMessage()); } catch (IllegalStateException e) { Log.d("MEDIA_PLAYER", e.getMessage()); } catch (IOException e) { Log.d("MEDIA_PLAYER", e.getMessage()); } } // ******************************************************************* // ** Listing 11-7: Controlling Playback mediaPlayer.start(); int pos = mediaPlayer.getCurrentPosition(); int duration = mediaPlayer.getDuration(); mediaPlayer.seekTo(pos + (duration-pos)/10); [... wait for a duration ... ] mediaPlayer.stop(); // ** Media Recording ********************************************* // // ******************************************************************* // ** Listing 11-8: Listing 11-8: Recording video using an Intent private static int RECORD_VIDEO = 1; private static int HIGH_VIDEO_QUALITY = 1; private static int MMS_VIDEO_QUALITY = 0; private void recordVideo(Uri outputpath) { Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); if (outputpath != null) intent.putExtra(MediaStore.EXTRA_OUTPUT, output); intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, HIGH_VIDEO_QUALITY); startActivityForResult(intent, RECORD_VIDEO); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == RECORD_VIDEO) { Uri recordedVideo = data.getData(); // TODO Do something with the recorded video } } // ******************************************************************* // ** MediaRecorder mediaRecorder = new MediaRecorder(); // Configure the input sources mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); // Set the output format mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); // Specify the audio and video encoding mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT); // Specify the output file mediaRecorder.setOutputFile("/sdcard/myoutputfile.mp4"); // Prepare to record mediaRecorder.prepare(); mediaRecorder.start(); // Time passes. mediaRecorder.stop(); mediaRecorder.release(); // ******************************************************************* // ** Listing 11-10: Previewing video recording public class MyActivity extends Activity implements SurfaceHolder.Callback { private MediaRecorder mediaRecorder; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); SurfaceView surface = (SurfaceView)findViewById(R.id.surface); SurfaceHolder holder = surface.getHolder(); holder.addCallback(this); holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); holder.setFixedSize(400, 300); } public void surfaceCreated(SurfaceHolder holder) { if (mediaRecorder == null) { try { mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT); mediaRecorder.setOutputFile("/sdcard/myoutputfile.mp4"); mediaRecorder.setPreviewDisplay(holder.getSurface()); mediaRecorder.prepare(); } 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) { mediaRecorder.release(); } public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } } // ******************************************************************* // ** Listing 11-11: Taking a picture using an Intent private static int TAKE_PICTURE = 1; private Uri outputFileUri; private void getThumbailPicture() { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, TAKE_PICTURE); } private void saveFullImage() { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); File file = new File(Environment.getExternalStorageDirectory(), "test.jpg"); outputFileUri = Uri.fromFile(file); intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); startActivityForResult(intent, TAKE_PICTURE); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == TAKE_PICTURE) { Uri imageUri = null; // Check if the result includes a thumbnail Bitmap if (data != null) { if (data.hasExtra("data")) { Bitmap thumbnail = data.getParcelableExtra("data"); // TODO Do something with the thumbnail } } else { // TODO Do something with the full image stored // in outputFileUri } } } // ******************************************************************* // ** Listing 11-12: Using the Camera Camera camera = Camera.open(); [ ... Do things with the camera ... ] camera.release(); // ******************************************************************* // ** Listing 11-13: Reading and modifying camera settings Camera.Parameters parameters = camera.getParameters(); [ ... make changes ... ] camera.setParameters(parameters); // ******************************************************************* // ** Listing 11-14: Confirming supported camera settings Camera.Parameters parameters = camera.getParameters(); List colorEffects = parameters.getSupportedColorEffects(); if (colorEffects.contains(Camera.Parameters.EFFECT_SEPIA)) parameters.setColorEffect(Camera.Parameters.EFFECT_SEPIA); camera.setParameters(parameters); // ******************************************************************* // ** Listing 11-15: Monitoring auto focus camera.autoFocus(new AutoFocusCallback() { public void onAutoFocus(boolean success, Camera camera) { // TODO Do something on Auto-Focus success } }); // ******************************************************************* // ** Listing 11-16: Previewing real-time camera stream public class MyActivity extends Activity implements SurfaceHolder.Callback { private Camera camera; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); SurfaceView surface = (SurfaceView)findViewById(R.id.surface); SurfaceHolder holder = surface.getHolder(); holder.addCallback(this); holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); holder.setFixedSize(400, 300); } public void surfaceCreated(SurfaceHolder holder) { if (mediaRecorder == null) { try { camera = camera.open(); camera.setPreviewDisplay(holder); camera.startPreview(); [ ... Draw on the Surface ...] } catch (IOException e) { Log.d("CAMERA", e.getMessage()); } } } public void surfaceDestroyed(SurfaceHolder holder) { camera.stopPreview(); camera.release(); } } // ******************************************************************* // ** Listing 11-17: Assigning a preview frame callback camera.setPreviewCallback(new PreviewCallback() { public void onPreviewFrame(byte[] _data, Camera _camera) { // TODO Do something with the preview image. } }); // ******************************************************************* // ** Listing 11-18: Taking a picture 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. } }; 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([AU: Shouldn’t this be ‘_data’. Milan. Thanks, fixed. RETO]data); outStream.close(); } catch (FileNotFoundException e) { Log.d("CAMERA", e.getMessage()); } catch (IOException e) { Log.d("CAMERA", e.getMessage()); } } }; // ******************************************************************* // ** Listing 11-19: Reading and modifying EXIF data File file = new File(Environment.getExternalStorageDirectory(), "test.jpg"); try { ExifInterface exif = new ExifInterface(file.getCanonicalPath()); // Read the camera model and location attributes String model = exif.getAttribute(ExifInterface.TAG_MODEL); float[] latLng = new float[2]; exif.getLatLong(latLng); // Set the camera make exif.setAttribute(ExifInterface.TAG_MAKE, "My Phone"); } catch (IOException e) { Log.d("EXIF", e.getMessage()); } // ******************************************************************* // ** Listing 11-20: 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(); } }; // ** Raw Audio Manipulation ************************************** // // ******************************************************************* // ** Listing 11-21: Recording raw audio with Audio Record int frequency = 11025; int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO; int audioEncoding = AudioFormat.ENCODING_PCM_16BIT; File file = new File(Environment.getExternalStorageDirectory(), "raw.pcm"); // Create the new file. try { file.createNewFile(); } catch (IOException e) {} try { OutputStream os = new FileOutputStream(file); BufferedOutputStream bos = new BufferedOutputStream(os); DataOutputStream dos = new DataOutputStream(bos); int bufferSize = AudioRecord.getMinBufferSize(frequency, channelConfiguration, audioEncoding); short[] buffer = new short[bufferSize]; // Create a new AudioRecord object to record the audio. AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, frequency, channelConfiguration, audioEncoding, bufferSize); audioRecord.startRecording(); while (isRecording) { int bufferReadResult = audioRecord.read(buffer, 0, bufferSize); for (int i = 0; i < bufferReadResult; i++) dos.writeShort(buffer[i]); } audioRecord.stop(); dos.close(); } catch (Throwable t) {} // ******************************************************************* // ** Listing 11-22: Playing raw audio with Audio Track int frequency = 11025/2; int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO; int audioEncoding = AudioFormat.ENCODING_PCM_16BIT; File file = new File(Environment.getExternalStorageDirectory(), "raw.pcm"); // Short array to store audio track (16 bit so 2 bytes per short) int audioLength = (int)(file.length()/2); short[] audio = new short[audioLength]; try { InputStream is = new FileInputStream(file); BufferedInputStream bis = new BufferedInputStream(is); DataInputStream dis = new DataInputStream(bis); int i = 0; while (dis.available() > 0) { audio[audioLength] = dis.readShort(); i++; } // Close the input streams. dis.close(); // Create and play a new AudioTrack object AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, frequency, channelConfiguration, audioEncoding, audioLength, AudioTrack.MODE_STREAM); audioTrack.play(); audioTrack.write(audio, 0, audioLength); } catch (Throwable t) {} // ** Speach Recognition ****************************************** // // ******************************************************************* // ** Listing 11-23: Initiating a speech recognition request Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH) // Specify free form input intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "or forever hold your peace"); intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 1); intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.ENGLISH); startActivityForResult(intent, VOICE_RECOGNITION); // ******************************************************************* // ** Listing 11-24: Finding the results of a speech recognition request @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == VOICE VOICE_RECOGNITION && resultCode == RESULT_OK) { ArrayList results; results = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS); // TODO Do something with the recognized voice strings } super.onActivityResult(requestCode, resultCode, data); } // ******************************************************************* //