博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(原创)android中使用相机的两种方式
阅读量:6863 次
发布时间:2019-06-26

本文共 3608 字,大约阅读时间需要 12 分钟。

在社交类应用或扫描二维码的场合都需要用到手机上的摄像头

在程序中启用这一硬件主要有两类方法

1.发送intent启动系统自带的摄像应用

此应用的AndroidManifest中的intent-filter如下

发送intent的代码如下:

     Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");                String path ="storage/sdcard1/picture1.jpg";        File pic =new File(path);        Uri uri=      Uri.fromFile(pic);        //设定拍照后照片保存位置        intent.putExtra(MediaStore.EXTRA_OUTPUT, uri );            startActivity(intent);

2.自己调用API,试用Camera对象来完成拍摄保存

代码如下:

@Override    protected void onResume() {        // TODO Auto-generated method stub        super.onResume();        surfaceView = (SurfaceView) findViewById(R.id.sv);        // 获得预览画面的接收类        SurfaceHolder holder = surfaceView.getHolder();        // 接收类设置callback -->surface创建的时候开启camera开始预览,退出时关闭        // 设置数据来源自渲染引擎, 不使用自己的缓冲区.        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);        camera = Camera.open();        holder.addCallback(new Callback() {            @Override            public void surfaceDestroyed(SurfaceHolder holder) {                // TODO Auto-generated method stub                camera.stopPreview(); // 停止摄像头预览                camera.release();            }            @Override            public void surfaceCreated(SurfaceHolder holder) {                // TODO Auto-generated method stub                // 摄像头的使用                try {                    camera.setPreviewDisplay(holder);                } catch (IOException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }// 设置预览显示                camera.startPreview();// 开始预览            }            @Override            public void surfaceChanged(SurfaceHolder holder, int format,                    int width, int height) {                // TODO Auto-generated method stub            }        });    }    public void click(View v) {        shoot();    }    public void shoot() {        camera.takePicture(null, null, new PictureCallback() {            @Override            public void onPictureTaken(byte[] data, Camera camera) {                // TODO Auto-generated method stub                Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0,                        data.length);                FileOutputStream fos = null;                try {                    fos = new FileOutputStream("sdcard/pic1.jpg");                    boolean isSuccess = bitmap.compress(CompressFormat.JPEG,                            50, fos);                    if (isSuccess) {                        Toast.makeText(MainActivity.this, "拍摄和存储成功", 0).show();                    } else {                        Toast.makeText(MainActivity.this, "拍摄和存储失败", 0).show();                    }                } catch (Exception e) {                    e.printStackTrace();                } finally {                    if (fos != null) {                        try {                            fos.close();                        } catch (IOException e) {                            // TODO Auto-generated catch block                            e.printStackTrace();                        }                    }                }            }        });        Intent intent = new Intent();        intent.setAction(Intent.ACTION_MEDIA_MOUNTED);        intent.setData(Uri.fromFile(new File("/sdcard")));        sendBroadcast(intent);        camera.startPreview();    }

两种方法的对比

前一种方法需要跳出本程序,而且灵活性较低,但是简单易用,代码较少便于使用和维护.

后一种方法虽然比较复杂,但是可以自己定制拍摄activity的样式以及功能选项,并且在本应用中就可以完成拍摄的功能,用处也很多.

转载于:https://www.cnblogs.com/BlogCommunicator/p/4906009.html

你可能感兴趣的文章
急是没有用的
查看>>
AT&T汇编学习笔记(一)
查看>>
IBM专家集成系统讲究预置能力 打造开放的云
查看>>
开源日志系统比较
查看>>
Red hat linux 安装
查看>>
ubuntu samba服务器
查看>>
利用脚本在Virtualbox中部署fuel Openstack
查看>>
Jetty - 嵌入式运行Servlet
查看>>
同一个服务器安装两个tomcat
查看>>
链表的插入排序 Insertion Sort List
查看>>
我的友情链接
查看>>
曹丽丽:与百度互动必听--百度站长平台新动向
查看>>
BUG:由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值...
查看>>
fastDFS安装和使用
查看>>
Linux增加硬盘并挂载到VLM逻辑卷
查看>>
VMware Horizon View 7: Instant Clone Desktop Pool [Part 8]
查看>>
直接使用AD验证SSL ×××用户并且使用AD给用户添加banner
查看>>
学习从晚上十点开始
查看>>
怎样向azkaban贡献代码
查看>>
log4j日志写入redis扩展实现(log4j-redis-appender)
查看>>