我有以下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上。
我在我的设备上安装了此应用程序的两个版本(具有不同的名称等)。我做了以下事情:
结果如下:
即使我在拍照之前添加了torchOff(),我的应用也会开始工作。
答案 0 :(得分:2)
我们可以称之为“Monty Python Dead Parrot Log.d回答”:-P我希望我有一个解决方案 - 尽管有一些建议。 Heisenbugs很难被捕获。
火炬是否有isOn()测试?
同样(我不记得),相机是否有isReady()测试?
你可以从日志中判断相机在mCamera.torchOn()或.torchOff()之前,期间或之后是否死亡?
如果延长通话时间间隔会发生什么?这不适用于真正的应用程序,但可能会帮助您监控和捕捉正在发生的事情。在伪代码中说出类似的内容:
try {
// Log.d ("cam", "here 1") ;
mCamera = configAndInitialize();
// Log.d ("cam", "here 2");
if ( mCamera.isReady() ) { // or isConfigured / initialized
// Log.d ("cam", "here 2");
Camera.startPreview();
// Log.d ("cam", "here 2");
thisThread.setDelay (200); // millisecs. try even up to 2000 ms !
// Log.d ("cam", "here 4");
mCamera.torchOn();
// Log.d ("cam", "here 5");
thisThread.setDelay (200); // again up to 2000 ms
// Log.d ("cam", "here 6");
}
} catch (Exception e) {
Log.d ("oops!", e.toString() );
}
监视或确定的另一件事是,在onClick可以触发之前,相机和手电筒确实准备好了。像Log.d一样遍布一些延迟,看看。它可能需要回调(mCamera.isReady()然后启用onClick)。
另一件事是看你是否可以挖掘相机的源代码(或火炬)和GREP的错误100 - 或者这是一个通用的android 100?
我确信你很清楚当相机被点燃时会发生多少事情 - 似乎有数百个电话。由于其中一些低级项目是异步的(毕竟凸轮是硬件),我怀疑你得到的是NPE或初始化不充分的对象。并非所有的NPE都被困,因此如果使用延迟或同步序列,它可能会死在那个不存在的那个。
(HTH - 我觉得你的痛苦,ari,我最近不得不做很多相机的事情。在三星SIII上进行调试非常费时。)[编辑]你可能已经找到了这个链接,但以防万一:
How to turn on camera flash light programmatically in Android?
答案 1 :(得分:1)
我认为这与每个OEM的Android相机HAL(硬件抽象层)的实现有关。这个问题也发生在我身上,我不确定,但我怀疑大多数相机HAL的火炬模式仅适用于视频捕捉,因为这是它最常用的地方。尝试在手持火炬的情况下录制视频以进行检查。
一种可能的解决方法是在拍摄照片之前将相机的闪光模式设置为FLASH_MODE_ON,然后在拍摄照片后再次返回FLASH_MODE_TORCH,如果您再次需要它。