我们可以将其称为“Monty Python Dead Parrot Log.d 答案”:-P 我希望我能为您提供一个解决方案 - 不过,请提供一些建议。海森虫很难捕捉。
火炬有 isOn() 测试吗?
同样(我不记得了),相机是否有 isReady() 测试?
您能否从日志中判断相机是否在 Camera.torchOn() 或 .torchOn() 之前、期间或之后死亡?
如果延长通话之间的时间间隔会发生什么?这不适用于真正的应用程序,但可能会帮助您监视和捕获正在发生的情况。用伪代码来说这样的话:
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 - 我感受到你的痛苦,阿里,我最近不得不做很多相机的事情。在三星 SIII 上调试非常耗时。)
[编辑]您可能已经找到了此链接,但以防万一:
如何在 Android 中以编程方式打开相机闪光灯? https://stackoverflow.com/questions/6068803/how-turn-on-camera-flash-light-programmatically-in-android