【问题标题】:Strange android camera behaviour when torch is on手电筒打开时奇怪的android相机行为
【发布时间】:2013-08-26 10:13:47
【问题描述】:

我有以下 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 相机服务器死亡结束。如果相机在正常工作之前成功拍照。

我调试了很长时间,当我用 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. App-without-torch 始终有效
  2. App-with-torch 在大约 80% 的尝试中在第 2 点不起作用。(重启后)
  3. App-with-torch 始终在第 5 点工作。(在使用 app-without-torch 之后)

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

【问题讨论】:

  • 只是好奇 - 是否有技术上的原因为什么仅仅启动相机是不可能获得所需照片的方法? (问题:一些三星设备可以在 activityOnResult 参数中传递 data=null。)
  • @HowardPautz 我有自定义布局,我需要在拍照时打开手电筒。拍照很容易。

标签: android camera android-camera


【解决方案1】:

我们可以将其称为“Monty Python Dead Parrot Log.d 答案”:-P 我希望我能为您提供解决方案 - 不过确实有一些建议。海森虫很难捕捉。

torch 是否有 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?

【讨论】:

  • 感谢您的回答。我可以打开和关闭手电筒等等,它可以工作。我可以看到手电筒打开和关闭。一切准备就绪后,我可以等待几分钟(我的意思是在我可以看到预览并且手电筒打开之后)。至此,一切正常。然后我点击屏幕并执行拍照。我没有得到带有图片的回调,而是得到 OnError 错误 100 媒体服务器死亡。所以我认为一切都准备好了。这可能是 android 或硬件中的一些错误。
  • @Ari 不客气。当然,通常最好使用真实设备进行测试,但是使用干净的模拟器(按照步骤 1-5)您会看到什么行为?此外,请在您的 OP 中编辑回调代码以供审核。从上面的评论中,我收集到它在处理回调之前崩溃了?当您使用 2 个不同供应商的设备时,硬件中的错误似乎不太可能。 (除非 Razor 和 SIII 使用相同的 Cam 和驱动程序代码 :)) android 中的错误肯定不会闻所未闻 :-| ...可能也应该发布您的日志文件输出。这个很奇怪。
  • 它不会崩溃。而不是在图片上回调我得到 onError。
  • 好的 - 请编辑并发布围绕回调和 onError 周围区域的代码。还有日志文件。需要更多信息来理解/复制。是否需要两次 startPreview() ?
  • @Ari Ari,我很想帮忙,但确实需要查看更多代码。
【解决方案2】:

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

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

【讨论】:

  • 我正在使用手电筒来提高照片质量,所以我认为使用 flash_mode_on 对我没有帮助。感谢您的回答 - 现在我知道其他人也有这个问题。
  • @npace - 我认为你可能是对的。例如,我们在三星相机上遇到了许多奇怪的问题。 (而且,CommonsWare,如果你读到这篇文章,不,我不会记录那个地雷领域:-P ...我没有任何腿或手臂。用我的鼻子编码太耗时了,因为它是...)
  • 您应该尝试编写一个也适用于 LG 设备的相机应用程序,根据我的经验,它们与默认相机 HAL 的距离最远……相比之下,三星几乎就像股票一样。
  • @npace ugh!您是否在使用 LG 和简单的相机应用(使用 Intent Launch 和 onAct.Result)时遇到问题?
  • @HowardPautz - 我无法在我的三星 Galaxy S5 应用程序中启动手电筒,即使它适用于所有其他手机。我使用 OpenCamera 进行了测试,他们的代码打开了手电筒。我找不到我设置参数的方式和他们的方式之间的差异。我们唯一能想到的是时间问题?您对相机事件触发有任何了解吗?我在这里有一个问题:stackoverflow.com/q/28160616/1735836
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-10
  • 2020-06-04
  • 1970-01-01
相关资源
最近更新 更多