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

Android实现极简打开摄像头

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

很多时候忘记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

分享给朋友:

相关文章

用白面书生造句,看看这七句有哪句适合你?
用白面书生造句,看看这七句有哪句适合你?

1、他是个手无缚鸡之力的白面书生。2、别看他文绉绉的像个白面书生,一上足球场勇猛非凡,踢起球来可狠了。3、那个白面书生经不起严刑拷打,向敌人投降了。4、我一个白面书生,又手无寸铁,怎敢和那几个黑脸大汉较真呢!5、新时代的大学生不是白面书生,...

抹去了怎么造句,分享26句用抹去了造句
抹去了怎么造句,分享26句用抹去了造句

(1) 夜色抹去了最后一缕残阳,夜幕就像剧场里的绒幕,慢慢落下来了。(2) 回忆与现实的区别就是,回忆只留下了静静的画面,而抹去了喧闹的声音。李宫俊 (3) 你的回归喻示着团圆,你的回归代表着喜庆,你的回归抹去了屈辱,你的回归载满...

购买须知模板怎么编辑(淘宝买家须知免费素材)
购买须知模板怎么编辑(淘宝买家须知免费素材)

为了帮助您入门,在您注册 Shopify 帐户时,后台的模版页面中会设置一个默认模版。如果您想为在线商店自定义一个不同的模版,则需要向后台添加一个模版。 您可通过以下几种方式添加模版: 如果您的计算机上的 .zip 文件中已有一个模版...

融资丨「镭昱半导体」获千万美元Pre-A轮融资,全彩Micro-LED微显示芯片助力元宇宙发展
融资丨「镭昱半导体」获千万美元Pre-A轮融资,全彩Micro-LED微显示芯片助力元宇宙发展

创业邦获悉,近日,镭昱半导体(Raysolve)宣布完成千万美元Pre-A轮融资,由高榕资本领投,耀途资本跟投,泰合资本担任独家财务顾问。至此,在短短半年内,镭昱半导体完成两轮融资,累计获得投资近亿元人民币。本轮融资将用于公司的全球首款标...

ab压力测试命令(在线ddos免费测压平台)
ab压力测试命令(在线ddos免费测压平台)

ab 是apache对 http服务器进行压力测试的工具,它可以测试出服务器每秒可以处理多少请求。本文记录mac版本安装 ab 的步骤以及遇到的坑。 下载 进入 apache ab官网 下载页面。 安装 brew 安装 因为笔者的操作系...

豆瓣直播,谁会买单?
豆瓣直播,谁会买单?

图源:摄图网 编者按:本文来自微信公众号连线Insight(ID:lxinsight),作者:张霏,编辑:李信,创业邦经授权转载 被外界视为低调的豆瓣从不缺关注。 昨晚,#豆瓣已暂停小组回复功能#和#国家网信办依法约谈处罚豆瓣网#双双...