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

Android编程实现拍照功能的2种方法分析

程序员文章站 2022-06-29 12:05:34
本文实例讲述了android编程实现拍照功能的2种方法。分享给大家供大家参考,具体如下: android系统的照相功能,已实现2种方法,可供大家参考: 1. 调用系统摄...

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

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

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

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

<uses-permission android:name="android.permission.camera"></uses-permission>
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />

其次,在主类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"?>
<linearlayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
>
<linearlayout
  android:orientation="horizontal"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:paddingleft="130px"
  android:paddingright="200px"
 >
 <surfaceview
  android:id="@+id/msurfaceview1"
  android:visibility="visible"
  android:layout_width="320px"
  android:layout_height="240px">
 </surfaceview>
 </linearlayout>
 </linearlayout>

其中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程序设计有所帮助。