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

Sol*_*Sol 83 camera android android-camera

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

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

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

小智 113

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;
}
Run Code Online (Sandbox Code Playgroud)

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" />
Run Code Online (Sandbox Code Playgroud)

注意:此功能在Gingerbread(2.3)和Up Android Version中可用.

  • @loeschg`Intent`以自己的方式处理相机动作.当您使用"SurfaceView"来利用相机功能时,可以使用此技术. (3认同)
  • 非常酷的帖子.花了一些时间来弄清楚相机面对不一定与相机索引相同.例如,我的平板电脑只有一个摄像头(索引:0)但面向前方(面向索引:1).因此,使用像Camera.open(CameraInfo.CAMERA_FACING_FRONT)这样的简单代码是无稽之谈. (2认同)

ian*_*nuk 13

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

该类在API级别21中已弃用.我们建议将新的android.hardware.camera2 API用于新的应用程序.

较新的API中,几乎可以完全掌握 Android设备相机和文档的明确建议

String[] getCameraIdList()
Run Code Online (Sandbox Code Playgroud)

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

void openCamera(String cameraId, CameraDevice.StateCallback callback, Handler handler)
Run Code Online (Sandbox Code Playgroud)

99%的正面相机具有id ="1",并且后置摄像头id ="0", 根据此:

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

但是,这意味着如果设备情况很罕见,就像1-frontal -camera平板电脑一样,您需要计算您拥有的嵌入式摄像机数量,并根据其重要性("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);
Run Code Online (Sandbox Code Playgroud)

如果您信任OpenCV来执行相机部件:

    <org.opencv.android.JavaCameraView
    ../>
Run Code Online (Sandbox Code Playgroud)

使用以下相机:

        opencv:camera_id="1"
Run Code Online (Sandbox Code Playgroud)


Com*_*are 10

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

  • @ozmank:是的,在Android 2.3之前没有添加多相机支持. (2认同)

Shu*_*tka 6

要打开后置摄像头:-

val cameraIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
startActivityForResult(cameraIntent, REQUEST_CODE_CAMERA)
Run Code Online (Sandbox Code Playgroud)

要打开前置摄像头:-

val cameraIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
when {
     Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1 && Build.VERSION.SDK_INT < Build.VERSION_CODES.O -> {
         cameraIntent.putExtra("android.intent.extras.CAMERA_FACING", CameraCharacteristics.LENS_FACING_FRONT)  // Tested on API 24 Android version 7.0(Samsung S6)
     }
     Build.VERSION.SDK_INT >= Build.VERSION_CODES.O -> {
         cameraIntent.putExtra("android.intent.extras.CAMERA_FACING", CameraCharacteristics.LENS_FACING_FRONT) // Tested on API 27 Android version 8.0(Nexus 6P)
         cameraIntent.putExtra("android.intent.extra.USE_FRONT_CAMERA", true)
     }
     else -> cameraIntent.putExtra("android.intent.extras.CAMERA_FACING", 1)  // Tested API 21 Android version 5.0.1(Samsung S4)
}
startActivityForResult(cameraIntent, REQUEST_CODE_CAMERA)
Run Code Online (Sandbox Code Playgroud)

我无法使其适用于 API 28 及更高版本。此外,在某些设备中无法直接打开前置摄像头(取决于制造商)。