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

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