使用已弃用的Camera API,频闪指示灯无法在某些设备上运行

时间:2016-10-17 08:23:34

标签: java android android-camera surfaceview flashlight

我使用了已弃用的Camera API,因为Camera2涉及太多不必要的步骤来简单地启用Flashlight。

但在某些设备上它似乎没有用。

根据我在Google和SO上所做的研究,似乎某些设备需要您为手电筒提供表面才能工作。但这大大减慢了我应用程序中的频闪功能。

mCamera = android.hardware.Camera.open(0);
mCameraParameters = mCamera.getParameters();

mHolder = aSurfaceView.getHolder();
mHolder.addCallback(this);

@Override
public void surfaceCreated(SurfaceHolder holder) {
    mHolder = holder;
    setPreviewDisplay(mHolder);
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    mHolder = null;
}

private void setPreviewDisplay(SurfaceHolder aHolder) {
    try {
        mCamera.setPreviewDisplay(aHolder);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

我也尝试过使用surfaceTexture,这也会减慢手电筒的速度。看起来像startPreview表面提供的运行速度较慢。使用线程来做同样的事情仍然会减慢过程。

这就是我目前处理闪存更改的方式:

String mFlashMode;

if (on) {
    if (noTorch) mFlashMode = FLASH_ON;
    else mFlashMode = FLASH_TORCH;

} else mFlashMode = FLASH_OFF;

mCameraParameters.setFlashMode(mFlashMode);
mCamera.setParameters(mCameraParameters);

if (on) mCamera.startPreview();
else mCamera.stopPreview();

请建议适用于所有设备的解决方案。我的最终目标是实现闪光灯,因此请注意手电筒的响应性是最重要的。

1 个答案:

答案 0 :(得分:1)

您可以在输出SurfaceHolder准备就绪时开始预览,并让它保持运行直到用户停止闪光灯。

然后只需修改闪光模式并在想要打开/关闭时更新参数;你发现,开始/停止预览很慢,只要你完成选通就一直运行。