美文网首页
Camera 相机实践(基于UTS组件插件)

Camera 相机实践(基于UTS组件插件)

作者: 空腹无才 | 来源:发表于2023-12-21 14:58 被阅读0次

    一、SurfaceView容器

    碰到的问题:无法基于容器的镜像翻转

    1.1、创建容器对象(index.vue 文件中)

    NVLoad() : LinearLayout {
        //必须实现(必须创建一个容器)
        let contentLayout = new LinearLayout(this.$androidContext);
        contentLayout.setOrientation(LinearLayout.VERTICAL);
    
        // 创建按钮对象
        this.getCamera().forEach((button) => {
            contentLayout.addView(button as Button);
        })
        
        // 创建surfaceView容器
        surfaceView = new SurfaceView(this.$androidContext);
        let layoutParams = ViewGroup.LayoutParams(
            500,
            600
        )
        
        contentLayout.addView(textureView, layoutParams)
        
        return contentLayout;
    }
    
    
    methods: {
        getCamera() : Button[] {
            const numberOfCameras = Camera.getNumberOfCameras(); // 获取摄像头个数
            const cameraList : Button[] = [];
            for (let i = 0; i < numberOfCameras; i++) { // 从创建对应的按钮
                let button = new Button(this.$androidContext)
                button.setText(`摄像头${i}`);
                button.setTag("centerButton");
                button.setOnClickListener(new ButtonClickListsner(i));
                cameraList.push(button);
            };
            
            return cameraList;
        }
    }
    

    1.2、创建点击事件

    class ButtonClickListsner extends View.OnClickListener {
            cameraId = 0
            constructor(id : number) {
                super();
                this.cameraId = id;
            }
            override onClick(v ?: View) {
                console.log(this.cameraId)
                openCamera(this.cameraId)
            }
    }
    

    1.3、打开对应摄像头

    
    function openCamera(id: any) {
        if (camera !== null) {
            (camera as Camera).stopPreview();
            (camera as Camera).release();  // 释放摄像头
            camera = null;
        }
        
        try {
            camera = Camera.open(id as Int);
            (camera as Camera).setPreviewDisplay((surfaceView as SurfaceView).getHolder());
            (camera as Camera).setDisplayOrientation(0); // 设置旋转角度 0 90 180 270
            (camera as Camera).startPreview(); // 启动预览
        } catch (e) {
                console.error(e)
        }
    }
    
    

    1.4、完整代码

    <template>
        <view class="defaultStyle"></view>
    </template>
    
    <script lang="uts">
        import View from 'android.view.View'
        import Button from 'android.widget.Button'
        import LinearLayout from 'android.widget.LinearLayout';
        import Camera from "android.hardware.Camera";
        import SurfaceView from 'android.view.SurfaceView';
        import ViewGroup from "android.view.ViewGroup";
        import Surface from "android.view.Surface";
        
        let surfaceView : SurfaceView | null = null;
        let camera : Camera | null = null;
        
        class ButtonClickListsner extends View.OnClickListener {
            cameraId = 0
            constructor(id : number) {
                super();
                this.cameraId = id;
            }
            override onClick(v ?: View) {
                console.log(this.cameraId)
                openCamera(this.cameraId)
            }
        }
        
        function openCamera(id: any) {
            if (camera !== null) {
                (camera as Camera).stopPreview();
                (camera as Camera).release();  // 释放摄像头
                camera = null;
            }
        
            try {
                camera = Camera.open(id as Int);
                (camera as Camera).setPreviewDisplay((surfaceView as SurfaceView).getHolder());
                (camera as Camera).setDisplayOrientation(0); // 设置旋转角度 0 90 180 270
                (camera as Camera).startPreview(); // 启动预览
            } catch (e) {
                console.error(e)
            }
        }
        
        export default {
            name: "camera-temps1",
            data() {
                return {}
            },
            
            NVLoad() : LinearLayout {
                //必须实现(必须创建一个容器)
                let contentLayout = new LinearLayout(this.$androidContext);
                contentLayout.setOrientation(LinearLayout.VERTICAL);
    
                // 创建按钮对象
                this.getCamera().forEach((button) => {
                    contentLayout.addView(button as Button);
                })
        
                // 创建surfaceView容器
                surfaceView = new SurfaceView(this.$androidContext);
                let layoutParams = ViewGroup.LayoutParams(
                    500,
                    600
                )
        
                contentLayout.addView(textureView, layoutParams)
        
                return contentLayout;
            },
            
            methods: {
                getCamera() : Button[] {
                    const numberOfCameras = Camera.getNumberOfCameras(); // 获取摄像头个数
                    const cameraList : Button[] = [];
                    for (let i = 0; i < numberOfCameras; i++) { // 从创建对应的按钮
                        let button = new Button(this.$androidContext)
                        button.setText(`摄像头${i}`);
                        button.setTag("centerButton");
                        button.setOnClickListener(new ButtonClickListsner(i));
                        cameraList.push(button);
                    };
            
                    return cameraList;
                }
            }
        }
    }
    </script>
    

    二、TextureView(容器)

    <template>
        <view class="defaultStyle">
    
        </view>
    </template>
    <script lang="uts">
        import View from 'android.view.View'
        import Button from 'android.widget.Button'
        import LinearLayout from 'android.widget.LinearLayout';
        import Camera from "android.hardware.Camera";
        import SurfaceView from 'android.view.SurfaceView';
        import ViewGroup from "android.view.ViewGroup";
        import TextureView from "android.view.TextureView";
    
    
        let camera : Camera | null = null;
        let textureView : TextureView | null = null;
    
        class PreviewCallback extends Camera.PreviewCallback {
            constructor() { super() }
            override onPreviewFrame(data : ByteArray, camera : Camera) {
                console.log(data)
            }
        }
    
        class ButtonClickListsner extends View.OnClickListener {
            cameraId = 0
            constructor(id : number) {
                super();
                this.cameraId = id;
            }
            override onClick(v ?: View) {
                console.log(this.cameraId)
                openCamera(this.cameraId)
            }
        }
    
    
        function openCamera(id : any) {
            if (camera !== null) {
                (camera as Camera).stopPreview();
                (camera as Camera).release();
                camera = null;
            }
    
            try {
            
                camera = Camera.open(id as Int);    
                // 设置镜像
                (textureView as TextureView).setRotationY((180 as Number).toFloat());
                (camera as Camera).setPreviewTexture((textureView as TextureView).getSurfaceTexture());
                // 设置旋转方向   
                (camera as Camera).setDisplayOrientation(0);
                (camera as Camera).startPreview();  
            } catch (e) {
                console.error(e)
            }
        }
    
    
    
    
        export default {
            name: "camera-temps1",
            data() {
                return {}
            },
            NVLoad() : LinearLayout {
                //必须实现  
                let contentLayout = new LinearLayout(this.$androidContext);
                contentLayout.setOrientation(LinearLayout.VERTICAL);
                
                // 添加按钮
                this.getCamera().forEach((button) => {
                    contentLayout.addView(button as Button);
                })
                
                // TextureView 中this.$androidContext 必须加 !号
                textureView = new TextureView(this.$androidContext!);
                
                let layoutParams = ViewGroup.LayoutParams(
                    500,
                    600
                );
                contentLayout.addView(textureView, layoutParams);
                
                return contentLayout;
            },
    
            methods: {          
                getCamera() : Button[] {
                    const numberOfCameras = Camera.getNumberOfCameras();
                    const cameraList : Button[] = [];
                    for (let i = 0; i < numberOfCameras; i++) {
                        let button = new Button(this.$androidContext)
                        button.setText(`摄像头${i}`);
                        button.setTag("centerButton");
                        button.setOnClickListener(new ButtonClickListsner(i))
                        cameraList.push(button)
                    }
                    
                    return cameraList;
                }
            }
        }
    </script>
    
    <style>
        .defaultStyle {
            width: 750rpx;
            height: 240rpx;
            background-color: red;
        }
    </style>
    

    三、权限请求(index.uts)

    import Manifest from "android.Manifest";
    import Surface from "android.view.Surface";
    import Camera from "android.hardware.Camera";
    export function getquanxian() { 
        let permissionNeed = [Manifest.permission.CAMERA];
    
        UTSAndroid.requestSystemPermission(UTSAndroid.getUniActivity()!, permissionNeed, function (allRight : boolean, _ : string[]) {
            console.log("用户同意了权限", allRight)
        }, function (_ : boolean, _ : string[]) {
            console.log("用户拒绝了部分权限:")
        })
    
    }
    
    

    相关文章

      网友评论

          本文标题:Camera 相机实践(基于UTS组件插件)

          本文链接:https://www.haomeiwen.com/subject/jxffndtx.html