ColorEffect在相机预览中不可见

mor*_*ing 5 android android-camera

我正在尝试使用应用了颜色效果的相机预览,例如NEGATIVE效果.没有错误,预览可见而没有问题,但独立于我设置的ColorEffect - 相机预览保持不变.我通过运行params.getSupportedColorEffects()来测试我试图使用的效果是否可用于我的手机(这些效果也适用于内置的照片应用).

我不知道代码有什么问题 - 我在下面发布它.也许这里有人知道什么可以使这项工作?提前致谢.

public class CustomCameraView extends SurfaceView{

Camera mCamera;
SurfaceHolder mHolder;

public CustomCameraView(Context context){
    super(context);
    mHolder = this.getHolder();
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    mHolder.addCallback(mSurfaceHolderListener);
}

SurfaceHolder.Callback mSurfaceHolderListener = new SurfaceHolder.Callback() {
    public void surfaceCreated(SurfaceHolder holder) {
        mCamera=Camera.open();
        try {
            mCamera.setPreviewDisplay(mHolder);
        }
        catch (Exception e){ }
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height)
    {
        Camera.Parameters params = mCamera.getParameters();
        params.setColorEffect(Camera.Parameters.EFFECT_NEGATIVE);
        mCamera.setParameters(params);
        mCamera.startPreview();
    }

    public void surfaceDestroyed(SurfaceHolder arg0)
    {
        mCamera.stopPreview();
        mCamera.release();   
    }
};
}
Run Code Online (Sandbox Code Playgroud)

经过一些测试后发现问题可能与我正在测试的HTC Desire(或者可能是它的操作系统版本)有关.该代码在其他一些三星手机上正常工作.我还没弄清楚HTC会出现什么问题.


更新:我设法让效果起作用,但真的是偶然的,我仍然不明白为什么.但我会在这里给出答案 - 或许有人会觉得它很有用,或者也许能解释为什么会这样:

我在surfaceChanged方法中添加了以下行,因为我试图减小预览的大小:

previewHolder.setFixedSize(width, height-1); 
Run Code Online (Sandbox Code Playgroud)

这具有使所选效果可见的结果.

当我将此行更改为:

previewHolder.setFixedSize(width, height); 
Run Code Online (Sandbox Code Playgroud)

效果再也不见了.太奇怪....它适用于设置高度小于接收高度参数.

Wes*_*ing 1

我也一直在为此苦苦挣扎。我发现 HTC Desire 的相机需要一个奇怪的执行顺序setParameterssetPreviewDisplay才能startPreview使色彩效果发挥作用。顺序是:

Camera.Parameters parameters = camera.getParameters();

//set the parameters

camera.setParameters(parameters);
camera.startPreview();
camera.setParameters(parameters);
camera.setPreviewDisplay(surfaceHolder);
Run Code Online (Sandbox Code Playgroud)

startPreviewAndroid SDK 中记录了before调用setPreviewDisplay作为并行初始化相机和 SurfaceView 的一种方法。

关于您关于意外获得效果的更新,我也发生了同样的事情!我假设出于同样的原因,我的一些代码被快速连续调用两次(在我的例子中,由于数据库对象发生变化)。这导致该方法(重新)设置参数并(重新)启动预览被调用两次,从而产生所需的结果。在意识到这一点并进行更多实验后,上述顺序似乎适用于我的 HTC Desire 和 Acer Iconia A500,我对此非常满意。

然而,我刚刚收到我的应用程序的评论,称它在 HTC Desire HD 上生成损坏的图像,因此我建议不要使用此相机初始化顺序作为默认值,而是作为 HTC Desire 的修复程序。