我使用了已弃用的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();
请建议适用于所有设备的解决方案。我的最终目标是实现闪光灯,因此请注意手电筒的响应性是最重要的。
答案 0 :(得分:1)
您可以在输出SurfaceHolder准备就绪时开始预览,并让它保持运行直到用户停止闪光灯。
然后只需修改闪光模式并在想要打开/关闭时更新参数;你发现,开始/停止预览很慢,只要你完成选通就一直运行。