• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
17 package com.android.testingcamera2;
18 
19 import java.util.HashSet;
20 import java.util.Set;
21 
22 import android.content.Context;
23 import android.hardware.camera2.CameraCharacteristics;
24 import android.hardware.camera2.CameraDevice;
25 import android.hardware.camera2.CameraManager;
26 import android.hardware.camera2.CameraAccessException;
27 
28 /**
29  * A central manager of camera devices and current clients for them.
30  *
31  */
32 public class CameraOps2 extends CameraManager.AvailabilityCallback {
33 
34     private final CameraManager mCameraManager;
35 
36     private final Set<CameraDevice> mOpenCameras = new HashSet<CameraDevice>();
37 
CameraOps2(Context context)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      */
getCamerasAndListen(CameraManager.AvailabilityCallback listener)66     public String[] getCamerasAndListen(CameraManager.AvailabilityCallback listener)
67             throws CameraAccessException {
68 
69         mCameraManager.registerAvailabilityCallback(listener, /*handler*/null);
70 
71         return mCameraManager.getCameraIdList();
72     }
73 
removeAvailabilityCallback(CameraManager.AvailabilityCallback listener)74     public void removeAvailabilityCallback(CameraManager.AvailabilityCallback listener) {
75         mCameraManager.unregisterAvailabilityCallback(listener);
76     }
77 
78     @Override
onCameraAvailable(String cameraId)79     public void onCameraAvailable(String cameraId) {
80         TLog.i("Camera %s is now available", cameraId);
81     }
82 
83     @Override
onCameraUnavailable(String cameraId)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      */
openCamera(String cameraId, CameraDevice.StateCallback listener)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 
getCameraInfo(String cameraId)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 
DeviceStateCallback(CameraDevice.StateCallback clientListener)128         public DeviceStateCallback(CameraDevice.StateCallback clientListener) {
129             mClientListener = clientListener;
130         }
131 
132         @Override
onClosed(CameraDevice camera)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
onDisconnected(CameraDevice camera)140         public void onDisconnected(CameraDevice camera) {
141             TLog.i("Camera %s now disconnected", camera.getId());
142             mClientListener.onDisconnected(camera);
143         }
144 
145         @Override
onError(CameraDevice camera, int error)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
onOpened(CameraDevice camera)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