2014-03-13 87 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

相关问题