调用release()方法后无法使用Android相机进行恢复的异常。

10 浏览
0 Comments

调用release()方法后无法使用Android相机进行恢复的异常。

在开发相机应用时,我遇到了一个异常,只有当我切换到其他应用程序(我的应用程序的onPause()方法)时才会出现。

我进行了一些研究,发现我需要添加以下代码作为Android相机堆栈的解决方法:mCamera.setPreviewCallback(null);

我的onPause()方法现在看起来像这样:

@Override
protected void onPause() {
    super.onPause();
    try
    {    
        // 在暂停事件发生时立即释放相机   
        //releaseCamera();
         mCamera.stopPreview(); 
         mCamera.setPreviewCallback(null);
         mCamera.release();
         mCamera = null;
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
}

我的onResume()方法:

@Override
protected void onResume()
{
    super.onResume();
    try
    {
        mCamera.setPreviewCallback(null);
        mCamera = getCameraInstance();
        //mCamera.setPreviewCallback(null);
        mPreview = new CameraPreview(Imageupload.this, mCamera);//设置预览
        preview.addView(mPreview);
    } catch (Exception e){
        Log.d(TAG, "Error starting camera preview: " + e.getMessage());
    }
}   
}

最后是我的getCameraInstance()方法:

public Camera getCameraInstance(){
    Camera camera = null;
    try {
        camera = Camera.open(); // 尝试获取相机实例
    }
    catch (Exception e){
        // 相机不可用(正在使用或不存在)
    }
    Camera.Parameters parameters = camera.getParameters();
    // 根据设备屏幕设置预览大小
    parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
    // 根据设备屏幕设置图片大小
    parameters.setPictureSize(mPictureSize.width, mPictureSize.height);
    // 设置输出相机模式
    parameters.setPictureFormat(PixelFormat.JPEG);
    // 设置焦点模式
    parameters.setFocusMode(FOCUS_MODE_AUTO);
    // 设置闪光灯模式
    parameters.setFlashMode("auto");
    // 获取相机支持的最大和最小FPS
    List fps = parameters.getSupportedPreviewFpsRange();
    // 设置相机FPS
    parameters.setPreviewFpsRange(fps.get(fps.size()-1)[1], fps.get(fps.size()-1)[1]);
    // 设置相机参数
    camera.setParameters(parameters);
    Toast.makeText(getApplicationContext(), "Your device are capable of previewing @" + fps.get(fps.size()-1)[1]/1000+"fps!",Toast.LENGTH_SHORT).show();
    return camera; // 如果相机不可用,则返回null
}

对于如何解决这个问题,有什么想法吗?

0