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

时间:2010-05-06 06:41:57

标签: android camera android-camera

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

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

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

9 个答案:

答案 0 :(得分: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;
}

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" />

注意:此功能适用于Gingerbread(2.3)和Up Android版。

答案 1 :(得分:12)

所有旧答案&#39;谷歌不赞成这些方法(据说是因为这样的麻烦),因为API 21需要use Camera 2 API:

  

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

the newer API中,您对Android设备相机几乎完全支持并明确建议

String[] getCameraIdList()

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

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

99%的正面相机都有id =&#34; 1&#34;和后置摄像头ID =&#34; 0&#34; 根据这个:

  

不可移动相机使用从0开始的整数   标识符,而可移动摄像机每个都有唯一的标识符   个别设备,即使它们是同一型号。

然而,这意味着如果设备情况很罕见,就像1-frontal -camera平板电脑一样,您需要计算您拥有的嵌入式相机的数量,并下订单相机的重要性(&#34; 0&#34;)。所以CAMERA_FACING_FRONT == 1 CAMERA_FACING_BACK == 0,这意味着后置摄像头比正面更强重要

我不知道在所有Android设备上识别正面相机的统一方法。简单地说,设备内部的Android操作系统由于某些原因无法真正找出哪个摄像机正好在哪里:也许唯一的摄像机硬编码ID是一个表示其重要性的整数,或者可能在某些设备上,无论您转向哪一侧。 。&#34;回来&#34;。

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

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

对于较旧的API (不建议这样做,因为它不适用于现代手机,较新的Android版本和传输是一种痛苦的屁股)。只需使用相同的整数 CameraID(1)打开正面相机,就像在this answer中一样:

cam = Camera.open(1);

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

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

使用以下相机:

        opencv:camera_id="1"

答案 2 :(得分:10)

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

答案 3 :(得分:4)

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();
    }
}

答案 4 :(得分:4)

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

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.
        }
    }
}

答案 5 :(得分:2)

随着Android 2.3(Gingerbread)的发布,您现在可以使用android.hardware.Camera类来获取摄像机的数量,有关特定摄像机的信息,并获得对特定{{1 }}。查看新的Camera API here

答案 6 :(得分:1)

要打开后退摄像头,请执行以下操作:-

router.get("/home", async (req, res) => {
   if (req.query.search) {
      let result = [];
      const collections = ['A', 'B', 'C', 'D', 'E', 'F'];
      const regex = new RegExp(escapeRegex(req.query.search), 'gi');

      for (let collection of collections) {
         let group = mongoose.model(collection);
         result.push(...await group.find({ 'title': regex }));
      }
      res.render("public/hadith.ejs", { search: result});
   }
});

function escapeRegex(text) {
   return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
};

要打开前置摄像头,请执行以下操作:-

val cameraIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
startActivityForResult(cameraIntent, REQUEST_CODE_CAMERA)

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

答案 7 :(得分:0)

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或更早版本的旧设备的解决方案。这可用于测试目的,但不建议用于主要开发。此解决方案仅可视为临时解决方案。但是这个解决方案帮助了很多人,所以我不打算删除这个答案* /

答案 8 :(得分:0)

<强>的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);