What should i do so that camera work everytime?

只谈情不闲聊 提交于 2019-12-25 18:48:17

问题


I am using camera service in my application. Sometimes the camera service is running fine in the application and sometimes it gives a runtime exception.

I have put Camera.Open() in try block and i have catched the exception and its showing in 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

The code that i done is...

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

        }

回答1:


It's probably because it is already used.

The javadoc for open states :

If the same camera is opened by other applications, this will throw a RuntimeException.

You must call release() when you are done using the camera, otherwise it will remain locked and be unavailable to other applications.

Your application should only have one Camera object active at a time for a particular hardware camera.

Make sure you always release the camera (even in case of exception, use finally) and check if there is no other application using it.




回答2:


This comes from the android docs here. So long as you remember to release the camera when you're done (at at least before you try to get a new instance) you should be fine. I recommend reading the rest of that document as well. It is very helpful.

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;
    }
}


来源:https://stackoverflow.com/questions/22384693/what-should-i-do-so-that-camera-work-everytime

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!