因为应用支持Android 2.2 版本,因此直接使用Camera.open()打开Camera,但据反应在某些平板上无后置摄像头但有前置摄像头的时候,则没法使用(由于open()方法只能打开后置摄像头)。 java
故使用反射则中解决,默认使用后置。(在台电平板上已测试经过) android
/** * 打开默认相机 * 默认打开后置摄像头,若没有则打开前置 * @return */ public static Camera openDefaultCamera() { Camera camera = null; try { Class<?> cameraClass = Camera.class; Method method = cameraClass.getMethod("getNumberOfCameras"); int cameraNum = (Integer) method.invoke(null); int backId = -1; int frontId = -1; int defaultId = 0; Class<?>[] classes = cameraClass.getDeclaredClasses(); Class<?> cameraInfoCalss = null; for (Class<?> clz : classes) { String name = clz.getName(); if (name.equals("android.hardware.Camera$CameraInfo")) { cameraInfoCalss = clz; } } if (cameraInfoCalss == null) { return camera; } Field backField = cameraInfoCalss.getField("CAMERA_FACING_BACK"); Field frontField = cameraInfoCalss.getField("CAMERA_FACING_FRONT"); //获取先后摄像头默认facing int值 int backFacing = backField.getInt(cameraInfoCalss); int frontFacing = frontField.getInt(cameraInfoCalss); java.lang.reflect.Constructor cons = cameraInfoCalss.getConstructor(); if (cons == null) { return camera; } Object cameraInfo = cons.newInstance(); for (int i = 0; i < cameraNum; i++) { Method getCameraInfo = cameraClass.getMethod("getCameraInfo", int.class, cameraInfoCalss); getCameraInfo.invoke(null, i, cameraInfo); if (cameraInfo == null) { continue; } Field field = cameraInfoCalss.getDeclaredField("facing"); int facing = field.getInt(cameraInfo); if (facing == backFacing) { backId = defaultId; defaultId++; } else if (facing == frontFacing) { frontId = defaultId; defaultId++; } } Method openMethod = cameraClass.getMethod("open", int.class); if (backId != -1) { //默认使用后置摄像头 camera = (Camera) openMethod.invoke(null, backId); } else if (frontId != -1) { camera = (Camera) openMethod.invoke(null, frontId); } } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } if (camera == null) { //若为空,使用默认方法打开一次 camera = Camera.open(); } return camera; }