Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 574|回复: 0

[实例教程]android 相机设置

[复制链接]

该用户从未签到

发表于 2011-10-22 13:25:45 | 显示全部楼层 |阅读模式
现在的手机几乎都实现照相机功能了,而且在硬件的支持下像素也越来越高,在现实生活中的用途也越来越广,而在Android中专门 提供了Camera来处理相机相关的事件,Camera 是一个专门用来连接和断开相机服务的类,Camera 下面包括如下几个事件:
  
    Camera.AutoFocusCallback: 自动调焦功能;
    Camera.ErrorCallback:错误信息捕捉;
    Camera.Parameters :相机的属性参数
    Camera.PictureCallback:拍照、产生图片时触发;
    Camera.PreviewCallback:相机预览设置;
    Camera.ShutterCallback:快门设置;
    Camera.Size:图片尺寸;
   
    要在Android中使用相机服务很简单,Camera没有构造方法,我们要使用它直接通过open()方法来打开相机设备,然后通过 Camera.Parameters 对相机的一些属性进行设置,比如输出图片的格式、大小等等。下面是Camera类一些常用的方法介绍。

                                                Camera类的方法
           方法                                                                           说明
  autoFocus                                                                  设置自动对焦
  getParameters                                                            得到相机的参数
  open                                                                          启动相机服务
  release                                                                       释放Camera服务
  setPreviewDisplay                                                        设置预览
  setParameters                                                             设置预览参数
  startPreview                                                                 开始预览
  stopPreview                                                                 停止预览
  takePicture                                                                   拍照

  这里重点说明一下拍照的方法和使用, takePicture 方法要实现3个回调函数,分别是: Camera.ShutterCallback (快门) 和 两个Camera.PictureCallback(图像数据)。这里我们在拍照之后要取得图像数据就需要实现Camera.PictureCallback 的 onPictureTaken 方法。onPictureTaken 中第一个参数就是图像数据, 第二个参数则是相机。
   下面是一个相机拍照的例子。相机需要一个界面来预览当前拍摄的效果,这里可以使用SurfaceView类。 我们先来看看在模拟器上的运行效果吧。




  下面我们来看具体如何使用相机服务预览效果,最后按导航键中键来拍照,将照片保存到SD卡中(当然首先要确认有SD卡插入)。 代码如下

  Activity01类
java代码
package xiaohang.zhimeng;



import java.io.BufferedOutputStream;

import java.io.File;

import java.io.FileOutputStream;

import android.app.Activity;

import android.content.Context;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.graphics.Canvas;

import android.graphics.PixelFormat;

import android.hardware.Camera;

import android.hardware.Camera.PictureCallback;

import android.os.Bundle;

import android.view.KeyEvent;

import android.view.SurfaceHolder;

import android.view.SurfaceView;

import android.view.Window;



public class Activity01 extends Activity {

        

        private Preview mPreview;

        @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        requestWindowFeature(Window.FEATURE_NO_TITLE);

        

        //Create our Preview view and set it as the content of our activity.

        mPreview = new Preview(this);

        setContentView(mPreview);

    }

      

    public boolean onKeyUp(int keyCode, KeyEvent event){

            switch (keyCode) {

                case KeyEvent.KEYCODE_DPAD_CENTER:

                        mPreview.takePicture();

                        break;

                }

            return true;

    }

}  

    /*Preview-显示Preview*/

    class Preview extends SurfaceView implements SurfaceHolder.Callback{

            

            SurfaceHolder mHolder;

            Camera mCamera;

            Bitmap cameraBitmap;

            

                public Preview(Context context) {

                        super(context);

                        //得到SurfaceHolder对象

                        mHolder = getHolder();

                        //添加回调函数

                        mHolder.addCallback(this);

                        //设置SurfaceHolder 的类型

                        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

                }

               

                //在Surface的大小发生改变时激发

                @Override

                public void surfaceChanged(SurfaceHolder holder, int format, int width,

                                int height) {

                        /*构建Camera.Parameters对相机的参数进行设置*/

                        Camera.Parameters parameters = mCamera.getParameters();

                        /*设置拍照的图片格式*/

                        parameters.setPictureFormat(PixelFormat.JPEG);

                        /*设置Preview(预览)的尺寸*/

                        parameters.setPreviewSize(320, 480);

                        mCamera.setParameters(parameters);

                        /*开始预览*/

                        mCamera.startPreview();

                }

               

                /*拍照片*/

                public void takePicture(){

                        if (mCamera != null) {

                                mCamera.takePicture(null, null, jpegCallback);

                        }

                }

                /*拍照后输出图片*/

                private PictureCallback jpegCallback = new PictureCallback(){



                        @Override

                        public void onPictureTaken(byte[] data, Camera camera) {

                                // TODO Handle JPEG image data

                                //解码一个不可变的位图 从指定的字节数组

                                cameraBitmap = BitmapFactory.decodeByteArray(data, 0, data.length);

                                File myCaptureFile = new File("/sdcard/camera1.jpg");

                                try {

                                        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(myCaptureFile));

                                        //压缩位图到指定的OutputStream

                                        cameraBitmap.compress(Bitmap.CompressFormat.JPEG, 80, bos);

                                        //刷新此缓冲区的输出流

                                        bos.flush();

                                        //关闭此输出流并释放与此流有关的所有系统资源

                                        bos.close();

                                        /*将拍到的图片绘制出来*/

                                        //锁定画布

                                        Canvas canvas = mHolder.lockCanvas();

                                        canvas.drawBitmap(cameraBitmap, 0, 0, null);

                                        //绘制后解锁,绘制后必须解锁才能显示

                                        mHolder.unlockCanvasAndPost(canvas);

                                } catch (Exception e) {

                                        e.getMessage();

                                }

                        }

                };

               

                //在创建Surface时激发

                @Override

                public void surfaceCreated(SurfaceHolder holder) {

                        /*启动Camera*/

                        mCamera = Camera.open();

                        try {

                                mCamera.setPreviewDisplay(holder);

                        } catch (Exception e) {

                                /*释放mCamera*/

                                mCamera.release();

                                mCamera = null;

                        }

                }      

               

                //在销毁Surface时激发

                @Override

                public void surfaceDestroyed(SurfaceHolder holder) {

                        /*停止预览*/

                        mCamera.stopPreview();

                        mCamera = null;

                }

    }

   最后大家不要忘记了加上权限声明
Xml代码
<uses-permission android:name="android.permission.CAMERA" />

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

    <uses-feature android:name="android.hardware.camera.autofocus" />
xh_07_06_Test.rar (43.9 KB, 下载次数: 14)
回复

使用道具 举报

该用户从未签到

发表于 2011-10-22 13:26:11 | 显示全部楼层

Re:[实例教程]android

lz好贴啊……
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2024-5-19 03:10 , Processed in 0.444699 second(s), 45 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表