我有以下android代碼(這里用偽代碼編寫):
mCamera = configAndInitialize(); //all I want to do before taking picturemCamera.startPreview();mCamera.torchOn(); //setting parameters with flash mode torchonClick(){ mCamera.stopPreview(); mCamera.takePicture(); mCamera.torchOff();}
有時(通常最近重新啟動手機(jī)并且相機(jī)在此應(yīng)用程序之前未使用)此代碼以錯誤100結(jié)束相機(jī)服務(wù)器死亡.如果相機(jī)在通常正常工作之前成功拍照.
我正在調(diào)試它很長一段時間,當(dāng)我用火炬注釋掉線條時,我發(fā)現(xiàn)它有效.我可以看到火炬在兩種情況下都能正常工作.
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();}
有沒有理由為什么因為火炬拍照無法工作?我觀察到它發(fā)生在摩托羅拉Razr和三星Galaxy SIII上.
我在我的設(shè)備上安裝了這個應(yīng)用程序的兩個版本(具有不同的名稱等).我做了以下事情:
>重啟設(shè)備
>嘗試使用火炬手
>如果app-with-torch確實在第1點工作.
>嘗試沒有火炬的應(yīng)用程序
>嘗試使用火炬手
結(jié)果如下:
> App-without-torch始終有效
>大約80%的嘗試中的應(yīng)用程序火炬在第2點不起作用.(重啟后)
> App-with-torch總是在第5點工作.(使用app-without-torch之后)
即使我在拍照之前添加了torchOff(),我的應(yīng)用也會開始工作.
解決方法:
我們可以稱之為“Monty Python Dead Parrot Log.d回答”:-P我希望我有一個解決方案 – 盡管有一些建議. Heisenbugs很難捕捉到.
火炬是否有isOn()測試?
同樣(我不記得),相機(jī)是否有isReady()測試?
你可以從日志中判斷相機(jī)在mCamera.torchOn()或.torchOff()之前,期間或之后是否已經(jīng)死亡?
如果延長通話之間的時間間隔會發(fā)生什么?這不適用于真正的應(yīng)用程序,但可能會幫助您監(jiān)控和捕捉正在發(fā)生的事情.在偽代碼中說出類似的內(nèi)容:
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() ); }
監(jiān)視或確定的另一件事是,在onClick可以觸發(fā)之前,相機(jī)和手電筒確實準(zhǔn)備就緒.像Log.d一樣遍布一些延遲,看看.它可能需要回調(diào)(mCamera.isReady()然后啟用onClick).
另一件事是看你是否可以挖掘相機(jī)的源代碼(或火炬的)和GREP的錯誤100 – 或者是一個通用的android 100?
我相信你很清楚當(dāng)相機(jī)被點燃時會發(fā)生多少事情 – 似乎有幾百個電話.由于其中一些低級項目是異步的(畢竟凸輪是硬件),我懷疑你得到的是NPE或初始化不充分的對象.并非所有的NPE都被困,因此如果使用延遲或同步序列,它可能會死在那些不存在的NPE上.
(HTH – 我感覺到你的痛苦,ari,我最近不得不做很多相機(jī)的東西.在三星SIII上進(jìn)行調(diào)試非常費時.)
[編輯]你可能已經(jīng)找到了這個鏈接,但以防萬一:
How to turn on camera flash light programmatically in Android?
來源:https://www.icode9.com/content-4-280001.html