我有以下android代码(这里用伪代码编写):
mCamera = configAndInitialize(); //all I want to do before taking picture
mCamera.startPreview();
mCamera.torchOn(); //setting parameters with flash mode torch
onClick(){
mCamera.stopPreview();
mCamera.takePicture();
mCamera.torchOff();
}
有时(通常最近重新启动手机并且相机在此应用程序之前未使用)此代码以错误100结束相机服务器死亡 . 如果相机在通常正常工作之前成功拍照 .
我正在调试它很长一段时间,当我用火炬注释掉线条时,我发现它有效 . 我可以看到火炬在两种情况下都能正常工作 .
torchOn代码如下:
if(mCamera != null){
mCamera.stopPreview();
Camera.Parameters p = mCamera.getParameters();
List<String> supported = p.getSupportedFlashModes();
if (supported.contains(Camera.Parameters.FLASH_MODE_TORCH)) {
p.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
}
mCamera.setParameters(p);
mCamera.startPreview();
}
有没有理由为什么因为火炬拍照无法工作?我观察到它发生在摩托罗拉Razr和三星Galaxy SIII上 .
我在我的设备上安装了这个应用程序的两个版本(具有不同的名称等) . 我做了以下事情:
-
重启设备
-
尝试使用火炬手
-
如果app-with-torch确实在第1点工作 .
-
尝试了无需火炬的应用程序
-
尝试使用火炬手
结果如下:
-
App-without-torch始终有效
-
大约80%的尝试使用手电筒在第2点不起作用 . (重启后)
-
App-with-torch总是在第5点工作 . (使用app-without-torch之后)
即使我在拍照之前添加了torchOff(),我的应用也会开始工作 .
2 回答
我们可以称之为“Monty Python Dead Parrot Log.d回答”:-P我希望我有一个解决方案 - 尽管有一些建议 . Heisenbugs很难捕捉到 .
火炬是否有isOn()测试?
同样(我不记得),相机是否有isReady()测试?
你可以从日志中判断相机在mCamera.torchOn()或.torchOff()之前,期间或之后是否已经死亡?
如果延长通话之间的时间间隔会发生什么?这不适用于真正的应用程序,但可能会帮助您监控和捕捉正在发生的事情 . 在伪代码中说出类似的内容:
监视或确定的另一件事是,在onClick可以触发之前,相机和手电筒确实准备就绪 . 像Log.d一样遍布一些延迟,看看 . 它可能需要回调(mCamera.isReady()然后启用onClick) .
另一件事是看你是否可以挖掘相机的源代码(或火炬的)和GREP的错误100 - 或者是一个通用的android 100?
我相信你很清楚当相机被激活时会发生多少事情 - 看起来好像有几百个电话 . 由于其中一些低级项目是异步的(毕竟凸轮是硬件),我怀疑你得到的是NPE或初始化不充分的对象 . 并非所有的NPE都被困,因此如果使用延迟或同步序列,它可能会死在那些不存在的NPE上 .
(HTH - 我感觉到你的痛苦,ari,我最近不得不做很多相机的东西 . 在三星SIII上进行调试非常费时 . )
[编辑]你可能已经找到了这个链接,但以防万一:
How to turn on camera flash light programmatically in Android?
我认为这与每个OEM的Android摄像头HAL(硬件抽象层)的实现有关 . 这个问题也发生在我身上,我不确定,但我怀疑大多数相机HAL的火炬模式仅适用于视频捕捉,因为这是最常用的地方 . 尝试在手持火炬的情况下录制视频以进行检查 .
一种可能的解决方法是在拍摄照片之前将相机的闪光模式设置为FLASH_MODE_ON,然后在拍摄照片后再次返回FLASH_MODE_TORCH,如果您再次需要它 .