`
bcyy
  • 浏览: 1819394 次
文章分类
社区版块
存档分类
最新评论

Android多媒体应用开发-控制摄像头拍照

 
阅读更多

今天是2012年8月1日,建军节,首先庆祝祖国建军85周年,这也是中国体育军团参加伦敦奥运会的第5天,我有空也看了几场赛事,中国已经拿了13枚金牌,不错的成绩,有成功,自然也有失败。既然要有奥运精神,那就别太在乎结果,尽力就好。但对于中国来说,金牌的重量是可想而知的,没有拿到金牌你什么都不是,那些为祖国奋战的运动员们因没有拿到奖牌而默默离开,这也是现实的残酷,你所得到的尊重是建立在你所取得的成就。不管他们是否拿到奖牌,我都已你们为骄傲。闲话少说,我还是在默默学习半知不解的知识,正努力成为一个合格的程序员。

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(4);
				// 设置图片格式
				parameters.setPictureFormat(PixelFormat.JPEG);
				// 设置JPG照片的质量
				parameters.set("jpeg-quality", 85);
				//设置照片的大小
				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:
				if (camera != null && event.getRepeatCount() == 0)
				{
					// 拍照
					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
				, 0, 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, 100, 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 Camera2 Demo - 实现相机预览、拍照、录制视频功能

    因为工作中要使用 Android Camera2 API 来实现相机功能,但因为Camera2比较复杂,网上资料也比较乱,有一定入门门槛,所以花了几天时间系统研究了下,这个项目就是我研究的成果。 其中包括一个自己写的Camera2的Demo...

    Android高级编程--源代码

    由于现有的手机应用程序的开发是构建在各手机厂家的私有操作系统之上的,所以它限制了第三方应用程序的开发,而Android为我们提供了一个开放和通用的选择。因为没有了人为制造的障碍,所以Android开发人员可以自由地...

    Android多媒体开发高级编程

    《Android多媒体开发高级编程——为智能手机和平板电脑开发图形、音乐、视频和富媒体应用》使用清晰、直观的示例介绍了Android SDK中丰富的多媒体功能,有助于您开发能够创建、播放和共享多媒体的优秀Android应用...

    新版Android开发教程.rar

    的 Android SDK 提供了在 Android 平台上使用 JaVa 语言进行 Android 应用开发必须的工具和 API 接口。 特性 • 应用程序框架 支持组件的重用与替换 • Dalvik Dalvik Dalvik Dalvik 虚拟机 专为移动设备优化 • ...

    android开发资料大全

    Android多媒体实例大汇集(源码,全) Android中利用画图类和线程画出闪烁的心形,送给亲爱的他 android自带的示例程序 BluetoothChat 变蓝牙串口助手(内含DIY蓝牙遥控车附源码实例教程) Android高手过招 FAQ ...

    《Android高级编程》

    9.2.1 在应用程序中使用SMS 9.2.2 发送SMS信息 9.2.3 监听SMS消息 9.2.4 紧急响应的SMS示例 9.2.5 紧急响应自动化 9.3 小结 第10章 访问Android硬件 10.1 使用媒体API 10.1.1 播放媒体资源 10.1.2 录制多媒体 10.2 ...

    android(下)复习总结

    第一章:多媒体应用开发 2 一、 音视频播放 2 二、 录制音频 4 三、 摄像头拍照 4 第二章:OpenGL与3D开发 5 一、 OpenGL与OpenGL ES 5 二、 OpenGL ES绘制2D图形 8 三、 OpenGL ES应用纹理贴图 12 四、 OpenGL ES...

    疯狂Android讲义(第2版)源代码 第10章~第13章

    11.3、控制摄像头拍照:Camera; 第12章、OpenGL与3D应用开发 12.2、OpenGL ES基础: 12.3、绘制2D图形: 12.4、绘制3D图形: 第13章、Android的网络应用 13.1、基于TCP协议的网络通信(套接字Socket):Socket; ...

    Android高级编程.pdf

    1.4 自带的Android应用程序 1.5 Android SDK功能 1.5.1 对包括摄像头、GPS和加速计在内的硬件的访问 1.5.2 自带的Google地图、地理编码和基于位置的服务 1.5.3 后台服务 1.5.4 SQLite数据存储和检索数据库 1.5.5 ...

    疯狂Android讲义源码

     11.3 控制摄像头拍照 442  11.3.1 通过Camera进行拍照 442  11.3.2 录制视频短片 446  11.4 本章小结 450  第12章 OpenGL与3D应用开发 451  12.1 3D图像与3D开发的  基本知识 452  12.2 OpenGL和OpenGL ES...

    Android高薪之路:Android程序员面试宝典 李宁

    1 3 开发Android应用程序 1 3 1 搭建Android开发环境 1 3 2 Android开发环境的使用 第2章 布局 2 1 Android中的布局 2 2 布局使用技巧 2 2 1 FrameLayout布局 2 2 2 LinearLayout布局 2 2 3 RelativeLayout布局 2 2 ...

    Android 自定义相机功能,包括聚集、闪光和摄像头切换.rar

    Android 自定义相机 支持自动聚焦 闪光灯和摄像头切换 拍照 储存 屏幕高亮,点击屏幕时聚焦 拍照瞬间聚焦 手势缩放屏幕,如示例图所示的效果,在正常运行时,是动态的,方块不停随机变化位置,以测试相机的自动功能...

    Android实例代码

    11.3、控制摄像头拍照:Camera; 第12章、OpenGL与3D应用开发 12.2、OpenGL ES基础: 12.3、绘制2D图形: 12.4、绘制3D图形: 第13章、Android的网络应用 13.1、基于TCP协议的网络通信(套接字Socket):Socket; ...

    Android 支持人脸识别拍照程序范例.rar

    Android 支持人脸识别拍照程序范例,拍摄照片时将自动锁定人脸部位,然后对焦什么的都会跟上,就像现在手机拍照的人脸检测一样的功能。同时本拍照程序还有一些特效功能,比如黑白、负片、曝光过度、色调分离、白板、...

    疯狂Android讲义(第2版)源代码 第6章~第9章

    11.3、控制摄像头拍照:Camera; 第12章、OpenGL与3D应用开发 12.2、OpenGL ES基础: 12.3、绘制2D图形: 12.4、绘制3D图形: 第13章、Android的网络应用 13.1、基于TCP协议的网络通信(套接字Socket):Socket; ...

    疯狂Android讲义.part2

    11.3 控制摄像头拍照 442 11.3.1 通过Camera进行拍照 442 11.3.2 录制视频短片 446 11.4 本章小结 450 第12章 OpenGL与3D应用开发 451 12.1 3D图像与3D开发的 基本知识 452 12.2 OpenGL和OpenGL ES简介 453 12.3 ...

    疯狂Android讲义.part1

    11.3 控制摄像头拍照 442 11.3.1 通过Camera进行拍照 442 11.3.2 录制视频短片 446 11.4 本章小结 450 第12章 OpenGL与3D应用开发 451 12.1 3D图像与3D开发的 基本知识 452 12.2 OpenGL和OpenGL ES简介 453 12.3 ...

    android音频录制

    而Android系统的多媒体框架也为开发者提供了MediaRecorder类来实现视频录制功能。在使用MediaRecorder时我们要注意以下几点: 第一:无法使用模拟器进行测试,在使用MediaRecorder进行音视频录制时,需要用真机进行...

Global site tag (gtag.js) - Google Analytics