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种拍照方式的比较

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

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

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

http://blog.csdn.net/napolun007/article/details/6103307

android 实现拍照的2种方法的更多相关文章

  1. Android 抗锯齿的两种方法

    Android 抗锯齿的两种方法 (其一:paint.setAntiAlias(ture);paint.setBitmapFilter(true))   在Android中,目前,我知道有两种出现锯齿 ...

  2. android emulator启动的两种方法详解

    android emulator启动的两种方法详解    转https://blog.csdn.net/TTS_Kevin/article/details/7452237 对于android学习者,模 ...

  3. Android开发中退出程序几种方法

    参考:http://johncookie.iteye.com/blog/890734 Android程序有很多Activity,比如说主窗口A,调用了子窗口B,子窗口B又调用子窗口C,back返回子窗 ...

  4. Android ListView 滚动的N种方法

    Android 里面让ListView滚动有N种方法,这儿列举三种: 我的需求是通过按键让Listview滚动起来,当然这些按键不是通过Android标识接口传输过来的,所以不能通过监听按键事件来实现 ...

  5. (转)Android创建桌面快捷方式两种方法

    [IT168技术]Android在桌面上生成快捷方式有两种情况,一种是直接在桌面直接生成;一种是长按桌面,在弹出的快捷菜单中生成. 谈谈在桌面上直接生成.个人觉得这个比较爽快,既然都是快捷方式了干嘛还 ...

  6. android使用全局变量的两种方法

         在我们使用android编写程序的时候,少不了想利用全局变量,但是面向对象语言和过程语言区别很大,不再是include就可以的.这里我写了使用全局变量的两种方法: 1.使用applicati ...

  7. Android自适应不同屏幕几种方法

        因为Android设备的屏幕尺寸.分辨率区别很大.假设希望我们的应用可以在不同屏幕尺寸或分辨率的Android设备上执行,即更换Android设备后界面和字体不会因此变得混乱.则须要考虑屏幕的 ...

  8. android 实现分享功能两种方法

    当我想做一个智能的记事本的时候,我就在尝试自己写一组分享功能.后来才知道,原来每个社交软件中都有自己的分享接口. 这就大大减少了我们的代码量了. 第一种方法:特点--简单 package com.ex ...

  9. Android更新UI的几种方法

    在Android开发过程中,常需要更新界面的UI.比如网络请求操作.一些耗时操作都不能放在UI线程中运行的,需要放在子线程,而子线程又不能更新UI界面,这是我们需要引入一个Handler,消息处理机制 ...

随机推荐

  1. Android之Activity与Service通信

    一.当Acitivity和Service处于同一个Application和进程时,通过继承Binder类来实现. 当一个Activity绑定到一个Service上时,它负责维护Service实例的引用 ...

  2. office2010安装Microsoft Office Document Imaging (MODI) 图解

    office2010安装Microsoft Office Document Imaging (MODI) 图解     Microsoft Office 2010 中删除了 Microsoft Off ...

  3. 郝斌老师的SQL教程

    时隔两年,重拾数据库编程.郝斌老师的sql教程通俗易懂,用作复习简直不能太赞.

  4. Unity3D ShaderLab立方体图的法线渲染

    Unity3D ShaderLab立方体图的法线渲染 某些情况下,我们希望立方体图的材质球上产生法线效果,来更多的表现细节,比如菱形花纹的玻璃,冰块的表面. 在帧数的协调下,我们可以通过input结构 ...

  5. iOS-NSURLCache内存缓存

    在IOS应用程序开发中,为了减少与服务端的交互次数,加快用户的响应速度,一般都会在IOS设备中加一个缓存的机制.使用缓存的目的是为了使用的应用程序能更快速的响应用户输入,是程序高效的运行.有时候我们需 ...

  6. OpenHCI - Data Transfer Types

    There are four data transfer types defined in USB(USB中有4种数据传输类型). Each type is optimized to match th ...

  7. UDP 打洞 原理解释

    终于找到了一份满意的UDP打洞原理解释,附上正文,自己整理了一下源码 3.3. UDP hole punching UDP打洞技术 The third technique, and the one o ...

  8. Set-常用API及详解

    SetAPI: 类别 方法 增 add.addAll 删 remove.removeAll 长 size 遍 iterator 判 isEmpty hashCode 使用与集合大同小异,主要的区别就在 ...

  9. Gulp 总结

    Gulp介绍 Gulp是一个前端开发的自动化构建工具.前端开发往往需要把LESS/SCSS文件进行编译成CSS文件,javascript多文件合并成一个文件并压缩以及一些其他需要重复性操作的工作.而G ...

  10. webStorm快捷键总结

    Ctrl+Shift+a:快速查找使用编辑器所有功能1.左侧栏目录显影:Ctrl+Shift+F122.文件模板配置:File>Settings>Editor>File and Co ...