全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

本文实例讲述了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程序设计有所帮助。


# Android  # 拍照功能  # Android判断是否有拍照权限的实例代码  # Android编程调用系统自带的拍照功能并返回JPG文件示例【附demo源码下载】  # Android仿微信单击拍照长按录像功能实例代码  # Android SurfaceView拍照录像实现方法  # Android 7.0中拍照和图片裁剪适配的问题详解  # Android自定义组件获取本地图片和相机拍照图片  # Android 实现IOS选择拍照相册底部弹出的实例  # 系统自带  # 种方法  # 进阶  # 相关内容  # 第一个  # 就能  # 是用来  # 只需  # 设为  # 你自己  # 感兴趣  # 就行  # 给大家  # 很简单  # 可以直接  # 几种  # 可供  # 要先  # 你把  # 头来 


相关文章: 在线制作视频的网站有哪些,电脑如何制作视频短片?  电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?  如何在建站宝盒中设置产品搜索功能?  制作公司内部网站有哪些,内网如何建网站?  建站之星如何助力网站排名飙升?揭秘高效技巧  Swift开发中switch语句值绑定模式  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  C++如何编写函数模板?(泛型编程入门)  一键制作网站软件下载安装,一键自动采集网页文档制作步骤?  如何通过商城免费建站系统源码自定义网站主题?  电商网站制作公司有哪些,1688网是什么意思?  如何通过宝塔面板实现本地网站访问?  建站主机服务器选型指南与性能优化方案解析  如何快速搭建高效可靠的建站解决方案?  广州营销型建站服务商推荐:技术优势与SEO优化解析  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  如何彻底卸载建站之星软件?  建站之星代理商如何保障技术支持与售后服务?  子杰智能建站系统|零代码开发与AI生成SEO优化指南  如何选择最佳自助建站系统?快速指南解析优劣  如何通过云梦建站系统实现SEO快速优化?  建站之星如何防范黑客攻击与数据泄露?  如何注册花生壳免费域名并搭建个人网站?  如何快速搭建响应式可视化网站?  家庭服务器如何搭建个人网站?  外贸公司网站制作,外贸网站建设一般有哪些步骤?  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  盐城做公司网站,江苏电子版退休证办理流程?  IOS倒计时设置UIButton标题title的抖动问题  ppt在线制作免费网站推荐,有什么下载免费的ppt模板网站?  网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?  公司网站制作价格怎么算,公司办个官网需要多少钱?  建站主机无法访问?如何排查域名与服务器问题  再谈Python中的字符串与字符编码(推荐)  如何配置支付宝与微信支付功能?  自助网站制作软件,个人如何自助建网站?  ,交易猫的商品怎么发布到网站上去?  专业商城网站制作公司有哪些,pi商城官网是哪个?  南阳网站制作公司推荐,小学电子版试卷去哪里找资源好?  微信h5制作网站有哪些,免费微信H5页面制作工具?  如何通过主机屋免费建站教程十分钟搭建网站?  香港服务器如何优化才能显著提升网站加载速度?  模具网站制作流程,如何找模具客户?  如何在搬瓦工VPS快速搭建网站?  新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?  网页设计网站制作软件,microsoft office哪个可以创建网页?  常州自助建站工具推荐:低成本搭建与模板选择技巧  如何快速建站并高效导出源代码? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。