现在的手机一般都会提供相机功能,有些相机的镜头甚至支持1300万以上像素,有些甚至支持独立对焦、光学变焦这些只有单反才有的功能,甚至有些手机直接宣传可以拍到星星。可以说手机已经变成了专业数码相机。为了充分利用手机上的相机功能, android系统提供了camera类来控制相机拍照。现在就让我们看一下如果使用camera类来控制手机拍照。 

使用camera控制手机拍照的步骤如下: 

1) 调用camera的open()方法打开相机。该方法默认打开后置摄像头。如果需要打开指定摄像头,可以为该方法传入摄像头id。

2) 调用camera的getparameters()方法获取拍照参数。该方法返回一个 camera.parameters 对象。

3) 调用camera.parameters对象方法设置拍照参数。

4) 调用camera的startpreview()方法开始预览取景,在预览取景之前需要调用camera 的 setpreviewdisplay(surfaceholder holder)方法设置使用哪个surface view 来显示取景照片。

5) 调用camera的takepicture()方法进行拍照。

6) 结束程序时,调用camera的stoppreview()结束取景预览,并调用release()方法释放资源。

应用实例:拍照时自动对焦 

下面的实例示范了使用camera来进行拍照、当用户按下拍照键时,该应用会自动对焦,当对焦成功时拍下照片。该程序的界面中只提供了一个surfaceview来显示预览取景,十分简单。该程序代码如下:

package com.jph.camera;
 
import java.io.file;
import java.io.fileoutputstream;
import java.io.ioexception;
import java.text.simpledateformat;
import java.util.date;
import java.util.locale;
import android.app.activity;
import android.graphics.bitmap;
import android.graphics.bitmap.compressformat;
import android.graphics.bitmapfactory;
import android.graphics.imageformat;
import android.hardware.camera;
import android.hardware.camera.autofocuscallback;
import android.hardware.camera.picturecallback;
import android.hardware.camera.shuttercallback;
import android.os.bundle;
import android.os.environment;
import android.util.displaymetrics;
import android.view.display;
import android.view.surfaceholder;
import android.view.surfaceholder.callback;
import android.view.surfaceview;
import android.view.view;
import android.view.window;
import android.view.windowmanager;
import android.widget.edittext;
import android.widget.imageview;
import android.widget.toast;
/**
 * 控制手机拍照
 * @author jph
 * date:2014.08.20
 * */
public class captureimage extends activity
{
    surfaceview sview;
    surfaceholder surfaceholder;
    int screenwidth, screenheight;
    // 定义系统所用的照相机
    camera camera;
    // 是否在预览中
    boolean ispreview = false;
 
    @override
    public void oncreate(bundle savedinstancestate)
    {
        super.oncreate(savedinstancestate);
        // 设置全屏
        requestwindowfeature(window.feature_no_title);
        getwindow().setflags(windowmanager.layoutparams.flag_fullscreen,
            windowmanager.layoutparams.flag_fullscreen);
        setcontentview(r.layout.main);
        // 获取窗口管理器
        windowmanager wm = getwindowmanager();
        display display = wm.getdefaultdisplay();
        displaymetrics metrics = new displaymetrics();
        // 获取屏幕的宽和高
        display.getmetrics(metrics);
        screenwidth = metrics.widthpixels;
        screenheight = metrics.heightpixels;
        // 获取界面中surfaceview组件
        sview = (surfaceview) findviewbyid(r.id.sview);    
        // 获得surfaceview的surfaceholder
        surfaceholder = sview.getholder();
        // 为surfaceholder添加一个回调监听器
        surfaceholder.addcallback(new callback()
        {
            @override
            public void surfacechanged(surfaceholder holder, int format,
                int width, int height)
            {
            }
 
            @override
            public void surfacecreated(surfaceholder holder)
            {
                // 打开摄像头
                initcamera();
            }
 
            @override
            public void surfacedestroyed(surfaceholder holder)
            {
                // 如果camera不为null ,释放摄像头
                if (camera != null)
                {
                    if (ispreview) camera.stoppreview();
                    camera.release();
                    camera = null;
                }
            }
        });
    }
 
    private void initcamera()
    {
        if (!ispreview)
        {
            // 此处默认打开后置摄像头。
            // 通过传入参数可以打开前置摄像头
            camera = camera.open(0);  //①
            camera.setdisplayorientation(90);
        }
        if (camera != null && !ispreview)
        {
            try
            {
                camera.parameters parameters = camera.getparameters();
                // 设置预览照片的大小
                parameters.setpreviewsize(screenwidth, screenheight);
                // 设置预览照片时每秒显示多少帧的最小值和最大值
                parameters.setpreviewfpsrange(4, 10);
                // 设置图片格式
                parameters.setpictureformat(imageformat.jpeg);
                // 设置jpg照片的质量
                parameters.set("jpeg-quality", 85);
                // 设置照片的大小
                parameters.setpicturesize(screenwidth, screenheight);
                // 通过surfaceview显示取景画面
                camera.setpreviewdisplay(surfaceholder);  //②
                // 开始预览
                camera.startpreview();  //③
            }
            catch (exception e)
            {
                e.printstacktrace();
            }
            ispreview = true;
        }
    }
    /**
     * 此方法在布局文件中调用
     * */
    public void capture(view source)
    {
        if (camera != null)
        {
            // 控制摄像头自动对焦后才拍照
            camera.autofocus(autofocuscallback);  //④
        }
    }
 
    autofocuscallback autofocuscallback = new autofocuscallback()
    {
        // 当自动对焦时激发该方法
        @override
        public void onautofocus(boolean success, camera camera)
        {
            if (success)
            {
                // takepicture()方法需要传入3个监听器参数
                // 第1个监听器:当用户按下快门时激发该监听器
                // 第2个监听器:当相机获取原始照片时激发该监听器
                // 第3个监听器:当相机获取jpg照片时激发该监听器
                camera.takepicture(new shuttercallback()
                {
                    public void onshutter()
                    {
                        // 按下快门瞬间会执行此处代码
                    }
                }, new picturecallback()
                {
                    public void onpicturetaken(byte[] data, camera c)
                    {
                        // 此处代码可以决定是否需要保存原始照片信息
                    }
                }, myjpegcallback);  //⑤
            }
        }
    };
 
    picturecallback myjpegcallback = new picturecallback()
    {
        @override
        public void onpicturetaken(byte[] data, camera camera)
        {
            // 根据拍照所得的数据创建位图
            final bitmap bm = bitmapfactory.decodebytearray(data, 0,
                data.length);
            string filename=getfilenmae();
            if (filename==null) return;
            // 创建一个位于sd卡上的文件
            file file = new file(filename);
            fileoutputstream outstream = null;
            try
            {
                // 打开指定文件对应的输出流
                outstream = new fileoutputstream(file);
                // 把位图输出到指定文件中
                bm.compress(compressformat.jpeg, 100,
                    outstream);
                outstream.close();
                toast.maketext(captureimage.this, "照片以保存到"+filename, 
                        toast.length_short).show();
            }
            catch (ioexception e)
            {
                e.printstacktrace();
            }            
                
            // 重新浏览
            camera.stoppreview();
            camera.startpreview();
            ispreview = true;
        }
    };
    /**
     * 返回摄取照片的文件名
     * @return 文件名
     * */
    protected string getfilenmae() {
        // todo auto-generated method stub
        string filename;
        if (!environment.getexternalstoragestate().equals
                (environment.media_mounted)) {
            toast.maketext(this, "监测到你的手机没有插入sd卡,请插入sd卡后再试", 
                    toast.length_long).show();
            return null;
        }
        simpledateformat sdf=new simpledateformat("yyyy-mm-dd hh.mm.ss", locale.getdefault());        
        filename=environment.getexternalstoragedirectory()+file.separator
                +sdf.format(new date())+".jpg";
        return filename;
    }
}

程序运行效果图:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。