Android实现摄像头拍照
2011年4月1日9:54来源:Android中文网我有话说(0) 如果你想在自己的应用中使用摄像头,需要在AndroidManifest.xml中增加以下代码:
<uses-permissionandroid:name="android.permission.CAMERA"/>
设定摄像头布局
这是开发工作的基础,也就是说我们希望在应用程序中增加多少辅助性元素,如摄像头各种功能按钮等。在本文中我们采取最简方式,除了拍照外,没有多余摄像头功能。下面我们一起看一下本文示例将要用到的布局文件“camera_surface.xml”。
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"android:layout_height="fill_parent"
androidrientation="vertical">
<SurfaceViewandroid:id="@+id/surface_camera"
android:layout_width="fill_parent"android:layout_height="10dip"
android:layout_weight="1">
</SurfaceView>
</LinearLayout>
小提示:记住不要在资源文件名称中使用大写字母,如果你把该文件命名为“CameraSurface.xml”,会给你带来不必要的麻烦。
该布局非常简单,只有一个LinearLayout视图组,在它下面只有一个SurfaceView视图,也就是我们的摄像头屏幕。
摄像头实现代码
现在我们已经查看了摄像头的xml代码,下面再来看一下Android代码。让我们创建一个名为“CameraView”的Activity类,实现SurfaceHolder.Callback接口:
publicclassCamaraViewextendsActivityimplementsSurfaceHolder.Callback
接口SurfaceHolder.Callback被用来接收摄像头预览界面变化的信息。它实现了三个方法:
surfaceChanged
当预览界面的格式和大小发生改变时,该方法被调用。
surfaceCreated
初次实例化,预览界面被创建时,该方法被调用。
surfaceDestroyed
当预览界面被关闭时,该方法被调用。
下面我们一起看一下在摄像头应用中如何使用这个接口,首先看一下在Activity类中的onCreate方法。
super.onCreate(icicle);
getWindow().setFormat(PixelFormat.TRANSLUCENT);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.camera);
mSurfaceView=(SurfaceView)findViewById(R.id.surface_camera);
mSurfaceHolder=mSurfaceView.getHolder();
mSurfaceHolder.addCallback(this);
mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
下面我们逐一对代码进行一下说明。
getWindow().setFormat(PixelFormat.TRANSLUCENT);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
通过上述代码,我们告诉屏幕两点信息:
1、摄像头预览界面将通过全屏显示,没有“标题(title)”;
2、屏幕格式为“半透明”。
setContentView(R.layout.camera_surface);
mSurfaceView=(SurfaceView)findViewById(R.id.surface_camera);
在以上代码中,我们通过setContentView来设定Activity的布局为前面我们创建的camera_surface,并创建一个SurfaceView对象,从xml文件中获得它。
mSurfaceHolder=mSurfaceView.getHolder();
mSurfaceHolder.addCallback(this);
mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
通过以上代码,我们从surfaceview中获得了holder,并增加callback功能到“this”。这意味着我们的操作(activity)将可以管理这个surfaceview。
我们看一下callback功能时如何实现的:
publicvoidsurfaceCreated(SurfaceHolderholder){
mCamera=Camera.open();
mCamera是“Camera”类的一个对象。在surfaceCreated方法中我们“打开”摄像头。这就是启动它的方式。
publicvoidsurfaceChanged(SurfaceHolderholder,intformat,intw,inth){
if(mPreviewRunning){
mCamera.stopPreview();
}
Camera.Parametersp=mCamera.getParameters();
p.setPreviewSize(w,h);
mCamera.setParameters(p);
try{
mCamera.setPreviewDisplay(holder);
}catch(IOExceptione){
e.printStackTrace();
}
mCamera.startPreview();
mPreviewRunning=true;
}
该方法让摄像头做好拍照准备,设定它的参数,并开始在Android屏幕中启动预览画面。我使用了一个“semaphore”参数来防止冲突:当mPreviewRunning为true时,意味着摄像头处于激活状态,并未被关闭,因此我们可以使用它。
publicvoidsurfaceDestroyed(SurfaceHolderholder){
mCamera.stopPreview();
mPreviewRunning=false;
mCamera.release();
}
通过这个方法,我们停止摄像头,并释放相关的资源。正如大家所看到的,我们在这儿设置mPreviewRunning为false,以此来防止在surfaceChanged方法中的冲突。原因何在?因为这意味着我们已经关闭了摄像头,而且我们不能再设置其参数或在摄像头中启动图像预览。
最后我们看一下本例中最重要的方法:
Camera.PictureCallbackmPictureCallback=newCamera.PictureCallback(){
publicvoidonPictureTaken(byte[]imageData,Camerac){
}
};
当拍照时,该方法被调用。举例来说,你可以在界面上创建一个OnClickListener,当你点击屏幕时,调用PictureCallBack方法。这个方法会向你提供图像的字节数组,然后你可以使用Android提供的Bitmap和BitmapFactory类,将其从字节数组转换成你想要的图像格式。
分享到:
相关推荐
### Android_Camera框架详解 #### 一、框架概览 Android_Camera框架是Android系统中负责处理摄像头功能的核心组件,它不仅支持预览(viewfinder),还能够实现拍照等基本操作。框架设计精巧,分为客户端与服务器两...
【标题】"android_CameraDemo-master_串口_android串口开发_zerolon_android_cowiwz_" 指向的是一个Android应用项目,该项目专注于在三星Android平台上进行摄像头和串口通信的开发。"zerolon" 和 "cowiwz" 可能是...
Android_CameraX_+_OpenGL。虽然_CameraX_已经封装了大部分对相机操作,_GLCameraX
android_Camera框架分析
"android_camera_demo.zip"这个压缩包提供了一个示例代码,帮助开发者了解如何实现这些功能。下面我们将深入探讨其中涉及的技术点。 1. **Android CameraX库**: Android CameraX是一个官方推荐的高级相机库,它为...
这个“android_camera2_api_video_app-master_androidcamera_videocapture_”项目显然关注的是利用Camera2 API实现视频录制和屏幕捕捉功能。以下是对这个项目的详细分析,以及相关的知识点讲解。 1. **Camera2 API*...
在Android平台上,Camera API是开发者用来实现相机功能的关键接口。Android_Camera分析主要涉及以下几个核心知识点: 1. **Camera API版本**: Android提供了两种Camera API:Camera API1(旧版)和Camera API2...
本文将深入探讨“Android_Camera_Example”项目,这是一份适用于Android开发者学习和参考的示例代码,它展示了如何在Android应用中集成并操作相机。 首先,我们需要了解Android相机API的基础知识。Android提供了两...
`android_camera_framework_stream`主要关注的是Android摄像头框架中的流处理部分,这部分内容对于理解如何在Android平台上高效地管理和使用摄像头资源至关重要。 #### 二、Android摄像头框架结构 Android摄像头...
在Android系统中,相机服务(Camera Service)是用于管理和控制硬件相机的重要组件。"android_Camera.7z"这个压缩包包含的资源,主要是对Android相机框架的深入分析,特别是聚焦于framework层面的重点流程。让我们...
android_camera_framework_stream.pdf
在Android系统中,相机(Camera)是至关重要的组件,它允许开发者创建丰富的应用程序,提供拍照、录像等功能。本文将深入探讨Android Camera架构,包括其组件、工作流程以及如何通过编程接口进行交互。 Android ...
android_camera_framework_stream汇编.pdf
本资源“Android_camera源码.zip”包含了Android相机功能的源代码,这对于理解其工作原理、进行自定义相机应用开发或者优化现有相机功能具有重要意义。我们将探讨Android相机源码中的关键组件、工作流程以及如何利用...
android_camera_framework_stream[汇编].pdf
Android的Camera系统是一个复杂而精细的设计,涉及到多个层次的组件和接口交互。在这个系统中,Camera功能被划分为客户端和服务器两部分,基于Android的Binder机制实现进程间通信。下面我们将详细探讨Android Camera...
Android Camera Demo是用于展示如何在Android设备上使用摄像头功能的示例代码。这篇博客文章(http://blog.csdn.net/amoscxy/article/details/79117522)详细介绍了Android Camera API的基础知识,并提供了一个名为...
### Android Camera架构详解 #### 一、总体架构 Android Camera框架的设计从宏观角度来看是一个典型的客户端/服务端(client/service)架构。此架构由两个主要部分组成:客户端进程和服务器端进程。 - **客户端...