在没有Surface View的情况下使用Android相机

10

我正在开发Android应用,想要使用相机进行一些操作(处理像素值),但只想在后台进行,不想使用Surface View。是否有可能只使用缓冲区读取像素值并进行处理呢? 感谢所有能够帮助我的人。

2个回答

6

从API级别11开始,新增了SurfaceTexture。通过它,不再需要使用SurfaceView。我在我的三星Galaxy S3 Neo上测试了以下代码。

mCamera = Camera.open();
try {
    mCamera.setPreviewTexture(new SurfaceTexture(10));
} catch (IOException e1) {
    Log.e(Version.APP_ID, e1.getMessage());
}

Parameters params = mCamera.getParameters();
params.setPreviewSize(640, 480);
params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
params.setPictureFormat(ImageFormat.JPEG);
mCamera.setParameters(params);
mCamera.startPreview();
mCamera.takePicture(null, null, null, new PictureCallback() {
    @Override
    public void onPictureTaken(byte[] data, Camera camera) {
        Log.i(Version.APP_ID, "picture-taken");
    }
});

2
new SurfaceTexture(10) 中的 10 是什么?我们可以使用任何数字吗?这个 10 有什么特殊之处吗?您是否像文档中所述那样使用该 ID 生成了纹理?相比使用 SurfaceView,这种方法更好吗? - Trigary

4

我已经寻找这个答案有一段时间了。我在那里找到了它,并为方便复制了过来。

http://handycodeworks.com/?p=19

基本上,我们只需要创建一个虚拟SurfaceView(即使在Service中也可以工作),并将其用于相机功能。

SurfaceView view = new SurfaceView(this);
c.setPreviewDisplay(view.getHolder());
c.startPreview();
c.takePicture(shutterCallback, rawPictureCallback, jpegPictureCallback);

1
这适用于哪些设备?我测试过使用此代码的所有设备都会出现“E/CameraHAL(132):配置旋转时出错”的错误。 - xbakesx
测试过的设备:Galaxy i5800(2.2),HTC Wildfire(2.1?)- 这是一段时间以前的事情 :) - qdot
我进行了更多的研究,显然三星对此非常严格,而我的测试设备都是三星的... - xbakesx
它绝对仍然适用于三星Galaxy i5800——我刚测试了一个需要使用此功能的特殊应用程序。 - qdot
1
哦,那很酷。我读到的笔记说三星通常是瓶颈。我的Galaxy Nexus无法处理它。Android分段失败。 - xbakesx

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