我该怎么办才能让相机每次都能正常工作?

时间:2014-03-13 16:18:44

标签: android android-camera

我在我的应用程序中使用相机服务。有时相机服务在应用程序中运行良好,有时会产生运行时异常。

我已将Camera.Open()放入try块中,我已捕获异常及其在log cat中的显示

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());

        }

2 个答案:

答案 0 :(得分:0)

可能是因为它已经被使用了。

open状态的javadoc:

  

如果其他应用程序打开了同一个摄像头,则会抛出RuntimeException。

     

使用相机后必须调用release(),否则它将保持锁定状态并且对其他应用程序不可用。

     

您的应用程序一次只能为一个特定的硬件摄像头激活一个Camera对象。

确保始终释放相机(即使出现异常,请使用finally)并检查是否没有其他应用程序使用它。

答案 1 :(得分: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;
    }
}