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