Android相机表面视图

我正在尝试为摄像机创build一个表面视图,以便在摄像机视图中呈现在表面上。 目前我所能看到的所有相机视图都是黑屏视图。 我曾试图在谷歌和这里看,但迄今为止,我还没有find我在找什么。 任何人都可以build议我一些想法。

Solutions Collecting From Web of "Android相机表面视图"

我已经写了一个类可以帮助你。

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; } } 

在您的清单文件中复制此代码的摄像头权限

 <uses-permission android:name="android.permission.CAMERA"/> 

说明:

SurfaceView是一种包含SurfaceHolder的View。 SurfaceHolder拥有我们可以显示我们的媒体(通常是帧)的表面。

mCamera是一个Camera对象,它将包含相机实例。

当你想保存默认的相机实例,那么你可以简单地调用Camera.open();

相机mCamera = Camera.open();

现在你已经打开相机,或者你有默认的相机实例。 现在您需要从相机捕获帧并将其显示在表面上。 但是你不能没有任何显示

表面。 这里surfaceView提供了surfaceHolder和surfaceHolder提供的表面来显示相机的相框。 现在当表面将被创build三个callback函数将是

调用。

 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是一个callback函数,将在你的表面被创build时被调用。 在这里,你可以打开你的相机并设置其他属性。

surfaceChanged:当你的曲面被创build时,这将被调用至less一次。 之后,只要你的表面会改变,就会被调用(在设备旋转中)。 在这里你可以

开始你的预览,因为你的表面已经创build。

surfaceDestroyed:每当你的表面破坏的时候都会调用它。 现在,如果你没有表面,那么你可以显示你的相机帧,所以我已经释放相机使用

mCamera.release()。 这是非常重要的,因为如果你的活动将暂停和任何其他活动试图打开相机,然后将无法打开它,因为你有

已经打开相机。 相机是共享资源,所以一次只有一个应用程序可以使用它。 所以,每当你打开一个相机,记住一件事,然后总是释放它。

stopPreview:当你开始预览时,你的相机开始捕获你的帧并将其显示在表面上。 现在,如果你的表面已经被破坏,那么你需要停止捕捉帧

从相机,所以你必须调用mCamera.stopPreview。

请确保你添加了权限:

<uses-permission android:name="android.permission.CAMERA"/>

另外这些窗口属性:

 getWindow().setFormat(PixelFormat.TRANSLUCENT); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

发布一些代码,如果这不起作用,以帮助你