Android多媒体应用开发-控制摄像头拍照
现在的手机的功能可谓是五花八门,手机照相功能就是特别突出的一点,现在的手机照相机甚至成了专业数码照相机,可以拍摄出清晰的照片和录制高分辨率的视频。Android操作系统呢,提供了相应的功能来控制拍照:
通过Camera进行拍照
1.调用Camera的open()方法打开相机。
2.调用Camera的setParameters()方法获取拍照参数。该方法返回一个Camera.Parameters对象。
3.调用Camera.Paramers对象方法设置拍照参数
4.调用Camera的startPreview()方法开始预览取景,在预览取景之前需要调用Camera的setPreViewDisplay(SurfaceHolder holder)方法设置使用哪个SurfaceView来显示取景图片。
5.调用Camera的takePicture()方法进行拍照.
6.结束程序时,调用Camera的StopPriview()结束取景预览,并调用release()方法释放资源.
创建项目:CaptureImage
运行效果:

程序代码:
==>CaptureImage.java
- package org.wwj.sound;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import android.app.Activity;
- import android.app.AlertDialog;
- import android.content.Context;
- import android.content.DialogInterface;
- import android.content.DialogInterface.OnClickListener;
- import android.graphics.Bitmap;
- import android.graphics.Bitmap.CompressFormat;
- import android.graphics.BitmapFactory;
- import android.graphics.PixelFormat;
- import android.hardware.Camera;
- import android.hardware.Camera.PictureCallback;
- import android.os.Bundle;
- import android.os.Environment;
- import android.view.Display;
- import android.view.KeyEvent;
- 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;
- 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 = (WindowManager) getSystemService(
- Context.WINDOW_SERVICE);
- Display display = wm.getDefaultDisplay();
- // 获取屏幕的宽和高
- screenWidth = display.getWidth();
- screenHeight = display.getHeight();
- // 获取界面中SurfaceView组件
- sView = (SurfaceView) findViewById(R.id.sView);
- // 获得SurfaceView的SurfaceHolder
- surfaceHolder = sView.getHolder();
- // 为surfaceHolder添加一个回调监听器
- surfaceHolder.addCallback(new Callback()
- {
- public void surfaceChanged(SurfaceHolder holder, int format, int width,
- int height)
- {
- }
- public void surfaceCreated(SurfaceHolder holder)
- {
- // 打开摄像头
- initCamera();
- }
- public void surfaceDestroyed(SurfaceHolder holder)
- {
- // 如果camera不为null ,释放摄像头
- if (camera != null)
- {
- if (isPreview)
- camera.stopPreview();
- camera.release();
- camera = null;
- }
- }
- });
- // 设置该SurfaceView自己不维护缓冲
- surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
- }
- private void initCamera()
- {
- if (!isPreview)
- {
- camera = Camera.open();
- }
- if (camera != null && !isPreview)
- {
- try
- {
- Camera.Parameters parameters = camera.getParameters();
- // 设置预览照片的大小
- parameters.setPreviewSize(screenWidth, screenHeight);
- // 每秒显示4帧
- parameters.setPreviewFrameRate();
- // 设置图片格式
- parameters.setPictureFormat(PixelFormat.JPEG);
- // 设置JPG照片的质量
- parameters.set();
- //设置照片的大小
- parameters.setPictureSize(screenWidth, screenHeight);
- camera.setParameters(parameters);
- //通过SurfaceView显示取景画面
- camera.setPreviewDisplay(surfaceHolder);
- // 开始预览
- camera.startPreview();
- // 自动对焦
- camera.autoFocus(null);
- }
- catch (Exception e)
- {
- e.printStackTrace();
- }
- isPreview = true;
- }
- }
- @Override
- public boolean onKeyDown(int keyCode, KeyEvent event)
- {
- switch (keyCode)
- {
- // 当用户单击照相键、中央键时执行拍照
- case KeyEvent.KEYCODE_DPAD_CENTER:
- case KeyEvent.KEYCODE_CAMERA:
- )
- {
- // 拍照
- camera.takePicture(null, null , myjpegCallback);
- return true;
- }
- break;
- }
- return super.onKeyDown(keyCode, event);
- }
- PictureCallback myjpegCallback = new PictureCallback()
- {
- public void onPictureTaken(byte[] data, Camera camera)
- {
- // 根据拍照所得的数据创建位图
- final Bitmap bm = BitmapFactory.decodeByteArray(data
- , , data.length);
- // 加载/layout/save.xml文件对应的布局资源
- View saveDialog = getLayoutInflater().inflate(
- R.layout.save, null);
- final EditText photoName = (EditText) saveDialog
- .findViewById(R.id.photo_name);
- // 获取saveDialog对话框上的ImageView组件
- ImageView show = (ImageView) saveDialog.findViewById(R.id.show);
- // 显示刚刚拍得的照片
- show.setImageBitmap(bm);
- //使用对话框显示saveDialog组件
- new AlertDialog.Builder(CaptureImage.this)
- .setView(saveDialog)
- .setPositiveButton("保存", new OnClickListener()
- {
- public void onClick(DialogInterface dialog,
- int which)
- {
- // 创建一个位于SD卡上的文件
- File file = new File(Environment.getExternalStorageDirectory()
- , photoName.getText().toString() + ".jpg");
- FileOutputStream outStream = null;
- try
- {
- // 打开指定文件对应的输出流
- outStream = new FileOutputStream(file);
- // 把位图输出到指定文件中
- bm.compress(CompressFormat.JPEG, , outStream);
- outStream.close();
- }
- catch (IOException e)
- {
- e.printStackTrace();
- }
- }
- })
- .setNegativeButton("取消", null)
- .show();
- //重新浏览
- camera.stopPreview();
- camera.startPreview();
- isPreview = true;
- }
- };
- }
设置权限:
- <!-- 授予程序使用摄像头的权限 -->
- <uses-permission android:name="android.permission.CAMERA" />
- <uses-feature android:name="android.hardware.camera" />
- <uses-feature android:name="android.hardware.camera.autofocus" />
Android多媒体应用开发-控制摄像头拍照的更多相关文章
- Android开发之控制摄像头拍照
如今的手机一般都会提供相机功能,有些相机的镜头甚至支持1300万以上像素,有些甚至支持独立对焦.光学变焦这些仅仅有单反才有的功能,甚至有些手机直接宣传能够拍到星星.能够说手机已经变成了专业数码相机.为 ...
- 在WPF中使用AForge.net控制摄像头拍照
原文:在WPF中使用AForge.net控制摄像头拍照 利用AForge.net控制摄像头拍照最方便的方法就是利用PictureBox显示摄像头画面,但在WPF中不能直接使用PictureBox.必须 ...
- 用Python控制摄像头拍照并发邮件
概述前言 工具 思路 安装及导入包 设置参数 实现拍照 构造邮件内容 发送邮件 判断网络连接 开机自启 后记 o1 前言为什么会有写这个程序的想法呢? 最初的想法是写一个可以用电脑前置摄像头拍照的程序 ...
- Python控制自己的手机摄像头拍照,并把照片自动发送到邮箱
写在前面的一些P话: 今天这个案例,就是控制自己的摄像头拍照,并且把拍下来的照片,通过邮件发到自己的邮箱里.想完成今天的这个案例,只要记住一个重点:你需要一个摄像头 思路 通过opencv调用摄像头拍 ...
- Android开发手记(32) 使用摄像头拍照
在Android中,使用摄像头拍照一般有两种方法, 一种是调用系统自带的Camera,另一种是自己写一个摄像的界面. 我们要添加如下权限: <uses-permission android:na ...
- VS2010开发MFC ActiveX,摄像头拍照上传Webservice(2)
继续记录,第二步开发摄像头拍照功能. 使用vfw.h开发摄像头拍照功能,关于vfw网上有很多文章,很多代码可以参考 参考:http://blog.163.com/huangqiao_8/blog/st ...
- android: 调用摄像头拍照
很多应用程序都可能会使用到调用摄像头拍照的功能,比如说程序里需要上传一张图片 作为用户的头像,这时打开摄像头拍张照是最简单快捷的.下面就让我们通过一个例子来学 习一下,如何才能在应用程序里调用手机的摄 ...
- Android开发技巧——Camera拍照功能
本篇是我对开发项目的拍照功能过程中,对Camera拍照使用的总结.由于camera2是在api level 21(5.0.1)才引入的,而Camera到6.0仍可使用,所以暂未考虑camera2. 文 ...
- VS2010开发MFC ActiveX,摄像头拍照上传Webservice(1)
最近工作项目,BS中需要用到摄像头拍照,需要存储本地,同时上传到服务器,尝试使用vc++做ActiveX来实现. 完全没有使用过vc,上网搜索各种知识,初步完成.在这里记录下有帮助的资料. 第一步:编 ...
随机推荐
- Cutting Sticks
题意: l长的木棒,给出n个切割点,每切一次的费用为切得木棒的长度,完成切割的最小费用. 分析: 区间dp入门,区间dp的特点,一个大区间的解可以转换成小区间的解组合起来,每个切割点的标号代表边界. ...
- Clang Language Extensions
Xcode 本文是自<Clang Language Extensions> 中选取部分与 Objective-C 相关的内容翻译,由于作者水平有限,如存在理解错误或翻译不到位的地方,还请指 ...
- LeetCode题解——Palindrome Number
题目: 判断一个数字是不是回文数字,即最高位与最低位相同,次高位与次低位相同,... 解法: 求出数字的位数,然后依次求商和求余判断是否相等. 代码: class Solution { public: ...
- ASP.NET MVC中的Json Binding和Validate
引子:电子商务网站支付功能页面往往会有很多信息,对于这些信息的保存,往往是分步完成的,那么使用Ajax最合适不过了,比如其中的收货人信息模块.这些信息的新建和编辑保存都是用Ajax来完成的.那么有几种 ...
- Java每日一则-002
Java中包的层级关系 java中的包在逻辑上是没有套嵌的,也就是说: java.lang 和 java.lang.awt 是两个平行的包,地位相等,互不相关.只不过一个名字叫java.lang另一个 ...
- SQL游标遍历数据表
DECLARE @资产编号 VARCHAR(50) ,@gsid VARCHAR(50) DECLARE test_Cursor CURSOR LOCAL FOR SELECT 资产编号,gsid F ...
- AHOI2013 Round2 Day2 简要题解
第一题: 第一问可以用划分树或主席树在O(nlog2n)内做出来. 第二问可以用树状数组套主席树在O(nlog2n)内做出来. 我的代码太挫了,空间刚刚卡过...(在bzoj上) 第二题: 分治,将询 ...
- as3 中trace() 函数对效率的影响
进行页游开发的过程中,很多开发者都有一个习惯,在数据输出中添加trace()函数来跟踪数值 - 不进行条件编译,发布的时候也不删除.实际上大量的trace函数会降低程序的效率,我们可以用一个简单的例子 ...
- mysql的登录密码带特殊符号登录不进去的问题
eg : mysqldump -u root -p)P:9 ${dbname} > $dataPath$filename 当我将数据库的数据每天进行自动导出时,需要带上密码,但 ) 是一个特殊符 ...
- Native libraries .so.XY failing to link at runtime
What you need to do is edit the configure file. And find out this: SLIBNAME='$(SLIBPREF)$(FULLNAME)$ ...