我正在尝试为相机创建一个表面视图,以便它在相机视图中时呈现在表面上。目前,我在相机视图上只能看到黑屏视图。我试图在谷歌和这里查看,但到目前为止我还没有找到我要找的东西。任何人都可以建议我一些想法。
2 回答
我写了一个可以帮助你的类。
    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.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(). 这非常重要,因为如果您的活动将暂停并且任何其他活动试图打开相机,那么它将无法像您一样打开它
已经打开相机。相机是一种共享资源,因此一次只有一个应用程序可以使用它。因此,每当您打开相机时,请记住一件事,然后始终释放它。
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);
如果这不起作用,请发布一些代码以帮助您