2016-07-25 55 views
1

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

对于我的应用我需要切换相机并打开相机背面的光。第一个很容易用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); 
    } 
} 

回答

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是()的方法。

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

希望这有助于你

+0

谢谢你,这个工程时,在开始之前CameraCapturer叫。不幸的是,在我的情况下,我必须在视频通话期间打开和关闭指示灯(通过websocket连接切换命令)。暂停并重新启动预览会没问题,但是现在CameraCapturer会让相机暂停,并且在自己拿到相机时出现'java.lang.RuntimeException:无法连接到相机服务' – gtRfnkN

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

设置此及以下一类FUNC,你有(从Twilio例如名称)到CameraCapturerCompat的访问对象

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

    cameraCapturerCompat.updateCameraParameters(flashToggler); 
} 

,然后在你的CameraCapturerCompat类:

public void updateCameraParameters(CameraParameterUpdater flashToggler) { 
    if (usingCamera1()) { 
     camera1Capturer.updateCameraParameters(flashToggler); 
    } 
}