camera 预览卡死解决。对讲机干扰引起,需hardware与app一起调试


    Runnable scanPreviewDataThread = new Runnable() {
        @Override
        public void run() {
            if ("true".equalsIgnoreCase(SystemProperties.get("persist.sys.meigepr.died"))){
                    reOpenCamera();
            } else if ("true".equalsIgnoreCase(SystemProperties.get("persist.sys.meigevi.died"))){
                if (mFirstInterferenceStopRecord){
                    mHandler.sendEmptyMessage(MSG_STOP_RECORD_INTERFERENCE);
                    mFirstInterferenceStopRecord = false;
                }
                reOpenCamera();        
            }else{
                mHandler.postDelayed(scanPreviewDataThread,scanPreviewDataThreadTime);
            }
        }    
    };

    public boolean reOpenCamera(){
        releaceCamera();
        mHardWareCamera = new HardWareCamera(this);
        mHardWareCamera.openCamera(mCameraID);
        initParameters();
        if (mHardWareCamera.getCamera() == null) {
            mHandler.postDelayed(scanPreviewDataThread,2000);
            return false;
        }
        mHardWareCamera.reStartPreview();
        if(mSecondStreamStart) {
            mHardWareCamera.addCallbackBuffer(mVideoCallbackBuffer);
            mHardWareCamera.setPreviewCallbackWithBuffer(mCameraPreviewCallBack);
            startSecondStrem();
        }
        mHandler.postDelayed(scanPreviewDataThread,scanPreviewDataThreadTime);
        return true;
    }

    public Camera openCamera(int cameraID) {
        try {
            Method openMethod =
                    Class.forName("android.hardware.Camera").getMethod("openLegacy", int.class,
                            int.class);
            mCamera = (Camera) openMethod.invoke(null, cameraID,
                    CAMERA_HAL_API_VERSION_1_0);
        } catch (Exception e) {
        }
        if (mHardWareCameraDone != null) {
            mHardWareCameraDone.cameraHasOpened();
        }
        return mCamera;
    }    

public interface HardWareCameraDone {
        public void cameraHasOpened();
    }

    public void reStartPreview() {
        mHandler.sendEmptyMessage(RE_START_PREVIEW);
    }

你可能感兴趣的:(android,app)