火炬打开时奇怪的Android相机行为

时间:2013-08-23 11:16:18

标签: android camera android-camera

我有以下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上。

我在我的设备上安装了此应用程序的两个版本(具有不同的名称等)。我做了以下事情:

  1. 重启设备
  2. 尝试使用火炬手
  3. 如果app-with-torch确实在第1点工作。
  4. 尝试了无需火炬的应用
  5. 尝试使用火炬手
  6. 结果如下:

    1. App-without-torch总是
    2. 大约80%的尝试中的应用程序火炬在第2点不起作用(重启后)
    3. App-with-torch总是在第5点工作。(使用app-without-torch后)
    4. 即使我在拍照之前添加了torchOff(),我的应用也会开始工作。

2 个答案:

答案 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,如果您再次需要它。