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 和 JS 交互时调用不成功解决方法
  2. Android系统源代码下载
  3. android应用程序最小化的处理方法
  4. Android新线程中更新主线程UI中的View方法汇总
  5. Android 常用代码整理:Android 常用弹窗整理
  6. 彻底解决Android 应用方法数不能超过65536的问题
  7. android install faild insufficient storage错误的解决方法
  8. [Android]ListView & ViewPager & GridView 常见问题解决方法
  9. Android中数据存储的几种方法

随机推荐

  1. Android(安卓)性能监控与分析方法
  2. Android单元测试
  3. Arcgis Android(安卓)基本概念 - 浅谈
  4. 在Android(安卓)Studio中下载Android(安
  5. Android(安卓)搭建Junit测试环境
  6. android proground混淆编译
  7. 安卓开发入门学习笔记
  8. AndroidMenifest.xml中android:sharedUse
  9. android 相对布局属性说明
  10. Android(安卓)Activity和Intent机制学习