【问题标题】:Android app camera preview stopped working (using deprecated `setType` method)Android 应用相机预览停止工作(使用已弃用的 `setType` 方法)
【发布时间】:2023-03-08 10:03:01
【问题描述】:

我有一个相机应用程序,它有一个有效的相机预览。该应用程序是几年前(2012 年)开发的,我决定重用其部分代码,但是,再次测试(在相同的硬件 i9100,不同的 OS 4.4 和 3.0 上)后,我的相机预览图像有问题

当我移动手机时,我看到图像发生变化,并且它会响应明暗模式(因此应用程序正在与相机通信)。

这是我的代码(它使用了已弃用的方法setType):

class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
private static final String TAG = "TGCamera";

SurfaceHolder mHolder;
public Camera camera;
public final String fileName = "/download/CameraGPS/zdelTempPhotoPreview.jpg";

CameraPreview(Context context) {
    super(context);
    // Install a SurfaceHolder.Callback so we get notified when the
    // underlying surface is created and destroyed.
    mHolder = getHolder();
    mHolder.addCallback(this);
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}

public void surfaceCreated(SurfaceHolder holder) {
    // The Surface has been created, acquire the camera and tell it where
    // to draw.
    camera = Camera.open();
    Parameters parameter02 = camera.getParameters();
    parameter02.setJpegThumbnailSize(80, 60);
    parameter02.setPictureSize(640, 480);
    camera.setParameters(parameter02);
    try {
        camera.setPreviewDisplay(holder);
        camera.setDisplayOrientation(90);
        Parameters parameters00 = camera.getParameters();
        //parameters00.setRotation(90);
        //parameters00.setFlashMode("on");
        //parameters00.setJpegQuality(20);
        camera.setParameters(parameters00);

        camera.setPreviewCallback(new PreviewCallback() {

            public void onPreviewFrame(byte[] data, Camera arg1) {
                CameraPreview.this.invalidate();
            }
        });
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public void surfaceDestroyed(SurfaceHolder holder) {
    // Surface will be destroyed when we return, so stop the preview.
    // Because the CameraDevice object is not a shared resource, it's very
    // important to release it when the activity is paused.
    camera.stopPreview();
    camera = null;
}

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
    // Now that the size is known, set up the camera parameters and begin
    // the preview.

    //camera.getParameters().setRotation();
    //camera.getParameters().setJpegQuality(20);
    //camera.getParameters().setPictureSize(width, height)

    Parameters parameters = camera.getParameters();
    parameters.setPreviewSize(w, h);
    camera.setParameters(parameters);
    camera.startPreview();
}

@Override
public void draw(Canvas canvas) {
    super.draw(canvas);

    Log.w(TAG,"clicked in preview");
    Paint p = new Paint(Color.RED);
    Log.d(TAG, "draw");
    canvas.drawText("PREVIEW", canvas.getWidth() / 2,
            canvas.getHeight() / 2, p);
}

有什么建议吗?

【问题讨论】:

  • 您不能将图片大小和预览大小设置为任意值。确保分别检查 getSupportedPictureSizes() 和 getSupportedPreviewSizes() 返回的列表。通常(我不记得这是否适用于三星 Galaxy S2),当图片的纵横比与预览的纵横比不同时,相机无法正常工作。此外,您不应该在预览表面上绘图,而且绝对不能从 onPreviewFrame() 回调中绘图。
  • 请提供答案。你搞定了@AlexCohn!

标签: android android-camera


【解决方案1】:

您不能将图片大小和预览大小设置为任意值。确保分别检查 getSupportedPictureSizes() 和 getSupportedPreviewSizes() 返回的列表。

通常(我不记得这是否适用于三星 Galaxy S2),当图片的纵横比与预览的纵横比不同时,相机无法正常工作。

此外,您不应该在预览表面上绘图,而且绝对不能从 onPreviewFrame() 回调中进行。

【讨论】:

  • 删除了onDraw 和所有对图片大小的引用,它可以正常工作。 TKS!
【解决方案2】:

首先要在你的surfaceChanged() 方法中添加camera.setPreviewDisplay(holder)

更新: 请在surfaceCreatedsurfaceChanged 中调试holder.getSurface() != null 此外,您应该在surfaceDestroyed 中添加camera.release(),然后全新安装应用程序(先卸载然后全新安装应用程序)。自上次运行应用程序后,相机服务可能会挂起。

更新 2: 我刚刚注意到您错过了从 SurfaceHolder 和 surfaceChanged() 方法传递的 surfaceCreated() 注册回调。在这种情况下,surfaceChanged() 永远不会被调用,这意味着 startPreview() 永远不会被实际调用..

surfaceCreatedsurfaceChanged 方法中,请更新代码以包含:

    mHolder.removeCallback(this); // unregister from old SurfaceHolder
    holder.addCallback(this); // register to new holder
    try {
        camera.setPreviewDisplay(holder);
    } catch (IOException e) {
        e.printStackTrace();
    }
    mHolder = holder;

【讨论】:

  • 很遗憾,丝毫没有影响结果。 tks 4 的努力,虽然。可能解决别人的问题。 :)
  • 我已经更新了更多的想法,希望它有助于更​​接近根本原因
  • tks 再次。是的,无论如何,释放相机都是一个问题。仍在试图找到根本问题。会尽快回复你。赞成!
  • 还是没有运气。尝试不同的方法:将刮擦这段代码并从下往上开始。
  • 实际上,按照 AlexCohn 的建议解决了问题。幸运的是,无需重写所有内容。
猜你喜欢
  • 1970-01-01
  • 2015-03-19
  • 1970-01-01
  • 2014-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多