Android应用开发提高篇(5)-----Camera使用
2012-08-17 12:35
465 查看
一、概述
Camera是手机的一个很重要的设备,可以说现在的每一部手机上都有。回想当时在Linux搞摄像头编程真的要捏一把汗。有人会说在Linux下装个opencv就可以通过它的函数来使用摄像头啦,但我并没有这么做,我还是用最原始的方法(V4L2)实现了。之前研究过Android关于摄像头这部分的源码,毫无疑问,Android关于摄像头底层的实现用的也是V4L2。
二、实现
新建工程MyCamera,修改/res/layout/main.xml文件,使用RelativeLayout布局,并添加一个SurfaceView和一个Button,完整的main.xml如下:
接着,修改MyCameraActivity.java文件,实现了SurfaceHolder.Callback接口,用于初始化、释放摄像头和Camera.PictureCallback接口,用于保存图片数据到文件里。完整的内容如下:
在真机上运行该程序:
按一下“拍照”按钮:
图片会被保存到sd卡的根目录下面。
Camera是手机的一个很重要的设备,可以说现在的每一部手机上都有。回想当时在Linux搞摄像头编程真的要捏一把汗。有人会说在Linux下装个opencv就可以通过它的函数来使用摄像头啦,但我并没有这么做,我还是用最原始的方法(V4L2)实现了。之前研究过Android关于摄像头这部分的源码,毫无疑问,Android关于摄像头底层的实现用的也是V4L2。
二、实现
新建工程MyCamera,修改/res/layout/main.xml文件,使用RelativeLayout布局,并添加一个SurfaceView和一个Button,完整的main.xml如下:
1 <?xml version="1.0" encoding="utf-8"?> 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="fill_parent" 4 android:layout_height="fill_parent" 5 android:orientation="vertical" 6 > 7 8 <SurfaceView 9 android:id="@+id/surfaceview" 10 android:layout_width="fill_parent" 11 android:layout_height="wrap_content" 12 android:layout_alignParentTop="true" 13 android:layout_above="@+id/button" 14 /> 15 16 <Button 17 android:id="@+id/button" 18 android:layout_width="fill_parent" 19 android:layout_height="wrap_content" 20 android:layout_alignParentBottom="true" 21 android:text="拍照" 22 /> 23 24 </RelativeLayout>
接着,修改MyCameraActivity.java文件,实现了SurfaceHolder.Callback接口,用于初始化、释放摄像头和Camera.PictureCallback接口,用于保存图片数据到文件里。完整的内容如下:
1 package com.nan.camera; 2 3 import java.io.File; 4 import java.io.FileNotFoundException; 5 import java.io.FileOutputStream; 6 import java.io.IOException; 7 8 import android.app.Activity; 9 import android.graphics.Bitmap; 10 import android.graphics.BitmapFactory; 11 import android.graphics.PixelFormat; 12 import android.hardware.Camera; 13 import android.os.Bundle; 14 import android.os.Environment; 15 import android.view.SurfaceHolder; 16 import android.view.SurfaceView; 17 import android.view.View; 18 import android.widget.Button; 19 import android.widget.Toast; 20 21 public class MyCameraActivity extends Activity 22 { 23 private SurfaceView mSurfaceView = null; 24 private SurfaceHolder mSurfaceHolder = null; 25 private Button takePictureButton = null; 26 private Camera mCamera; 27 //记录保存的是第几张图片 28 private int whichPicture = 0; 29 30 /** Called when the activity is first created. */ 31 @Override 32 public void onCreate(Bundle savedInstanceState) 33 { 34 super.onCreate(savedInstanceState); 35 setContentView(R.layout.main); 36 37 takePictureButton = (Button)this.findViewById(R.id.button); 38 mSurfaceView = (SurfaceView)this.findViewById(R.id.surfaceview); 39 mSurfaceHolder = mSurfaceView.getHolder(); 40 mSurfaceHolder.addCallback(new SurfaceHolderCallback()); 41 //设置缓冲区类型 42 mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 43 //拍照按钮监听 44 takePictureButton.setOnClickListener(new View.OnClickListener() 45 { 46 47 @Override 48 public void onClick(View v) 49 { 50 // TODO Auto-generated method stub 51 //拍照 52 mCamera.takePicture(null, null, pictureCallback); 53 } 54 }); 55 56 } 57 58 private class SurfaceHolderCallback implements SurfaceHolder.Callback 59 { 60 61 @Override 62 public void surfaceChanged(SurfaceHolder holder, int format, int width, 63 int height) { 64 // TODO Auto-generated method stub 65 66 } 67 68 @Override 69 public void surfaceCreated(SurfaceHolder holder) 70 { 71 // TODO Auto-generated method stub 72 //打开摄像头 73 mCamera = Camera.open(); 74 try { 75 mCamera.setPreviewDisplay(mSurfaceHolder); 76 } catch (IOException e) { 77 // TODO Auto-generated catch block 78 e.printStackTrace(); 79 } 80 //获取摄像头参数 81 Camera.Parameters mParameters = mCamera.getParameters(); 82 //设置图片格式 83 mParameters.setPictureFormat(PixelFormat.JPEG); 84 mCamera.setParameters(mParameters); 85 //开始预览 86 mCamera.startPreview(); 87 } 88 89 @Override 90 public void surfaceDestroyed(SurfaceHolder holder) 91 { 92 // TODO Auto-generated method stub 93 if(mCamera!=null) 94 { 95 //停止预览 96 mCamera.stopPreview(); 97 //释放摄像头 98 mCamera.release(); 99 mCamera = null; 100 } 101 } 102 103 } 104 105 //拍照回调 106 private Camera.PictureCallback pictureCallback = new Camera.PictureCallback() 107 { 108 109 @Override 110 public void onPictureTaken(byte[] data, Camera camera) 111 { 112 // TODO Auto-generated method stub 113 //停止预览 114 mCamera.stopPreview(); 115 Bitmap mBitmap; 116 mBitmap = BitmapFactory.decodeByteArray(data, 0, data.length); 117 //文件路径和文件名 118 File pictureFile = new File(Environment.getExternalStorageDirectory(),"camera"+Integer.toString(whichPicture)+".jpg"); 119 120 try 121 { 122 FileOutputStream mFileOutputStream = new FileOutputStream(pictureFile); 123 //将图像数据压入文件 124 mBitmap.compress(Bitmap.CompressFormat.JPEG, 75, mFileOutputStream); 125 try { 126 //关闭输出流 127 mFileOutputStream.close(); 128 } catch (IOException e) { 129 // TODO Auto-generated catch block 130 e.printStackTrace(); 131 } 132 } 133 catch (FileNotFoundException e) 134 { 135 // TODO Auto-generated catch block 136 e.printStackTrace(); 137 } 138 displayToast("保存成功!"); 139 whichPicture++; 140 //开始预览 141 mCamera.startPreview(); 142 } 143 144 }; 145 146 //显示Toast函数 147 private void displayToast(String s) 148 { 149 Toast.makeText(this, s, Toast.LENGTH_SHORT).show(); 150 } 151 152 }
在真机上运行该程序:
按一下“拍照”按钮:
图片会被保存到sd卡的根目录下面。
相关文章推荐
- Android应用开发提高篇(5)-----Camera使用
- Android应用开发提高篇(5)-----Camera使用
- 使用IntelliJ IDEA(androidstudio前身)开发android移动应用前的基本设置,提高开发效率
- 使用IntelliJ IDEA(androidstudio前身)开发android移动应用前的基本设置,提高开发效率
- 使用WebView同时开发Android和IOS应用
- Android应用开发之(WebView中loadData与loadDataWithBaseURL的使用上的区别)
- 【Android 应用开发】 Application 使用分析
- Android应用开发提高系列(1)——《Practical Java 中文版》读书笔记(上)
- 使用百度地图API进行Android地图应用开发(Eclipse)
- (译)在Android中使用并发提高应用性能
- android应用开发揭秘例4-4笔记(ListView及Adapter的使用)
- 使用Google Map Api在Android平台上开发地图应用2
- Android应用开发之使用Socket进行大文件断点上传续传
- Android 应用开发使用小技巧总结
- Android应用开发中使用Fragment的入门学习教程
- android 应用开发:android studio使用笔记
- Android应用开发:CardView的使用及兼容
- Android应用开发学习—Toast的使用(位置变化及重新自定义)
- 使用Html5开发Android和iOS应用:HBuilder、Html5Plus、MUI
- Android应用开发学习—Toast使用方法大全