Android相机表面观(Android Camera Surface View)

2019-06-24 05:09发布

我想这样它呈现在表面上,只要是在相机的视图创建相机的表面图。 目前,所有我可以在我的摄像机视图看到的是一个黑色的屏幕视图。 我曾试图寻找谷歌和这里,但到目前为止,我还没有发现什么,我期待的。 任何人都可以建议我一些想法。

Answer 1:

我写了一个类,它可以帮助你。

    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。 SurfaceHolder持有,我们可以展示我们的媒体的面(一般帧)。

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

当你想保持默认的摄像头实例,那么你可以简单地调用Camera.open();

Camera mCamera = Camera.open();

现在你有一个开放的相机,或者您有默认的摄像头实例。 现在,你需要从相机捕获帧,并在表面上显示。 但是你不能没有任何显示它

surface 。 这里的surfaceView提供surfaceHoldersurfaceHolder提供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)

注: - 表面会被破坏,当你的应用程序将继续暂停。

surfaceCreated: surfaceCreated是一个回调函数,当你的面将创建将被调用。 在此,你可以打开你的摄像头,并设置其他属性。

surfaceChanged :这将被称为当你的面,将创建ATLEAST一次。 之后,它会被调用时,您的面将发生变化(在设备旋转)。 在这里,您可以

因为你的表面已经创建启动预览。

surfaceDestroyed :这将被称为每次当你的面会破坏。 现在,如果你没有表面那么在这里你可以显示你的相机帧所以我用相机发布

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

已经打开相机。 相机是一个共享的资源,以便一次只有一个应用程序可以使用它。 所以请记住一两件事,只要你打开相机,然后一直将其释放。

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

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



Answer 2:

使舒尔您添加的权限:

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

发布一些代码,如果不为了帮助您提高工作



文章来源: Android Camera Surface View