android程序设计拍照,Android编程实现拍照功能的2种方法分析

本文实例讲述了Android编程实现拍照功能的2种方法。分享给大家供大家参考,具体如下:

Android系统的照相功能,已实现2种方法,可供大家参考:

1. 调用系统摄像头来拍照

首先,找到AndroidManifest.xml文件里加入用户权限

其次,在主类Java文件里加入2个控件(button和imageview),是用来触发按钮事件和显示图片的,纯是个人爱好final int TAKE_PICTURE = 1;//为了表示返回方法中辨识你的程序打开的相机

关键是这里:

复制代码 代码如下:startActivityForResult(new Intent("android.media.action.IMAGE_CAPTURE"), TAKE_PICTURE);

是打开系统自带相机,以下是处理拍照得到的数据,将数据保存下来protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == TAKE_PICTURE) { if (resultCode == RESULT_OK) { Bitmap bm = (Bitmap) data.getExtras().get("data"); img.setImageBitmap(bm);//想图像显示在ImageView视图上,private ImageView img; File myCaptureFile = new File("sdcard/123456.jpg"); try { BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(myCaptureFile)); /* 采用压缩转档方法 */ bm.compress(Bitmap.CompressFormat.JPEG, 80, bos); /* 调用flush()方法,更新BufferStream */ bos.flush(); /* 结束OutputStream */ bos.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }}

这样就能实现调用系统自带的摄像头了,很简单的操作。

2. 自己写程序来保存照片

照片格局文件lay.xml里要先进行这些定义<?xml version="1.0" encoding="utf-8"?>

其中SurfaceView是用来进行预览的,

在Oncreat函数里初始化一系列的值:requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.lay);/* 取得屏幕解析像素 */DisplayMetrics dm = new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(dm);// mImageView01 = (ImageView) findViewById(R.id.myImageView1);/* 以SurfaceView作为相机Preview之用 */mSurfaceView01 = (SurfaceView) findViewById(R.id.mSurfaceView1);/* 绑定SurfaceView,取得SurfaceHolder对象 */mSurfaceHolder01 = mSurfaceView01.getHolder();/* Activity必须实现SurfaceHolder.Callback */mSurfaceHolder01.addCallback(takephoto.this);/** 以SURFACE_TYPE_PUSH_BUFFERS(3)* 作为SurfaceHolder显示类型* */mSurfaceHolder01.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

首先进行初始化照相机的功能函数和参数设置:private Camera mCamera01;mCamera01 = Camera.open();/* 创建Camera.Parameters对象 */Camera.Parameters parameters = mCamera01.getParameters();/* 设置相片格式为JPEG */parameters.setPictureFormat(PixelFormat.JPEG);Log.i(TAG, "pic is jpeg");/* 指定preview的屏幕大小 */parameters.setPreviewSize(320, 240);Log.i(TAG, "pic pingmu fenbianlv");/* 设置图片分辨率大小 */parameters.setPictureSize(1024, 768);Log.i(TAG, "pic tupian fenbianlv");/* 将Camera.Parameters设置予Camera */mCamera01.setParameters(parameters);/* setPreviewDisplay唯一的参数为SurfaceHolder */mCamera01.setPreviewDisplay(mSurfaceHolder01);/* 立即运行Preview */mCamera01.startPreview();

初始化成功后就可以进行拍照了,拍照函数依然是通过调用camera类的函数来实现

复制代码 代码如下:mCamera01.takePicture(shutterCallback, rawCallback, jpegCallback);

只需实现jpegCallback这个回调函数来就行解码、保存即可,前2个参数可以直接设为null,不过系统一般会自动帮你把这些都写进来的private PictureCallback jpegCallback = new PictureCallback(){ public void onPictureTaken(byte[] _data, Camera _camera) { // TODO Handle JPEG image data /* onPictureTaken传入的第一个参数即为相片的byte */ Bitmap bm = BitmapFactory.decodeByteArray (_data, 0, _data.length); /* 创建新文件 */ picname = "sdcard/1234566.jpg";//要保存在哪里,路径你自己设 File myCaptureFile = new File(picname); try { BufferedOutputStream bos = new BufferedOutputStream (new FileOutputStream(myCaptureFile)); /* 采用压缩转档方法 */ bm.compress(Bitmap.CompressFormat.JPEG, 80, bos); /* 调用flush()方法,更新BufferStream */ bos.flush(); /* 结束OutputStream */ bos.close(); /* 将拍照下来且存储完毕的图文件,显示出来 */ //mImageView01.setImageBitmap(bm); /* 显示完图文件,立即重置相机,并关闭预览 */ resetCamera(); } catch (Exception e) { Log.e(TAG, e.getMessage()); } }};

拍照完了要重置照相机,然后可以继续拍照/* 相机重置 */private void resetCamera(){ if (mCamera01 != null && bIfPreview) { mCamera01.stopPreview(); /* 扩展学习,释放Camera对象 */ mCamera01.release(); mCamera01 = null; bIfPreview = false; }}

2种拍照方式的比较

①. 调用系统自带的照相机,照片格式大小只有几种选择,照片拍出来比较大,而自己程序实现的话可以调节照片大小为任意尺寸,图片的容量可以调节

②. 调用系统的简单,而且外观一般比自己设置的要好看

③. 调用系统的操作简单、方便,不易出错,自己编程的话需要注意,容易引起系统出错意外终止

更多关于Android相关内容感兴趣的读者可查看本站专题:《Android拍照与图片处理技巧总结》、《Android图形与图像处理技巧总结》、《Android开发入门与进阶教程》、《Android调试技巧与常见问题解决方法汇总》、《Android基本组件用法总结》、《Android视图View技巧总结》、《Android布局layout技巧总结》及《Android控件用法总结》

希望本文所述对大家Android程序设计有所帮助。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值