2013-06-25 28 views
2


我正在打開一個應用程序,它打開閃光燈以預覽圖像數據並在完成時關閉閃光燈。鎖定屏幕並返回時,相機不工作

public void openFlash() { 
    try { 
     flash =false; 
     previewing=false; 
     finger_placed=false; 

     Log.d("", "openFlash"); 
     if(camera==null){ 
      camera = application.getCamera(); 
      preview = Dashboard.preview; 
      previewHolder = Dashboard.previewHolder; 

     } 
     Camera.Parameters parameters = camera.getParameters(); 
     parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH); 

     camera.setParameters(parameters); 
     camera.setPreviewDisplay(previewHolder); 
     camera.setPreviewCallback(previewCallback); 
     camera.startPreview(); 
    } catch (Throwable t) { 
     Log.e("PreviewDemo-surfaceCallback", "Exception in setPreviewDisplay()", t); 
    } 
} 

public void stopPreview() { 

    try{ 
     Log.d("", "stopPreview"); 
     Camera.Parameters parameters = camera.getParameters(); 
     parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF); 
     camera.setParameters(parameters); 
     camera.stopPreview(); 
     previewing=false; 
    }catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

每件事情都很好,直到我鎖定screen.WHen我解鎖屏幕和使用應用程序。 openFlash不起作用。並給出錯誤如下

06-20 12:13:25.725: E/AndroidRuntime(29033): FATAL EXCEPTION: main 

06-20 12:13:25.725: E/AndroidRuntime(29033): java.lang.RuntimeException: Method called after release() 
06-20 12:13:25.725: E/AndroidRuntime(29033):  at android.hardware.Camera.setHasPreviewCallback(Native Method) 
06-20 12:13:25.725: E/AndroidRuntime(29033):  at android.hardware.Camera.access$600(Camera.java:133) 
06-20 12:13:25.725: E/AndroidRuntime(29033):  at android.hardware.Camera$EventHandler.handleMessage(Camera.java:805) 
06-20 12:13:25.725: E/AndroidRuntime(29033):  at android.os.Handler.dispatchMessage(Handler.java:99) 
06-20 12:13:25.725: E/AndroidRuntime(29033):  at android.os.Looper.loop(Looper.java:137) 
06-20 12:13:25.725: E/AndroidRuntime(29033):  at android.app.ActivityThread.main(ActivityThread.java:4898) 
06-20 12:13:25.725: E/AndroidRuntime(29033):  at java.lang.reflect.Method.invokeNative(Native Method) 
06-20 12:13:25.725: E/AndroidRuntime(29033):  at java.lang.reflect.Method.invoke(Method.java:511) 
06-20 12:13:25.725: E/AndroidRuntime(29033):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1008) 
06-20 12:13:25.725: E/AndroidRuntime(29033):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:775) 
06-20 12:13:25.725: E/AndroidRuntime(29033):  at dalvik.system.NativeStart.main(Native Method) 

有沒有人遇到過這種情況。任何幫助將不勝感激。

回答

1

我喜歡它。 需要處理生命週期事件以打開並釋放相機和setRespective參數

-1

的方法之一是當你的應用程序工作,所以你能獲得之後鎖定您確保Android設備永遠不會locked.To這樣做只是添加權限: - 在清單

<uses-permission android:name="android.permission.WAKE_LOCK" /> 

並且只要你的應用程序開始在的onCreate()補充一點: -

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "DoNjfdhotDimScreen"); 

而在的onResume(): -

wl.acquire(); 

和的onPause()補充一點: -

wl.release(); 

或者說另一種方法來做到這將是簡單地做: -

getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON); 
+0

喚醒鎖定不會修復任何事情,只要用戶導航離開然後回到應用程序,它就會再次崩潰。 – npace

0

你定義關於相機和閃光燈清單文件的權限。 example: android:name =「android.permission.FLASHLIGHT」 android:permissionGroup =「android.permission-group.HARDWARE_CONTROLS」 如果您確定這一點,那麼請檢查您的相機對象是否在stopPreview()後發佈。例如: _camera.stopPreview(); _camera.release();

0

您不應該設置喚醒鎖定,因爲除非您試圖阻止設備暫停,否則您會燒燬設備電池。它看起來不像你。我看不到你的生命週期事件(onCreate,onPause等),但我敢打賭,你在onCreate中打開相機並在onPause中釋放它,這會在屏幕鎖定後調用。但是,當你解鎖屏幕時,你的應用程序可能還沒有被銷燬,所以onResume立即被調用;這意味着你永遠不會重新打開相機。在沒有看到任何其他代碼的情況下,我會開始查看您打開並釋放相機的位置

+0

你是對的,我使用Camera.open()onCreate方法,但我沒有在onPause中釋放相機,還有1件事是因爲我使用片段來完成任務所有相機代碼都在活動本身。我在onDestroy()中釋放相機。我的理解是,作爲活動不打電話onDestroy在屏幕鎖定它不應該釋放相機。事實並非如此。 – Mahesh

+0

您可能希望在您的onDestroy方法中放置一條日誌語句,以確保它不會被調用,因爲您的錯誤輸出表明相機已經發布,但它看起來像是在發佈後嘗試設置預覽Surface,這就是爲什麼它在抱怨。你真的無法控制系統何時會銷燬你的應用程序來回收內存。 –

1

在您的活動的onPause()中,您需要在Camera對象和onResume中調用release(),您需要分別調用open()。

the API reference

重要提示:呼叫釋放()來釋放相機其他應用程序使用。應用程序應立即在onPause()中釋放相機(並在onResume()中重新打開它())。