如何在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);