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. 【LeetCode OJ】Linked List Cycle II

    Problem link: http://oj.leetcode.com/problems/linked-list-cycle-ii/ The solution has two step: Detec ...

  2. iOS应用中通过设置VOIP模式实现休眠状态下socket的长连接

    如果你的应用程序需要在设备休眠的时候还能够收到服务器端发送的消息,那我们就可以借助VOIP的模式来实现这一需求.但是如果的应用程序并不是正真的VOIP应用,那当你把你的应用提交到AppStore的时候 ...

  3. matlab自带princomp(PCA降维方式)

    matlab 中自带的函数就不必怀疑. princomp:principal componet analysis (PCA). [COEFF,SCORE,latent,tsquare]=princom ...

  4. I.MX6 bootargs 内核参数设定

    /******************************************************************** * I.MX6 bootargs 内核参数设定 * 说明: ...

  5. druid 源码分析与学习(含详细监控设计思路的彩蛋)(转)

    原文路径:http://herman-liu76.iteye.com/blog/2308563  Druid是阿里巴巴公司的数据库连接池工具,昨天突然想学习一下阿里的druid源码,于是下载下来分析了 ...

  6. 继承自CCObject的对象成员变量出错或者为空的问题

    写了个类想让其作为某种数据集合,还可以自动销毁,所以就直接继承了最底层的CCObject,所以并不属于视图,也就不会被addChild到显示列表里,于是就造成了接下来遇到的一个情况:其所有的成员变量被 ...

  7. eclipse 发布APK

    在程序代码告一段落后,需要发布程序,以后还有后续版本更新,用户下载后自动提示更新. 但是平时测试都是debug的方式安装了,但是一个程序不可能是一个人在做,所以生成的密钥都是不一样的, 这就造成用户需 ...

  8. 关于java“配置环境变量”的那些事

    我们刚开始学习java,都会面临编程路上的第一个小怪兽:配环境变量. 网上很多教程给了我们很多的参考,但我们是否有想过为什么要这么配呢?下面我就是想重点探讨一下为什么?并且希望以后你们不但能配,还知道 ...

  9. spingmvc 返回json数据日期格式化方法

    第一种: json 用的是这个依赖 <!-- JSON lib 开发包 以及它的依赖包 --> <dependency> <groupId>com.fasterxm ...

  10. tools/version.c

    /* *  linux/version.c * *  Copyright (C) 1992  Theodore Ts'o * *  May be freely distributed as part ...