当前位置:首页 > 谈天说地 > 正文内容

Android实现极简打开摄像头

34资源网2022年03月29日 11:51311

很多时候忘记android摄像头如何打开,查看google文档的话,发现太复杂(只是单纯的想打开摄像头而已,不想添加那么多设置,添加那么功能),很多博客也是对官方文档的小修小改,连方法名都一样,因此,我决定完成android相机最简单的打开摄像头(仅仅打开)。很久没用忘掉的话,打开链接复制粘贴一下就完事了。

androidmanifest.xml设置camera权限后,在代码中还要设置权限检查,但是因为我连权限检查都懒得加了,装好后直接在手机系统里手动允许权限。

camera1(已废弃):

xml中使用surfaceview作为预览view

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.constraintlayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".mainactivity">

    <surfaceview
        android:id="@+id/surfaceview"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintbottom_tobottomof="parent"
        app:layout_constraintleft_toleftof="parent"
        app:layout_constraintright_torightof="parent"
        app:layout_constrainttop_totopof="parent" />

</androidx.constraintlayout.widget.constraintlayout>

mainactivity:

public class mainactivity extends appcompatactivity implements surfaceholder.callback{

    private surfaceholder holder;
    private camera camera;

    @override
    protected void oncreate(bundle savedinstancestate) {
        super.oncreate(savedinstancestate);
        requestwindowfeature(window.feature_no_title);
        getwindow().setflags(windowmanager.layoutparams.flag_fullscreen,
                windowmanager.layoutparams.flag_fullscreen);
        setcontentview(r.layout.activity_main);
        surfaceview surfaceview = findviewbyid(r.id.surfaceview);
        holder = surfaceview.getholder();
        holder.addcallback(this);
    }

    @override
    public void surfacecreated(surfaceholder holder) {
        if(camera == null){
            try {
                camera = camera.open(camera.camerainfo.camera_facing_back);
                camera.setpreviewdisplay(holder);
                camera.startpreview();
                camera.parameters parameters = camera.getparameters();
                parameters.setfocusmode(camera.parameters.focus_mode_auto);
                parameters.setflashmode(camera.parameters.flash_mode_auto);
                camera.setparameters(parameters);
                camera.setdisplayorientation(90);
            }catch (exception e){
                e.printstacktrace();
            }
        }
    }
}

这样就完成了最简单的打开摄像头并在手机中出现画面。(代码里去掉2个接口中未实现的方法)

camera2

android 5.0(api 21)以后,谷歌就决定废弃原有的camera api改用camera2 api,因为功能更强大

xml使用textureview作为预览(其实surfaceview也行,官方的demo是用textureview的一个子类):

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.constraintlayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".mainactivity">

    <textureview
        android:id="@+id/surfaceview"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintbottom_tobottomof="parent"
        app:layout_constraintleft_toleftof="parent"
        app:layout_constraintright_torightof="parent"
        app:layout_constrainttop_totopof="parent" />

</androidx.constraintlayout.widget.constraintlayout>

mainactivity:

public class mainactivity extends appcompatactivity implements textureview.surfacetexturelistener {

    private textureview textureview;

    private capturerequest.builder builder;

    @override
    protected void oncreate(bundle savedinstancestate) {
        super.oncreate(savedinstancestate);
        setcontentview(r.layout.activity_main);
        textureview = findviewbyid(r.id.surfaceview);
        textureview.setsurfacetexturelistener(this);
    }

    @override
    public void onsurfacetextureavailable(final surfacetexture surface, int width, int height) {
        cameramanager manager = (cameramanager) getsystemservice(camera_service);
        if (activitycompat.checkselfpermission(mainactivity.this, manifest.permission.camera)
                != packagemanager.permission_granted) {
            return;
        }
        try {
            manager.opencamera("0", new cameradevice.statecallback() {
                @override
                public void onopened(@nonnull cameradevice camera) {
                    try {
                    surfacetexture surfacetexture = textureview.getsurfacetexture();
                    surfacetexture.setdefaultbuffersize(1440,1080);
                    surface surface = new surface(surfacetexture);
                    builder = camera.createcapturerequest(cameradevice.template_preview);
                    builder.addtarget(surface);

                    camera.createcapturesession(arrays.aslist(surface),
                            new cameracapturesession.statecallback() {
                        @override
                        public void onconfigured(@nonnull cameracapturesession session) {
                            try {
                                session.setrepeatingrequest(builder.build(), null, null);
                            } catch (cameraaccessexception e) {
                                e.printstacktrace();
                            }
                        }

                        @override
                        public void onconfigurefailed(@nonnull cameracapturesession session) {

                        }
                    }, null);
                    } catch (cameraaccessexception e) {
                        e.printstacktrace();
                    }
                }

                @override
                public void ondisconnected(@nonnull cameradevice camera) {

                }

                @override
                public void onerror(@nonnull cameradevice camera, int error) {

                }
            }, null);
        } catch (cameraaccessexception e) {
            e.printstacktrace();
        }
    }
}

这样就成功使用camera2的api打开并预览了(代码里去掉3个接口中未实现的方法)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持萬仟网。

看完文章,还可以用支付宝扫描下面的二维码领取一个支付宝红包,目前可领1-88元不等

支付宝红包二维码

除了扫码可以领取之外,大家还可以(复制 720087999 打开✔支付宝✔去搜索, h`o`n.g.包哪里来,动动手指就能领)。

看下图所示是好多参与这次活动领取红包的朋友:

支付宝红包

扫描二维码推送至手机访问。

版权声明:本文由34楼发布,如需转载请注明出处。

本文链接:https://www.34l.com/post/11232.html

分享给朋友:

相关文章

年轻人不讲武德和耗子尾汁什么意思?什么梗?
年轻人不讲武德和耗子尾汁什么意思?什么梗?

最近经常在朋友圈,抖音上面刷到一些视频评论说年轻人不讲5的和耗子尾汁,小编看着感觉好奇怪,刚开始有点懵逼,结果去网上查了一下才知道,这是太极大师马保国老师讲的。究竟这个梗是怎么来的呢?其实,刚开始人家只是取笑这个马保国大师的梗,后面没有想到...

现在小县城做什么创业比较好?
现在小县城做什么创业比较好?

目前在小县城做什么赚钱创业比较好呢?我相信大家都在想这个问题吧?其实小县城是一个不错的经济市场,主要看你做什么项目创业了。下面小编收集了几个项目,希望大家喜欢。第一个:花式气球一张个性的遮阳伞,一个带七彩假发的小丑,一张桌子,一个架子,一堆...

抖音传话筒项目(傻瓜式复制粘贴轻松月入3000+)
抖音传话筒项目(傻瓜式复制粘贴轻松月入3000+)

可能你觉得你写不出优秀的文案,可能你觉得你没办法配音,可能你觉得不好意思露脸,但又想通过抖音来赚钱,那么今天给大家来说说这个抖音传话筒项目,只需要复制粘贴,一个月轻松赚到3000+,无需露脸配音,更加不需要写文案。上图是我通过抖音搜索“传话...

短视频文案素材哪里找(上热门的短视频素材)
短视频文案素材哪里找(上热门的短视频素材)

抖音怎么写文案?整理了100条抖音抖音爆款文案,直接套用就能火不看后悔系列!!!抖音上爆火的文案。情感、励志、共鸣、实用、反转、提问等6大类型不管你是拍摄什么类型视频 ,都可以直接套用。不多说直接上干货!!!一定要看到最后!!!01—励志类...

mac地址的作用是什么(理解mac地址的作用实验报告)
mac地址的作用是什么(理解mac地址的作用实验报告)

我们上网时会发现电子设备同时有IP地址和MAC地址,为什么上网会需要两个地址呢?我们需要先搞清这两个概念,IP地址即逻辑地址,可以简单理解为我们收快递时的收货地址,它通常是这个样子。MAC地址即物理地址,用来唯一地标识网络设备,用于本地网络...

华为小米革了康佳长虹们的命,海信怎么办?
华为小米革了康佳长虹们的命,海信怎么办?

编者按:本文来自陆玖财经,创业邦经授权发布。 电视行业真正需要面对的不是“大屏好还是小屏好”,用激光、OLED还是Mini LED之类的技术路线之争,而是一旦被视为“智能终端”,从产品形态到竞争模式的翻天覆地。 近日,海信子品牌Vidd...