2014-03-13 76 views
-1

我在我的應用程序中使用攝像頭服務。有時攝像頭服務在應用程序中運行良好,有時會產生運行時異常。我應該怎麼做,讓相機每次都能工作?

我在try塊把Camera.Open()和我擦肩而過,異常及其日誌貓表現

03-12 13:52:42.211: D/crazy(12686): in catch1 
03-12 13:52:42.211: D/crazy(12686): java.lang.RuntimeException: Fail to connect to camera service 

,我做的是代碼...

TelephonyManager mgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); 
      int callState = mgr.getCallState(); 

      //state = intent.getStringExtra(TelephonyManager.EXTRA_STATE); 
      if(callState==TelephonyManager.CALL_STATE_RINGING) { 
      try { 


       cam = Camera.open(); 
       p = cam.getParameters(); 

       String myString = "0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101011"; 
       long blinkDelay = 50; 


       for (int i = 0; i < myString.length(); i++) { 
        //state=intent.getStringExtra(TelephonyManager.EXTRA_STATE); 
        callState = mgr.getCallState(); 
        if (callState==TelephonyManager.CALL_STATE_IDLE){ 
         p.setFlashMode(Parameters.FLASH_MODE_OFF); 
     cam.release(); 
         break;     

         }else if (callState==TelephonyManager.CALL_STATE_OFFHOOK){ 
p.setFlashMode(Parameters.FLASH_MODE_OFF); 
     cam.release(); 
         break; 
         }    

        if (myString.charAt(i) == '0') { 
         p.setFlashMode(Parameters.FLASH_MODE_TORCH); 
         cam.setParameters(p); 
        } else { 
         p.setFlashMode(Parameters.FLASH_MODE_OFF); 
         cam.setParameters(p); 
        } 

         Thread.sleep(blinkDelay); 

       } 
      }catch (Exception e) { 
       // TODO: handle exception 
       Log.d(tag, "in catch1"); 
       Log.d(tag, e.toString()); 

     } 

回答

0

這可能是因爲它已被使用。

open狀態的Javadoc:如果同樣的相機由其他應用程序打開

,這將拋出一個RuntimeException。

當您使用相機完成後,您必須調用release(),否則它將保持鎖定狀態並且對其他應用程序不可用。

您的應用程序應該一次只能爲特定的硬件攝像機啓用一個Camera對象。

確保您總是釋放相機(即使在例外的情況下,使用finally)並檢查是否沒有其他應用程序正在使用它。

+0

由於它的工作... –

+0

能否請您過目這個問題我的... http://stackoverflow.com/q/22485031/3409600 –

0

這來自android docs here。只要你記得在完成之後釋放相機(至少在你嘗試獲得新實例之前),你應該沒問題。我建議閱讀該文檔的其餘部分。這非常有幫助。

private boolean safeCameraOpen(int id){ boolean qOpened = false;

try { 
    releaseCameraAndPreview(); 
    mCamera = Camera.open(id); 
    qOpened = (mCamera != null); 
} catch (Exception e) { 
    Log.e(getString(R.string.app_name), "failed to open Camera"); 
    e.printStackTrace(); 
} 

    return qOpened;  
} 

private void releaseCameraAndPreview() { 
    mPreview.setCamera(null); 
    if (mCamera != null) { 
     mCamera.release(); 
     mCamera = null; 
    } 
} 
+0

好,我試試這個.. –

+0

謝謝你太... –

+0

它工作?你爲什麼接受我的答案! – Rarw

相關問題