文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Android如何实现控制摄像头拍照

2023-06-29 17:14

关注

这篇文章主要介绍Android如何实现控制摄像头拍照,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

使用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;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;        }    };        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;    }}

程序运行效果图:

Android如何实现控制摄像头拍照

以上是“Android如何实现控制摄像头拍照”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网行业资讯频道!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯