相机预览的隐形SurfaceView

7
我只需要获取相机预览数据,而不需要可见的预览。因为我在一个服务中进行所有这些操作,所以我必须创建一个虚拟的SurfaceView,这个方法非常有效。
我使用了这个答案中的代码:https://dev59.com/VHE95IYBdhLWcg3wQ7uc#10268650 然而,使用`TYPE_SYSTEM_OVERLAY`时它没有起作用。它是不可见的,但是没有接收到预览数据(在`onPreviewFrame()`中)。当我将此参数更改为0时,我可以获得预览数据,但是`SurfaceView`是可见的。
你知道其他的方法吗?
现在我所做的就是创建一个可见的`SurfaceView`,宽度和高度都为1,然后我创建了一个带有特定颜色的`ImageView`叠加层,这样你就看不到`SurfaceView`颜色的变化。但这样做并不是很好,我真的想找到更好的方法。

请参见 https://dev59.com/VGEh5IYBdhLWcg3wYSvt。 - fadden
2个回答

1
我是一名有用的助手,可以进行文本翻译。
我也使用了相同的Stack Overflow答案,并遇到了相同的问题。因此:
我添加了这段代码。
this.setZOrderOnTop(true);
SurfaceHolder h = this.getHolder();
h.setFormat(PixelFormat.TRANSPARENT);

我将我的surfaceChanged方法添加到程序中,而不是活动(或我的情况下的服务),并使其透明,但日志会抱怨放弃的帧 :(

-1

实际上,您根本不需要将SurfaceView放在UI上。我们遇到了同样的问题,并创建了一个虚拟的SurfaceView。以下是我们的代码:

SurfaceView dummy = new SurfaceView(c);
try {
    mCamera.setPreviewDisplay(dummy.getHolder());
} catch (IOException e) {

}
mCamera.setPreviewCallback(this);
mCamera.startPreview();

2
这也是我想的。在大多数设备上,即使没有预览显示,您的方法也可以正常工作,因此您的方法在这些设备上显然也有效。但是,在某些设备上,例如HTC One X或Google Nexus One,如果没有SurfaceView,则无法使用您的方法。 - DominicM
天啊,感谢您解决了我们的问题。我们没有任何测试设备,所以不知道出了什么问题。非常感激!:D - Zaid Daghestani
我也没有其中之一来测试,但我收到了一些错误报告,所以我发布了一个带有你的方法的更新,并询问他们是否现在可以工作,但仍然没有。通过新的更新,它最终可以工作(使用我的问题中的方法),但我仍然想改进它,因为我认为我的方法真的很糟糕... - DominicM
嗯,我一直在研究它,似乎唯一有效的方法是我们的,但显然只适用于某些设备。我想知道是否有办法在适用该方法的设备上使用它,在不适用该方法的设备上使用另一种方法。 - Zaid Daghestani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接