【问题标题】:What should i do so that camera work everytime?我应该怎么做才能让相机每次都工作?
【发布时间】:2014-03-13 16:18:44
【问题描述】:

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

我已将 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());

        }

【问题讨论】:

    标签: android android-camera


    【解决方案1】:

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

    open 的 javadoc 声明:

    如果同一个相机被其他应用打开,这将抛出一个 RuntimeException。

    您必须在使用完相机后调用 release(),否则相机将保持锁定状态,其他应用程序无法使用。

    对于特定的硬件摄像头,您的应用程序一次应该只有一个处于活动状态的摄像头对象。

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

    【讨论】:

    【解决方案2】:

    这来自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;
        }
    }
    

    【讨论】:

    • 你能看看我的这个问题吗...stackoverflow.com/q/22485031/3409600
    猜你喜欢
    • 1970-01-01
    • 2019-12-10
    • 2021-09-05
    • 1970-01-01
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多