当前位置:首页 > 谈天说地 > 正文内容

Android实现控制摄像头拍照

34资源网2022年03月29日 11:51339
站长推荐》》》》》摆摊地推这两款软件,一个月3000元-3万元轻松实现《《《《《站长推荐

现在的手机一般都会提供相机功能,有些相机的镜头甚至支持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;
    }
}

程序运行效果图:

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

看完文章,还可以用支付宝扫描下面的二维码领取一个支付宝红包,目前可领1-88元不等

支付宝红包二维码

除了扫码可以领取之外,大家还可以(复制 720087999 打开✔支付宝✔去搜索, h`o`n.g.包哪里来,动动手指就能领)。

看下图所示是好多参与这次活动领取红包的朋友:

支付宝红包

扫描二维码推送至手机访问。

版权声明:本文由34楼发布,如需转载请注明出处。

本文链接:https://www.34l.com/post/11234.html

分享给朋友:

相关文章

低成本创业好项目,这个可日赚几千元
低成本创业好项目,这个可日赚几千元

这几年创业项目也变得越来越多了,大家都知道,现在靠打工是挣不了什么钱的,所以,很多人宁愿自己创业不想打工。那么,低成本创业项目有哪些呢?下面小编马上为大家推荐一个低成本创业项目,如果你有资源的话,也可以免费去推广操作,做好了日赚几千也是很容...

好想你花开富贵大礼包多少钱一提?1236g优惠价只需要43.90元
好想你花开富贵大礼包多少钱一提?1236g优惠价只需要43.90元

好想你花开富贵大礼包多少钱一提?好想你,花开富贵礼盒1236g零食大礼包,原价58.90元,领取15元的优惠券减掉之后只需要43.90元,这个价格在近30日内属于最低价,喜欢这款商品的朋友不要错过哦。好想你花开富贵礼盒1236g,零食大礼包...

适合年轻人创业项目,投资小又赚钱多的项目推荐
适合年轻人创业项目,投资小又赚钱多的项目推荐

社会在发展,科技在更新,生活也在发生着翻天覆地的变化。但是,唯一不变的是,年轻人创业的心,一直都没有变过。每个时代都会有很多想创业的年轻人,只是每个时代的年轻人创业项目都有所不同,那么,今天我们就说说适合现在年轻人创业的项目。下面小编整理了...

联合国秘书长:新冠疫苗必须要成为全球公共产品
联合国秘书长:新冠疫苗必须要成为全球公共产品

当地时间3月11日,联合国启动“必须团结一致”(Only Together)公共宣传活动,呼吁新冠疫苗能够在联合国疫苗计划主导下,成为全球公共产品,向全球各地有需要的人提供。联合国秘书长古特雷斯在致辞中表示,新冠肺炎疫情引发了全球巨大的苦难...

30句至理名言,句句都非常经典
30句至理名言,句句都非常经典

1、命里有时终须有,命里无时莫强求。谋事在人,成事在天。很多事情是人力不能勉强的,随缘就好。2、忍得一时之气,免得百日之忧。在情绪冲动的情况下,做出的决策伤人伤己,总是让人追悔莫及。能忍住自己的脾气,是一种修养,更是一种能力。3、是非终日有...

谈2022年平衡发展策略,我们要平衡的发展
谈2022年平衡发展策略,我们要平衡的发展

2022年解决方案的第二个关键词叫平衡。我们要平衡的发展,长期的发展。你的个人生活,你的公司事业,还有国家的形势,我觉得一定要平衡的去发展,不能说我只赚钱,身体就搞垮,或者说我只赚快钱,但是不关心国家的形势。你看,密室逃脱这个行业,上周国家...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。