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类,将其从字节数组转换成你想要的图像格式。

更多相关文章

  1. Android在Activity中获得控件宽高和截屏操作
  2. Android(安卓)Parcelable 源码解析
  3. 实战android菜单项之XML加载菜单与动态菜单项
  4. Android(安卓)和 JS 交互时调用不成功解决方法
  5. android 应用如何获取系统权限 以及root系统方法
  6. android运行后台服务de生命周期yu使用技巧
  7. Service简析
  8. 浅谈Java中Collections.sort对List排序的两种方法
  9. Python list sort方法的具体使用

随机推荐

  1. MySQL去除重叠时间求时间差和的实现
  2. Mysql数据库中datetime、bigint、timesta
  3. MySQL的全局锁和表级锁的具体使用
  4. SQL IDENTITY_INSERT作用案例详解
  5. MySQL外键约束(FOREIGN KEY)案例讲解
  6. MySQL非空约束(not null)案例讲解
  7. MySQL 1130异常,无法远程登录解决方案详
  8. 解决mysql数据库数据迁移达梦数据乱码问
  9. MySQL连接异常报10061错误问题解决
  10. MySQL/MariaDB中如何支持全部的Unicode