【问题标题】:Check which camera is Open Front or Back Android检查哪个摄像头是 Open Front or Back Android
【发布时间】:2015-04-21 12:34:23
【问题描述】:

我知道我可以设置boolean flag while opening front Camera。如果标志为真,则表示前置摄像头已打开。

但是有没有办法使用 Android API 来知道哪个相机现在是打开的?正面或背面。

public int getFrontCameraId() {
    CameraInfo ci = new CameraInfo();
    for (int i = 0 ; i < Camera.getNumberOfCameras(); i++) {
        Camera.getCameraInfo(i, ci);
        if (ci.facing == CameraInfo.CAMERA_FACING_FRONT) return i;
    }
    return -1; // No front-facing camera found
}

当我打开前置摄像头时,摄像头预览正在反转(倒置)。所以我必须添加一个检查哪个相机是打开的if FrontCamera is opened then matrix = 270. otherwise matrix =90.

onPreviewFrame(byte abyte0[] , Camera camera)

 int[] rgbData = YuvUtils.decodeGreyscale(abyte0, mWidth,mHeight);

    editedBitmap.setPixels(rgbData, 0, widthPreview, 0, 0, widthPreview, heightPreview);

    finalBitmap = Bitmap.createBitmap(editedBitmap, 0, 0, widthPreview, heightPreview, matrix, true);

【问题讨论】:

标签: java android camera


【解决方案1】:
    private boolean safeCameraOpen(int id) {
    boolean qOpened = false;

    try {
        releaseCameraAndPreview();
        mCamera = Camera.open(id);
        qOpened = (mCamera != null);
    } catch (Exception e) {
        Log.e(getString(R.string.app_name), "failed to open Camera");
        e.printStackTrace();
    }

    return qOpened;    
}

private void releaseCameraAndPreview() {
    mPreview.setCamera(null);
    if (mCamera != null) {
        mCamera.release();
        mCamera = null;
    }
}

从 API 级别 9 开始,相机框架支持多个相机。
如果您使用旧版 API 并在不带参数的情况下调用 open(),您将获得第一个后置摄像头。

Android 设备可以有多个摄像头,例如用于摄影的后置摄像头和用于视频通话的前置摄像头。

Android 2.3(API 级别 9)及更高版本允许您使用 Camera.getNumberOfCameras() 方法检查设备上可用的摄像头数量。

要访问主摄像头,请使用Camera.open() 方法并确保捕获任何异常,如下面的代码所示:

/** A safe way to get an instance of the Camera object. */
public static Camera getCameraInstance(){
    Camera c = null;
    try {
        c = Camera.open(); // attempt to get a Camera instance
    }
    catch (Exception e){
        // Camera is not available (in use or does not exist)
    }
    return c; // returns null if camera is unavailable
}

在运行 Android 2.3(API 级别 9)或更高版本的设备上,您可以使用 Camera.open(int) 访问特定的摄像头。
上面的示例代码将访问具有更多功能的设备上的第一个后置摄像头不止一台相机。

【讨论】:

  • Camera.release()使用后别忘了松开相机
  • 'android.hardware.Camera' 已弃用
  • @Gaan_staglA 这只是因为新的 Camera2 API,除了最新的 Nexus 设备之外,任何手机都几乎不支持它。
【解决方案2】:

在新的android.hardware.camera2 包中,您可以从CameraCharacteristics.LENS_FACING 属性中查询,每个CameraDevice 发布其idCameraDevice.getId() 很容易获得特性。

在较旧的相机 API 中,我认为唯一的方法是跟踪您打开它时使用的索引。

private int cameraId;

public void openFrontCamera(){
   cameraId = getFrontCameraId();
   if (cameraId != -1)
     camera = Camera.open(cameraId); //try catch omitted for brevity
}

然后使用cameraId 稍后,这个little snippet 可能是实现你想要的更好的方法:

public void onOrientationChanged(int orientation) {
     if (orientation == ORIENTATION_UNKNOWN) return;
     android.hardware.Camera.CameraInfo info =
            new android.hardware.Camera.CameraInfo();
     android.hardware.Camera.getCameraInfo(cameraId, info);
     orientation = (orientation + 45) / 90 * 90;
     int rotation = 0;
     if (info.facing == CameraInfo.CAMERA_FACING_FRONT) {
         rotation = (info.orientation - orientation + 360) % 360;
     } else {  // back-facing camera
         rotation = (info.orientation + orientation) % 360;
     }
     mParameters.setRotation(rotation);
 }

【讨论】:

  • 我应该把代码放在哪里或调用它 onOrientationChanged
  • 点击链接“小sn-p”
【解决方案3】:

如果你有自定义的相机活动,你可以试试这个方法。

boolean inPreview;

在你的 surfaceView 集合中的 on surfaceChanged 方法中

inPreview = True;

在您的 Camera.CallbackListener 变量集中

inPreview = false;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 2020-03-16
    • 1970-01-01
    • 1970-01-01
    • 2013-08-12
    相关资源
    最近更新 更多