使用已弃用的相机 API,频闪灯在某些设备上不起作用

Using the deprecated Camera API, strobe light not working on some devices

我使用了已弃用的相机 API,因为 Camera2 涉及太多不必要的步骤,无法简单地启用手电筒。

但在某些设备上它似乎不起作用。

根据我在 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 运行速度较慢。使用线程执行相同的操作仍然会减慢进程。

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

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

请提出适用于所有设备的解决方案。我的最终目标是实现闪光灯,所以请注意手电筒的响应速度是最重要的。

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

然后修改闪光灯模式,切换时更新参数即可on/off; starting/stopping 如您所见,预览速度很慢,请保留它 运行 直到完成选通。