1 /* 2 * Copyright (C) 2015 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 18 package com.android.camera.one.v2; 19 20 import android.annotation.TargetApi; 21 import android.hardware.camera2.CameraAccessException; 22 import android.hardware.camera2.CameraCharacteristics; 23 import android.hardware.camera2.CameraManager; 24 import android.os.Build.VERSION_CODES; 25 26 import com.android.camera.debug.Log; 27 import com.android.camera.debug.Log.Tag; 28 import com.android.camera.device.CameraId; 29 import com.android.camera.one.OneCamera.Facing; 30 import com.android.camera.one.OneCameraAccessException; 31 import com.android.camera.one.OneCameraCharacteristics; 32 import com.android.camera.one.OneCameraManager; 33 import com.android.camera.util.AndroidServices; 34 import com.android.camera.util.ApiHelper; 35 import com.google.common.base.Optional; 36 37 import javax.annotation.Nonnull; 38 39 /** 40 * Pick camera ids from a list of devices based on defined characteristics. 41 */ 42 @TargetApi(VERSION_CODES.LOLLIPOP) 43 public class Camera2OneCameraManagerImpl implements OneCameraManager { 44 private static final Tag TAG = new Tag("Camera2OneCamMgr"); 45 /** 46 * Create a new camera2 api hardware manager. 47 */ 48 public static Optional<Camera2OneCameraManagerImpl> create() { 49 if (!ApiHelper.HAS_CAMERA_2_API) { 50 return Optional.absent(); 51 } 52 CameraManager cameraManager; 53 try { 54 cameraManager = AndroidServices.instance().provideCameraManager(); 55 } catch (IllegalStateException ex) { 56 Log.e(TAG, "camera2.CameraManager is not available."); 57 return Optional.absent(); 58 } 59 Camera2OneCameraManagerImpl hardwareManager = 60 new Camera2OneCameraManagerImpl(cameraManager); 61 return Optional.of(hardwareManager); 62 } 63 64 private final CameraManager mCameraManager; 65 66 public Camera2OneCameraManagerImpl(CameraManager cameraManger) { 67 mCameraManager = cameraManger; 68 } 69 70 @Override 71 public boolean hasCamera() { 72 try { 73 String[] ids = mCameraManager.getCameraIdList(); 74 return ids != null && ids.length > 0; 75 } catch (CameraAccessException ex) { 76 Log.e(TAG, "Unable to read camera list.", ex); 77 return false; 78 } 79 } 80 81 @Override 82 public boolean hasCameraFacing(@Nonnull Facing direction) { 83 return findCameraId(direction) != null; 84 } 85 86 @Override 87 public CameraId findFirstCamera() { 88 try { 89 String[] ids = mCameraManager.getCameraIdList(); 90 if(ids != null && ids.length > 0) { 91 return CameraId.from(ids[0]); 92 } 93 } catch (CameraAccessException ex) { 94 Log.e(TAG, "Unable to read camera list.", ex); 95 } 96 97 return null; 98 } 99 100 @Override 101 public CameraId findFirstCameraFacing(@Nonnull Facing facing) { 102 String cameraId = findCameraId(facing); 103 return (cameraId != null) ? CameraId.from(cameraId) : null; 104 } 105 106 @Override 107 public OneCameraCharacteristics getOneCameraCharacteristics( 108 @Nonnull CameraId key) 109 throws OneCameraAccessException { 110 return new OneCameraCharacteristicsImpl(getCameraCharacteristics(key)); 111 } 112 113 public CameraCharacteristics getCameraCharacteristics( 114 @Nonnull CameraId key) 115 throws OneCameraAccessException { 116 try { 117 return mCameraManager.getCameraCharacteristics(key.getValue()); 118 } catch (CameraAccessException ex) { 119 throw new OneCameraAccessException("Unable to get camera characteristics", ex); 120 } 121 } 122 123 /** Returns the ID of the first camera facing the given direction. */ 124 private String findCameraId(Facing facing) { 125 if (facing == Facing.FRONT) { 126 return findFirstFrontCameraId(); 127 } else { 128 return findFirstBackCameraId(); 129 } 130 } 131 132 /** Returns the ID of the first back-facing camera. */ 133 private String findFirstBackCameraId() { 134 Log.d(TAG, "Getting First BACK Camera"); 135 String cameraId = findFirstCameraIdFacing(CameraCharacteristics.LENS_FACING_BACK); 136 if (cameraId == null) { 137 Log.w(TAG, "No back-facing camera found."); 138 } 139 return cameraId; 140 } 141 142 /** Returns the ID of the first front-facing camera. */ 143 private String findFirstFrontCameraId() { 144 Log.d(TAG, "Getting First FRONT Camera"); 145 String cameraId = findFirstCameraIdFacing(CameraCharacteristics.LENS_FACING_FRONT); 146 if (cameraId == null) { 147 Log.w(TAG, "No front-facing camera found."); 148 } 149 return cameraId; 150 } 151 152 153 /** Returns the ID of the first camera facing the given direction. */ 154 private String findFirstCameraIdFacing(int facing) { 155 try { 156 String[] cameraIds = mCameraManager.getCameraIdList(); 157 for (String cameraId : cameraIds) { 158 CameraCharacteristics characteristics = mCameraManager 159 .getCameraCharacteristics(cameraId); 160 if (characteristics.get(CameraCharacteristics.LENS_FACING) == facing) { 161 return cameraId; 162 } 163 } 164 } catch (CameraAccessException ex) { 165 Log.w(TAG, "Unable to get camera ID", ex); 166 } 167 return null; 168 } 169 170 }