我正在尝试为相机创建一个表面 View ,以便无论何时在相机 View 中都可以在表面上渲染。目前,我在相机 View 中所看到的只是一个黑屏 View 。我试图在Google上查找,但到目前为止,我还没有找到想要的内容。任何人都可以建议我一些想法。
最佳答案
我写了一个类可以为您提供帮助。
public class Preview_can_work extends Activity {
private SurfaceView surface_view;
private Camera mCamera;
SurfaceHolder.Callback sh_ob = null;
SurfaceHolder surface_holder = null;
SurfaceHolder.Callback sh_callback = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setFormat(PixelFormat.TRANSLUCENT);
surface_view = new SurfaceView(getApplicationContext());
addContentView(surface_view, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
if (surface_holder == null) {
surface_holder = surface_view.getHolder();
}
sh_callback = my_callback();
surface_holder.addCallback(sh_callback);
}
SurfaceHolder.Callback my_callback() {
SurfaceHolder.Callback ob1 = new SurfaceHolder.Callback() {
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
mCamera = Camera.open();
try {
mCamera.setPreviewDisplay(holder);
} catch (IOException exception) {
mCamera.release();
mCamera = null;
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
mCamera.startPreview();
}
};
return ob1;
}
}
在 list 文件中复制此代码以获取摄像头许可
<uses-permission android:name="android.permission.CAMERA"/>
解释:
SurfaceView是一种包含SurfaceHolder的View。 SurfaceHolder保持可以在其上显示媒体(通常是框架)的表面。
mCamera
是一个Camera对象,它将包含相机实例。如果要保留默认的Camera实例,则只需调用
Camera.open();
Camera mCamera = Camera.open();
现在,您有一个打开的摄像头,或者您具有默认的摄像头实例。现在,您需要从相机捕获帧并将其显示在表面上。但是你不能没有任何显示
surface
。在此,surfaceView
提供surfaceHolder
,而surfaceHolder
提供surface
以显示摄像机帧。现在,当创建surface
时,将有三个回调函数:叫。
1. public void surfaceCreated(SurfaceHolder holder)
2. public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
3. public void surfaceDestroyed(SurfaceHolder holder)
注意:-当您的应用程序暂停时,Surface将被销毁。
surfaceCreated:
surfaceCreated是一个回调函数,将在创建曲面时调用该函数。在这种情况下,您可以打开相机并设置其他属性。surfaceChanged
:创建曲面时,这将至少被称为一次。之后,只要您的表面发生变化(在设备旋转中),它就会被调用。在这里你可以
开始预览,因为曲面已经创建。
surfaceDestroyed
:每当您的表面破坏时,都会调用此方法。现在,如果您没有表面,则可以在其中显示相机框架,因此我已使用释放了相机
mCamera.release()
。这非常重要,因为如果您的 Activity 处于暂停状态,而其他任何 Activity 都试图打开相机,那么它将无法像您一样打开它已经打开相机。相机是一种共享资源,因此只有一个应用程序可以使用它。因此,每当打开相机然后放开相机时,请记住一件事。
stopPreview
:开始预览时,相机将开始捕获帧并将其显示在表面上。现在,如果您的表面已被破坏,则需要停止捕获帧
从相机拍摄,因此您必须调用
mCamera.stopPreview
。