当前位置:首页 > 谈天说地

Android实现极简打开摄像头

34资源网2022-03-29486

很多时候忘记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个接口中未实现的方法)

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

看完文章,还可以扫描下面的二维码下载快手极速版领4元红包

快手极速版二维码

快手极速版新人见面礼

除了扫码领红包之外,大家还可以在快手极速版做签到,看视频,做任务,参与抽奖,邀请好友赚钱)。

邀请两个好友奖最高196元,如下图所示:

快手极速版邀请好友奖励

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

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

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

分享给朋友:

相关文章

适合普通人做的小本创业点子

适合普通人做的小本创业点子

适合普通人做的小本创业生意有什么??随着零售行业的兴起,小型超市便利店生意成为创业者首选的项目之一,主要原因在于:投入资金小、回笼快,不需要太大的现金流来支撑、一年半左右就能回本。这对于拥有一部分闲置资金,想创业的投资者来说简直是很好的创业…

手机拍视频软件哪个好用(新手拍好人像摄影技巧)

手机拍视频软件哪个好用(新手拍好人像摄影技巧)

每一个热爱生活的人都关注了“手机摄影技巧”…

飞行汽车是一种应用层创新

飞行汽车是一种应用层创新

编者按:本文来自A轮财经,创业邦经授权发布。 作者|WX 今天在全球范围内,飞行汽车得到了越来越多的关注。 据摩根士丹利研报预计,2030年飞行汽车行业将形成3000亿美元的市场规模。2040年,该行业规模可能将达到1.5万亿美元。 作为新…

李佳琦:三十而已

李佳琦:三十而已

编者按:本文转自何加盐(ID:ihejiayan),作者何加盐,题图@李佳琦 微博,创业邦经授权转载。 李佳琦,生于1992年5月。 这是我迄今为止,写过的最年轻的商业人物。 按年份来算,他还要过27天,才进入30岁;按生日来算,他还要再过…

电脑屏幕变大了怎么还原(电脑屏幕变大的还原方法)

电脑屏幕变大了怎么还原(电脑屏幕变大的还原方法)

电脑桌面的图标莫名其妙变大了,桌面一下子就变的非常不习惯且难看。 这时该怎么解决电脑桌面图标莫名其妙变大的问题呢? 今天就让我们来给大家分享快速恢复桌面图标大小的方法吧。 首先,打开金山毒霸软件;若还未安装可前往官网下载安装。 进入首页的…