首页 文章

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

提问于
浏览
4

我有以下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 回答

  • 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都被困,因此如果使用延迟或同步序列,它可能会死在那些不存在的NPE上 .

    (HTH - 我感觉到你的痛苦,ari,我最近不得不做很多相机的东西 . 在三星SIII上进行调试非常费时 . )

    [编辑]你可能已经找到了这个链接,但以防万一:

    How to turn on camera flash light programmatically in Android?

  • 1

    我认为这与每个OEM的Android摄像头HAL(硬件抽象层)的实现有关 . 这个问题也发生在我身上,我不确定,但我怀疑大多数相机HAL的火炬模式仅适用于视频捕捉,因为这是最常用的地方 . 尝试在手持火炬的情况下录制视频以进行检查 .

    一种可能的解决方法是在拍摄照片之前将相机的闪光模式设置为FLASH_MODE_ON,然后在拍摄照片后再次返回FLASH_MODE_TORCH,如果您再次需要它 .

相关问题