1

我目前正在使用 Twilio Video API 开发应用程序:https ://www.twilio.com/video 它仍处于测试阶段,但在大多数情况下都很好用。也许还有一种方法可以解决我的问题。

对于我的应用程序,我需要切换摄像头并打开后置摄像头的灯。第一个很容易用 Twilio 完成,但第二个我没有相机对象来控制相机灯光。有没有办法获取相机对象?或者我可以自己创建相机对象,然后将其传递给 Twilio?或者有其他方法可以打开灯吗?

我的相机预览代码。在示例中,我使用 将CameraCapturer相机预览放入视图中:

cameraCapturer = CameraCapturer.create(MyActivity.this, CameraCapturer.CameraSource.CAMERA_SOURCE_FRONT_CAMERA, capturerErrorListener());
startPreview();

和预览:

private void startPreview() {
    if (cameraCapturer != null) {
        cameraCapturer.startPreview(previewFrameLayout);
    }
}
4

3 回答 3

1

Twilio 开发人员布道者在这里。您是对的,当前版本的 SDK 不允许您像自己创建相机对象那样控制相机捕捉器。

不过我们知道这一点,并且正在开发一个新版本,您将能够做到这一点。

暂时我建议还是尝试手动创建自己的相机对象,这样你就可以打开背光了,我认为只要你不调用预览,你不应该以冲突告终.

我想像这样(未经测试)的东西会起作用。

private void turnOnFlash() {
    Camera camera = Camera.open();
    Camera.Parameters params = camera.getParameters();
    params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
    camera.setParameters(params);
}

还要将此添加到您的 AndroidManifest。

<permission android:name="android.permission.FLASHLIGHT"
        android:permissionGroup="android.permission-group.HARDWARE_CONTROLS"
        android:protectionLevel="normal" />

然后你会在你调用 startPreview() 的地方调用那个方法。

这个解决方案暂时应该可以让您继续前进,但是将来您将能够传递自己的相机对象,所以如果这暂时不是一个紧迫的功能,那么我会等待更新版本。

希望这可以帮助你

于 2016-07-27T14:56:32.413 回答
0

你应该创建这个:

private boolean flashOn = false;

private final CameraParameterUpdater flashToggler = new CameraParameterUpdater() {
    @Override public void apply(Camera.Parameters parameters) {
        if (parameters.getFlashMode() != null) {
            String flashMode = flashOn ?
                    Camera.Parameters.FLASH_MODE_OFF :
                    Camera.Parameters.FLASH_MODE_TORCH;
            parameters.setFlashMode(flashMode);
            flashOn = !flashOn;
        } else {
            Toast.makeText(*context*,
                    R.string.flash_not_supported,
                    Toast.LENGTH_LONG).show();
        }
    }
};

在可以访问 CameraCapturerCompat(Twilio 示例中的名称)对象的类中设置这个和下面的 func

public void setFlashOn(boolean state) {
    flashOn = !state;

    cameraCapturerCompat.updateCameraParameters(flashToggler);
}

然后在您的 CameraCapturerCompat 类上:

public void updateCameraParameters(CameraParameterUpdater flashToggler) {
    if (usingCamera1()) { 
        camera1Capturer.updateCameraParameters(flashToggler);
    }
}
于 2017-10-04T14:19:39.557 回答
0

现在在他们的 Github 页面上有一个来自 Twilio 的官方示例:exampleAdvancedCameraCapturer

您可以在AdvancedCameraCapturerActivity.java中查看切换的工作原理

于 2018-08-23T08:29:15.563 回答