.. | .. |
---|
39 | 39 | |
---|
40 | 40 | import java.io.IOException; |
---|
41 | 41 | import java.util.Collections; |
---|
| 42 | +import java.util.HashMap; |
---|
42 | 43 | import java.util.List; |
---|
43 | 44 | import java.util.StringTokenizer; |
---|
44 | 45 | |
---|
.. | .. |
---|
126 | 127 | } |
---|
127 | 128 | |
---|
128 | 129 | private static class AndroidCameraDeviceInfo implements CameraDeviceInfo { |
---|
129 | | - private final Camera.CameraInfo[] mCameraInfos; |
---|
| 130 | + private final HashMap<Integer, Camera.CameraInfo> mCameraInfos; |
---|
130 | 131 | private final int mNumberOfCameras; |
---|
131 | 132 | private final int mFirstBackCameraId; |
---|
132 | 133 | private final int mFirstFrontCameraId; |
---|
| 134 | + private final int mFirstExternalCameraId; |
---|
133 | 135 | |
---|
134 | | - private AndroidCameraDeviceInfo(Camera.CameraInfo[] info, int numberOfCameras, |
---|
135 | | - int firstBackCameraId, int firstFrontCameraId) { |
---|
136 | | - |
---|
| 136 | + private AndroidCameraDeviceInfo(HashMap<Integer, Camera.CameraInfo> info, int numberOfCameras, |
---|
| 137 | + int firstBackCameraId, int firstFrontCameraId, int firstExternalCameraId) { |
---|
137 | 138 | mCameraInfos = info; |
---|
138 | 139 | mNumberOfCameras = numberOfCameras; |
---|
139 | 140 | mFirstBackCameraId = firstBackCameraId; |
---|
140 | 141 | mFirstFrontCameraId = firstFrontCameraId; |
---|
| 142 | + mFirstExternalCameraId = firstExternalCameraId; |
---|
141 | 143 | } |
---|
142 | 144 | |
---|
143 | 145 | public static AndroidCameraDeviceInfo create() { |
---|
144 | 146 | int numberOfCameras; |
---|
145 | | - Camera.CameraInfo[] cameraInfos; |
---|
| 147 | + HashMap<Integer, Camera.CameraInfo> cameraInfos; |
---|
146 | 148 | try { |
---|
147 | 149 | numberOfCameras = Camera.getNumberOfCameras(); |
---|
148 | | - cameraInfos = new Camera.CameraInfo[numberOfCameras]; |
---|
| 150 | + Log.d(TAG, "create with number " + numberOfCameras); |
---|
| 151 | + cameraInfos = new HashMap<Integer, Camera.CameraInfo>(); |
---|
149 | 152 | for (int i = 0; i < numberOfCameras; i++) { |
---|
150 | | - cameraInfos[i] = new Camera.CameraInfo(); |
---|
151 | | - Camera.getCameraInfo(i, cameraInfos[i]); |
---|
| 153 | + cameraInfos.put(i, new Camera.CameraInfo()); |
---|
| 154 | + Camera.getCameraInfo(i, cameraInfos.get(i)); |
---|
152 | 155 | } |
---|
153 | 156 | } catch (RuntimeException ex) { |
---|
154 | 157 | Log.e(TAG, "Exception while creating CameraDeviceInfo", ex); |
---|
.. | .. |
---|
157 | 160 | |
---|
158 | 161 | int firstFront = NO_DEVICE; |
---|
159 | 162 | int firstBack = NO_DEVICE; |
---|
| 163 | + int firstExternal = NO_DEVICE; |
---|
160 | 164 | // Get the first (smallest) back and first front camera id. |
---|
161 | 165 | for (int i = numberOfCameras - 1; i >= 0; i--) { |
---|
162 | | - if (cameraInfos[i].facing == Camera.CameraInfo.CAMERA_FACING_BACK) { |
---|
| 166 | + if (cameraInfos.get(i).facing == Camera.CameraInfo.CAMERA_FACING_BACK) { |
---|
163 | 167 | firstBack = i; |
---|
164 | | - } else { |
---|
165 | | - if (cameraInfos[i].facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { |
---|
166 | | - firstFront = i; |
---|
167 | | - } |
---|
| 168 | + } else if (cameraInfos.get(i).facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { |
---|
| 169 | + firstFront = i; |
---|
| 170 | + } |
---|
| 171 | + else if (cameraInfos.get(i).facing == Camera.CameraInfo.CAMERA_FACING_EXTERNAL) { |
---|
| 172 | + firstExternal = i; |
---|
168 | 173 | } |
---|
169 | 174 | } |
---|
170 | 175 | |
---|
171 | | - return new AndroidCameraDeviceInfo(cameraInfos, numberOfCameras, firstBack, firstFront); |
---|
| 176 | + return new AndroidCameraDeviceInfo(cameraInfos, numberOfCameras, firstBack, firstFront, firstExternal); |
---|
172 | 177 | } |
---|
173 | 178 | |
---|
174 | 179 | @Override |
---|
175 | 180 | public Characteristics getCharacteristics(int cameraId) { |
---|
176 | | - if (mCameraInfos == null || mCameraInfos.length == 0 || mCameraInfos.length <= cameraId) { |
---|
177 | | - return null; |
---|
178 | | - } |
---|
179 | | - Camera.CameraInfo info = mCameraInfos[cameraId]; |
---|
| 181 | + Camera.CameraInfo info = mCameraInfos.get(cameraId); |
---|
180 | 182 | if (info != null) { |
---|
181 | 183 | return new AndroidCharacteristics(info); |
---|
| 184 | + } else if (!mCameraInfos.isEmpty()){ |
---|
| 185 | + return new AndroidCharacteristics(mCameraInfos.get(0)); |
---|
182 | 186 | } else { |
---|
183 | 187 | return null; |
---|
184 | 188 | } |
---|
.. | .. |
---|
199 | 203 | return mFirstFrontCameraId; |
---|
200 | 204 | } |
---|
201 | 205 | |
---|
| 206 | + @Override |
---|
| 207 | + public int getFirstExternalCameraId() { |
---|
| 208 | + return mFirstExternalCameraId; |
---|
| 209 | + } |
---|
| 210 | + |
---|
202 | 211 | private static class AndroidCharacteristics extends Characteristics { |
---|
203 | 212 | private Camera.CameraInfo mCameraInfo; |
---|
204 | 213 | |
---|
.. | .. |
---|
217 | 226 | } |
---|
218 | 227 | |
---|
219 | 228 | @Override |
---|
| 229 | + public boolean isFacingExternal() { |
---|
| 230 | + return mCameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_EXTERNAL; |
---|
| 231 | + } |
---|
| 232 | + |
---|
| 233 | + @Override |
---|
220 | 234 | public int getSensorOrientation() { |
---|
221 | 235 | return mCameraInfo.orientation; |
---|
222 | 236 | } |
---|