欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

android开发中自定义拍照功能实现方法

程序员文章站 2022-07-06 11:10:27
android中的拍照有两种,一种是调用的拍照,一种是自定义的拍照。如果系统的拍照无法满足项目的需求,这个时候就需要用到自定义的拍照。android中给我们的自定义拍照提供了一些api,最主要用到的...

android中的拍照有两种,一种是调用的拍照,一种是自定义的拍照。如果系统的拍照无法满足项目的需求,这个时候就需要用到自定义的拍照。android中给我们的自定义拍照提供了一些api,最主要用到的就是surfaceview,首先就是在布局中指定根布局为surfaceview,然后在代码中findviewid()初始化,这些都很简单,接下来我把我写的主要代码给贴出来,如下:

//1 打开(照相机)
        mcamera = camera.open(0);
        //给surfaceview设置监听器
        msurfaceview.getholder().addcallback(new surfaceholder.callback() {
            @override
            public void surfacecreated(surfaceholder holder) {
                //给照相机设置参数
                camera.parameters parameters = mcamera.getparameters();
                //设置每秒3栈
                parameters.setpreviewframerate(3);
                //设置手机的预览方向
                mcamera.setdisplayorientation(90);
                //设置照片的格式
                parameters.setpreviewformat(pixelformat.jpeg);
                //设置照片的质量
                parameters.set("jpeg-quality", 100);
                parameters.setfocusmode(camera.parameters.focus_mode_continuous_picture);
//                mcamera.setparameters(parameters);这个容易出错,不设置也行,主要用来设置拍照界面尺寸的
                //将画面展示到surfaceview
                try {
                    mcamera.setpreviewdisplay(holder);
                    //开启预览
                    mcamera.startpreview();
                } catch (ioexception e) {
                    e.printstacktrace();
                }
            }

            @override
            public void surfacechanged(surfaceholder holder, int format, int width, int height) {

            }

            @override
            public void surfacedestroyed(surfaceholder holder) {

            }
        });

基本上这样就可以打开拍照的页面了,但是也不要忘了释放一下:

@override
public void onpause() {
    super.onpause();
    if (mcamera != null) {
        mcamera.stoppreview();
        mcamera.release();
    }
}

至于拍完照片需要存储也很简单,如下:

mcamera.takepicture(null, null, new camera.picturecallback() {

    private fileoutputstream mfos;

    @override
    public void onpicturetaken(byte[] data, camera camera) {
        bitmap bitmap = bitmapfactory.decodebytearray(data, 0, data.length);
        string path = environment.getexternalstoragepublicdirectory(environment.directory_dcim) + file.separator + "test";
        file file = new file(path);
        if (!file.exists()) {//文件不存在就创建
            file.mkdir();
        }
        string picpath = file + file.separator + system.currenttimemillis() + ".jpg";
        file pic = new file(picpath);
        try {
            mfos = new fileoutputstream(pic);
            //压缩
            matrix matrix = new matrix();
            //旋转90,拍完照的图片保存之后会自动旋转90度,在这里把图片给转回去去
            matrix.postrotate(90);
            // 创建新的图片
            bitmap resizedbitmap = bitmap.createbitmap(bitmap, 0, 0,
                    bitmap.getwidth(), bitmap.getheight(), matrix, true);
            resizedbitmap.compress(bitmap.compressformat.jpeg, 85, mfos);
            tvphotofinish.setvisibility(view.visible);
            toastutil.showtoast(getcontext(), "拍照成功");
            canshooting = true;
            camera.stoppreview();
            camera.startpreview();
        } catch (filenotfoundexception e) {
            e.printstacktrace();
        }
        try {
            mfos.close();
        } catch (ioexception e) {
            e.printstacktrace();
        }

    }
});

当然了,还要动态添加权限,这个有很多就不多说了,主要是以下这一个权限






代码上的注释已经很详细了,就不再做过多的说明了。