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 Camera server dead 结束。如果相机在通常工作之前成功拍照。

我调试了很长时间,当我用 Torch 注释掉行时,我发现它可以工作。在拍照时,我可以看到手电筒在两种情况下都有效。

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. 尝试了带火炬的应用程序

结果如下:

  1. 没有火炬的应用程序始终有效
  2. 在大约 80% 的尝试中,App-with-torch 在第 2 点不起作用。(重启后)
  3. App-with-torch 始终在第 5 点工作。(在使用 app-without-torch 之后)

即使我在拍照前添加了 torchOff(),我的应用程序也开始工作。

4

2 回答 2

2

我们可以将其称为“Monty Python Dead Parrot Log.d answer”:-PI 希望我为您提供解决方案-尽管有一些建议。海森虫很难捕捉。

手电筒有 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 )。

另一件事是看看你是否可以挖掘相机的源代码(或手电筒的)和错误 100 的 GREP - 或者这是一个通用的 android 100 ?

我相信你很清楚当那台相机启动时会发生多少事情——似乎有数百个电话。由于其中一些低级项目是异步的(毕竟凸轮是硬件),我怀疑您得到的是 NPE 或未充分初始化的对象。并非所有 NPE 等都被困住,因此如果使用延迟或同步序列,它可能会死在一个不存在的地方。

(HTH - 我感觉到你的痛苦,阿里,我最近不得不做很多相机的事情。在三星 SIII 上调试非常耗时。)

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

如何在 Android 中以编程方式打开相机闪光灯?

于 2013-08-28T16:03:48.720 回答
1

我认为这与每个OEM对Android相机HAL(硬件抽象层)的实现有关。这个问题也发生在我身上,我不确定,但我怀疑大多数相机 HAL 的手电筒模式仅适用于视频捕捉,因为无论如何这都是它最常用的地方。尝试在打开手电筒的情况下录制视频以进行检查。

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

于 2013-09-02T08:40:44.650 回答