1/* 2 * Copyright (C) 2014 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.testingcamera2; 18 19import java.util.HashSet; 20import java.util.Set; 21 22import android.content.Context; 23import android.hardware.camera2.CameraCharacteristics; 24import android.hardware.camera2.CameraDevice; 25import android.hardware.camera2.CameraManager; 26import android.hardware.camera2.CameraAccessException; 27 28/** 29 * A central manager of camera devices and current clients for them. 30 * 31 */ 32public class CameraOps2 extends CameraManager.AvailabilityCallback { 33 34 private final CameraManager mCameraManager; 35 36 private final Set<CameraDevice> mOpenCameras = new HashSet<CameraDevice>(); 37 38 public CameraOps2(Context context) { 39 mCameraManager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE); 40 if (mCameraManager == null) { 41 throw new AssertionError("Can't connect to camera manager!"); 42 } 43 try { 44 String[] cameraIds = mCameraManager.getCameraIdList(); 45 TLog.i("Camera count: %d", cameraIds.length); 46 for (String cameraId : cameraIds) { 47 TLog.i(" Camera %s", cameraId); 48 } 49 } catch (CameraAccessException e) { 50 TLog.e("Unable to get camera list: %s", e); 51 } 52 53 mCameraManager.registerAvailabilityCallback(this, /*handler*/null); 54 } 55 56 /** 57 * Add a listener for new camera addition events, and retrieve the list of 58 * current cameras 59 * 60 * @param listener 61 * A listener to notify on changes to camera availability 62 * @return the current list of available cameras 63 * @throws CameraAccessException 64 * if the camera manager cannot be queried 65 */ 66 public String[] getCamerasAndListen(CameraManager.AvailabilityCallback listener) 67 throws CameraAccessException { 68 69 mCameraManager.registerAvailabilityCallback(listener, /*handler*/null); 70 71 return mCameraManager.getCameraIdList(); 72 } 73 74 public void removeAvailabilityCallback(CameraManager.AvailabilityCallback listener) { 75 mCameraManager.unregisterAvailabilityCallback(listener); 76 } 77 78 @Override 79 public void onCameraAvailable(String cameraId) { 80 TLog.i("Camera %s is now available", cameraId); 81 } 82 83 @Override 84 public void onCameraUnavailable(String cameraId) { 85 TLog.i("Camera %s is now unavailable", cameraId); 86 } 87 88 /** 89 * Attempt to open a camera device. Returns false if the open call cannot be 90 * made or the device is already open 91 * 92 * @param cameraId id of the camera to open 93 * @param listener listener to notify of camera device state changes 94 * @return true if open call was sent successfully. The client needs to wait 95 * for its listener to be called to determine if open will succeed. 96 */ 97 public boolean openCamera(String cameraId, CameraDevice.StateCallback listener) { 98 for (CameraDevice camera : mOpenCameras) { 99 if (camera.getId() == cameraId) { 100 TLog.e("Camera %s is already open", cameraId); 101 return false; 102 } 103 } 104 try { 105 DeviceStateCallback proxyListener = new DeviceStateCallback(listener); 106 mCameraManager.openCamera(cameraId, proxyListener, null); 107 } catch (CameraAccessException e) { 108 TLog.e("Unable to open camera %s.", e, cameraId); 109 return false; 110 } 111 112 return true; 113 } 114 115 public CameraCharacteristics getCameraInfo(String cameraId) { 116 try { 117 return mCameraManager.getCameraCharacteristics(cameraId); 118 } catch (CameraAccessException e) { 119 TLog.e("Unable to get camera characteristics for camera %s.", e, cameraId); 120 } 121 return null; 122 } 123 124 private class DeviceStateCallback extends CameraDevice.StateCallback { 125 126 private final CameraDevice.StateCallback mClientListener; 127 128 public DeviceStateCallback(CameraDevice.StateCallback clientListener) { 129 mClientListener = clientListener; 130 } 131 132 @Override 133 public void onClosed(CameraDevice camera) { 134 mOpenCameras.remove(camera); 135 TLog.i("Camera %s now closed", camera.getId()); 136 mClientListener.onClosed(camera); 137 } 138 139 @Override 140 public void onDisconnected(CameraDevice camera) { 141 TLog.i("Camera %s now disconnected", camera.getId()); 142 mClientListener.onDisconnected(camera); 143 } 144 145 @Override 146 public void onError(CameraDevice camera, int error) { 147 TLog.i("Camera %s encountered error: %d", camera.getId(), error); 148 mClientListener.onError(camera, error); 149 } 150 151 @Override 152 public void onOpened(CameraDevice camera) { 153 mOpenCameras.add(camera); 154 TLog.i("Camera %s now open", camera.getId()); 155 mClientListener.onOpened(camera); 156 } 157 158 } 159} 160