1c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi/* 2c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * Copyright (C) 2013 The Android Open Source Project 3c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * 4c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * Licensed under the Apache License, Version 2.0 (the "License"); 5c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * you may not use this file except in compliance with the License. 6c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * You may obtain a copy of the License at 7c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * 8c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * http://www.apache.org/licenses/LICENSE-2.0 9c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * 10c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * Unless required by applicable law or agreed to in writing, software 11c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * distributed under the License is distributed on an "AS IS" BASIS, 12c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * See the License for the specific language governing permissions and 14c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * limitations under the License. 15c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi */ 16c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 17c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchipackage com.android.mediaframeworktest; 18c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 19c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchiimport android.hardware.Camera; 20c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchiimport android.hardware.Camera.Parameters; 21c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchiimport android.hardware.Camera.PictureCallback; 22c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchiimport android.hardware.Camera.ShutterCallback; 23c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchiimport android.os.Environment; 24c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchiimport android.util.Log; 25c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchiimport android.view.SurfaceHolder; 26c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 27c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchiimport java.io.BufferedWriter; 28c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchiimport java.io.File; 29c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchiimport java.io.FilenameFilter; 30c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchiimport java.io.FileNotFoundException; 31c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchiimport java.io.FileOutputStream; 32c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchiimport java.io.IOException; 33c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 34c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchiimport junit.framework.Assert; 35c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 36c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchipublic class CameraTestHelper { 37c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 38c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi public Camera mCamera; 39c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi private String TAG = "CameraTestHelper"; 40c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi private static final int CAMERA_ID = 0; 41c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi private static final long WAIT_GENERIC = 3 * 1000; // 3 seconds 42c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi private static final long WAIT_ZOOM_ANIMATION = 5 * 1000; // 5 seconds 43c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi protected static final String CAMERA_STRESS_IMAGES_DIRECTORY = "cameraStressImages"; 44c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi private static final String CAMERA_STRESS_IMAGES_PREFIX = "camera-stress-test"; 45c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi private final CameraErrorCallback mCameraErrorCallback = new CameraErrorCallback(); 46c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 47c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi private final class CameraErrorCallback implements android.hardware.Camera.ErrorCallback { 48c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi public void onError(int error, android.hardware.Camera camera) { 49c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi Assert.fail(String.format("Camera error, code: %d", error)); 50c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 51c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 52c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 53c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi private ShutterCallback shutterCallback = new ShutterCallback() { 54c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi @Override 55c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi public void onShutter() { 56c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi Log.v(TAG, "Shutter"); 57c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 58c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi }; 59c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 60c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi private PictureCallback rawCallback = new PictureCallback() { 61c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi @Override 62c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi public void onPictureTaken(byte[] data, Camera camera) { 63c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi Log.v(TAG, "Raw picture taken"); 64c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 65c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi }; 66c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 67c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi private PictureCallback jpegCallback = new PictureCallback() { 68c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi @Override 69c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi public void onPictureTaken(byte[] data, Camera camera) { 70c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi FileOutputStream fos = null; 71c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 72c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi try { 73c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi Log.v(TAG, "JPEG picture taken"); 74c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi fos = new FileOutputStream(String.format("%s/%s/%s-%d.jpg", 75c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi Environment.getExternalStorageDirectory(), CAMERA_STRESS_IMAGES_DIRECTORY, 76c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi CAMERA_STRESS_IMAGES_PREFIX, System.currentTimeMillis())); 77c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi fos.write(data); 78c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } catch (FileNotFoundException e) { 79c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi Log.e(TAG, "File not found: " + e.toString()); 80c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } catch (IOException e) { 81c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi Log.e(TAG, "Error accessing file: " + e.toString()); 82c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } finally { 83c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi try { 84c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi if (fos != null) { 85c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi fos.close(); 86c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 87c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } catch (IOException e) { 88c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi Log.e(TAG, "Error closing file: " + e.toString()); 89c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 90c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 91c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 92c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi }; 93c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 94c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi /** 95c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * Helper method for prepping test 96c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi */ 97c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi public void setupCameraTest() { 98c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi // Create the test images directory if it doesn't exist 99c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi File stressImagesDirectory = new File(String.format("%s/%s", 100c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi Environment.getExternalStorageDirectory(), CAMERA_STRESS_IMAGES_DIRECTORY)); 101c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi if (!stressImagesDirectory.exists()) { 102c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi stressImagesDirectory.mkdir(); 103c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 104c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 105c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi mCamera = Camera.open(CAMERA_ID); 106c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 107c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 108c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi /** 109c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * Helper method for getting the available parameters of the default camera 110c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi */ 111c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi public Parameters getCameraParameters() { 112c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi mCamera = Camera.open(CAMERA_ID); 113c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi Parameters params = mCamera.getParameters(); 114c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi mCamera.release(); 115c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi return params; 116c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 117c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 118c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi /** 119c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * Helper method for taking a photo 120c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi */ 121c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi public void capturePhoto() throws Exception { 122c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi mCamera.takePicture(shutterCallback, rawCallback, jpegCallback); 123c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi Thread.sleep(WAIT_GENERIC); 124c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi mCamera.stopPreview(); 125c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi mCamera.release(); 126c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 127c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 128c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi /** 129c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * Helper method for cleaning up pics taken during tests 130c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi */ 131c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi public void cleanupTestImages() { 132c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi try { 133c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi File stressImagesDirectory = new File(String.format("%s/%s", 134c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi Environment.getExternalStorageDirectory(), CAMERA_STRESS_IMAGES_DIRECTORY)); 135c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi File[] stressImages = stressImagesDirectory.listFiles(); 136c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi for (File f : stressImages) { 137c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi f.delete(); 138c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 139c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } catch (SecurityException e) { 140c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi Log.e(TAG, "Security manager access violation: " + e.toString()); 141c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 142c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 143c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 144c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi /** 145c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * Helper method for setting the camera parameters 146c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi */ 147c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi public void setParameters(Parameters params) { 148c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi try { 149c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi mCamera.setParameters(params); 150c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } catch (Exception e) { 151c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi Log.e(TAG, "Error setting camera parameters"); 152c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 153c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 154c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 155c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi /** 156c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi * Helper method for starting up the camera preview 157c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi */ 158c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi public void startCameraPreview(SurfaceHolder surfaceHolder) throws Exception { 159c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi mCamera.setErrorCallback(mCameraErrorCallback); 160c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi mCamera.setPreviewDisplay(surfaceHolder); 161c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi mCamera.startPreview(); 162c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi Thread.sleep(WAIT_GENERIC); 163c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi } 164c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi} 165c6cedc84f49b8b72d32069cfa515a51b8c128cc0Jason Noguchi 166