如何在Android平台上打开“前置摄像头”?

更一般地说,如果一个设备有多个embedded式摄像头,是否有办法初始化其中的一个?

我没有在Android参考文档中find它:

  • https://developer.android.com/reference/android/hardware/Camera.html
  • https://developer.android.com/reference/android/hardware/camera2/package-summary.html
  • https://developer.android.com/reference/android/hardware/camera2/CameraManager.html

三星SHW-M100S有两个摄像头。 如果没有参考使用两个相机,任何想法如何三星做…?

private Camera openFrontFacingCameraGingerbread() { int cameraCount = 0; Camera cam = null; Camera.CameraInfo cameraInfo = new Camera.CameraInfo(); cameraCount = Camera.getNumberOfCameras(); for (int camIdx = 0; camIdx < cameraCount; camIdx++) { Camera.getCameraInfo(camIdx, cameraInfo); if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { try { cam = Camera.open(camIdx); } catch (RuntimeException e) { Log.e(TAG, "Camera failed to open: " + e.getLocalizedMessage()); } } } return cam; } 

AndroidManifest.xml文件中添加以下权限:

 <uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera" android:required="false" /> <uses-feature android:name="android.hardware.camera.front" android:required="false" /> 

注意:这个function在姜饼(2.3)和Android版本中可用。

从Android 2.1开始,Android仅在其SDK中支持单个摄像头。 这可能会在未来的Android版本中添加。

所有较旧的答案的方法都被Google弃用(据推测是因为这样的麻烦),因为API 21你需要使用 Camera 2 API:

这个类在API级别21中被弃用。我们build议为新的应用程序使用新的android.hardware.camera2 API。

在较新的API中,您几乎可以完全通过Android设备相机和文档明确地build议

 String[] getCameraIdList() 

然后使用获得的CameraId打开摄像机:

 void openCamera(String cameraId, CameraDevice.StateCallback callback, Handler handler) 

99%的正面相机具有id =“1”,并且背面相机id =“0”根据这个:

不可移动的摄像机使用从0开始的整数作为其标识符,而可移动摄像机对于每个单独的设备具有唯一的标识符,即使它们是相同的型号。

但是 ,这意味着,如果设备状况非常罕见,就像1-frontal -camera平板电脑一样,您需要计算您拥有的embedded式摄像机的数量,并根据其重要性(“0”)放置摄像机的顺序。 所以CAMERA_FACING_FRONT == 1 CAMERA_FACING_BACK == 0,这意味着后置摄像头比正面更重要

我不知道统一的方法来识别所有Android设备上的正面相机。 简单地说,设备内部的Android操作系统不能真正找出哪个相机是由于某些原因确切地在哪里:也许唯一的相机硬编码id是一个整数代表其重要性或可能在某些设备上,无论你转向哪一方。背部”。

文档 : https : //developer.android.com/reference/android/hardware/camera2/package-summary.html

明确的例子 : https : //github.com/googlesamples/android-Camera2Basic


对于旧的API (这是不推荐,因为它不会在现代手机更新的Android版本,传输是一个痛苦的屁股)。 只需使用相同的Integer CameraID(1)就可以像在这个答案中一样打开前置摄像头:

 cam = Camera.open(1); 

如果您信任OpenCV来完成相机部分:

  <org.opencv.android.JavaCameraView ../> 

使用以下的正面相机:

  opencv:camera_id="1" 
 public void surfaceCreated(SurfaceHolder holder) { try { mCamera = Camera.open(); mCamera.setDisplayOrientation(90); mCamera.setPreviewDisplay(holder); Camera.Parameters p = mCamera.getParameters(); p.set("camera-id",2); mCamera.setParameters(p); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } 

对于API 21(5.0)及更高版本,您可以使用CameraManager API

 try { String desiredCameraId = null; for(String cameraId : mCameraIDsList) { CameraCharacteristics chars = mCameraManager.getCameraCharacteristics(cameraId); List<CameraCharacteristics.Key<?>> keys = chars.getKeys(); try { if(CameraCharacteristics.LENS_FACING_FRONT == chars.get(CameraCharacteristics.LENS_FACING)) { // This is the one we want. desiredCameraId = cameraId; break; } } catch(IllegalArgumentException e) { // This key not implemented, which is a bit of a pain. Either guess - assume the first one // is rear, second one is front, or give up. } } } 
 Camera camera; if (Camera.getNumberOfCameras() >= 2) { //if you want to open front facing camera use this line camera = Camera.open(CameraInfo.CAMERA_FACING_FRONT); //if you want to use the back facing camera camera = Camera.open(CameraInfo.CAMERA_FACING_BACK); } try { camera.setPreviewDisplay("your surface holder here"); camera.startPreview(); } catch (Exception e) { camera.release(); } 

/ *这不是正确的方法,这是运行Android 4.0或更早版本的旧设备的解决scheme。 这可以用于testing目的,但不推荐用于主要开发。 这个解决scheme可以被认为只是一个临时解决scheme。 但这个解决scheme已经帮了很多,所以我不打算删除这个答案* /

随着Android 2.3 (姜饼)的发布,你现在可以使用android.hardware.Camera类获取摄像机的数量,有关特定相机的信息,并获得一个特定的Camera的参考。 在这里查看新的Camera API。

的build.gradle

  dependencies { compile 'com.google.android.gms:play-services-vision:9.4.0+' } 

设置视图

 CameraSourcePreview mPreview = (CameraSourcePreview) findViewById(R.id.preview); GraphicOverlay mGraphicOverlay = (GraphicOverlay) findViewById(R.id.faceOverlay); CameraSource mCameraSource = new CameraSource.Builder(context, detector) .setRequestedPreviewSize(640, 480) .setFacing(CameraSource.CAMERA_FACING_FRONT) .setRequestedFps(30.0f) .build(); mPreview.start(mCameraSource, mGraphicOverlay);