Android应用开发提高篇(5)-----Camera使用

链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/06/2382679.html

一、概述

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         @Override110         public void onPictureTaken(byte[] data, Camera camera) 111         {112             // TODO Auto-generated method stub113             //停止预览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 block130                     e.printStackTrace();131                 }132             } 133             catch (FileNotFoundException e) 134             {135                 // TODO Auto-generated catch block136                 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卡的根目录下面。

时间: 2024-08-03 22:49:27

Android应用开发提高篇(5)-----Camera使用的相关文章

Android应用开发提高篇(1)-----获取本地IP

链接地址:http://www.cnblogs.com/lknlfy/archive/2012/02/21/2361802.html 一.概述 习惯了Linux下的网络编程,在还没用智能机之前就一直想知道怎么得到手机的IP地址(玩智能机之前我是不搞手机应用的).好了,得知Android是基于Linux内核的,那么不就可以利用之前学的Linux下的网络编程方法来获取IP了吗?呵呵,其实这是比较底层的方法,在Android上,完全可以利用Java的API来实现,而且实现的代码非常简单.下面的实现只可

Android JNI开发提高篇

有关JNI的开发技术,我们继续围绕Android平台进行,JNI可以支持C或C++,从目前为止我们写过的JNI代码均为C实现的,即文件名为.C而C++的和这些有什么不同呢? Android平台上的JNI一般使用C还是C++编写呢? Android平台在中间层和大部分的类库的底层使用了C++的开发方式,后缀为.cpp,比如Android Framework.OpenCore.Webkit.SQLite等等.使用C++好处就是可以使用很多库但目前Android不支持STL,我们知道C表示字符串都是字

Android应用开发提高篇(6)-----FaceDetector(人脸检测)

链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/10/2388776.html 一.概述 初次看到FaceDetector这个类时,心里想:Android真的很强大.但直到我实际应用它的时候,心情从高山跌倒了谷底(看实现中的结果就知道了),再仔细看看官方文档,才知道这个类是API LEVEL1的,我就晕了,这就说明这个类很早就有了,但为什么到现在还没有得到改善呢.写这篇文章的目的还有一个,就是想强调一下用SurfaceView来画图的时候,要

Android应用开发提高篇(4)-----Socket编程(多线程、双向通信)(转载)

转自:http://www.cnblogs.com/lknlfy/archive/2012/03/04/2379628.html 一.概述 关于Socket编程的基本方法在基础篇里已经讲过,今天把它给完善了.加入了多线程,这样UI线程就不会被阻塞:实现了客户端和服务器的双向通信,只要客户端发起了连接并成功连接后那么两者就可以随意进行通信了. 二.实现 在之前的工程基础上进行修改就可以了. MyClient工程的main.xml文件不用修改,只需要修改MyClientActivity.java文件

Android应用开发提高篇(2)-----文本朗读TTS(TextToSpeech)

链接地址:http://www.cnblogs.com/lknlfy/archive/2012/02/26/2368696.html 一.概述 TextToSpeech,就是将文本内容转换成语音,在其他的一些应用中经常可以看到.这个功能还是挺强大的,但是用户利用它来编写应用却很简单. 二.要求 能够将文本内容转换成语音并朗读出来:可以一次全部朗读出来,也可以边写边读:可以将文本保存为语音文件. 三.实现 新建工程MySpeak,修改/res/layout/main.xml文件,在里面添加一个Ed

Android应用开发进阶篇-场景文字识别

由于研究生毕业项目需要完成一个基于移动终端的场景文字识别系统,虽然离毕业尚早,但出于兴趣的缘故,近一段抽时间完成了这样一套系统.基本的架构如下: 客户端:Android应用实现拍摄场景图片,大致划出感兴趣文字区域,通过socket通信上传服务器端识别; 服务器端:Python server进行socket通信监听,连通后调用文字识别引擎(exe可执行程序),将识别结果返回; 下面是系统运行示例图: 1. 客户端 包含两个Activity,: MainActivity主界面如上图左1,选择拍摄后调

Android应用开发基础篇(12)-----Socket通信(转载)

转自:http://www.devdiv.com/android_socket_-blog-258060-10594.html 一.概述 网络通信无论在手机还是其他设备上都应用得非常广泛,因此掌握网络编程是非常有必要的,而我觉得socket编程是网络编程的基础.在进入正题之前,先介 绍几点网络知识,一:socket编程有分TCP和UDP两种,TCP是基于连接的,而UDP是无连接的:二:一个TCP连接包括了输入和输出两条独立的 路径:三:服务器必须先运行然后客户端才能与它进行通信.四:客户端与服务

Android应用开发基础篇(12)-----Socket通信

链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/03/2378669.html 一.概述 网络通信无论在手机还是其他设备上都应用得非常广泛,因此掌握网络编程是非常有必要的,而我觉得socket编程是网络编程的基础.在进入正题之前,先介绍几点网络知识,一:socket编程有分TCP和UDP两种,TCP是基于连接的,而UDP是无连接的:二:一个TCP连接包括了输入和输出两条独立的路径:三:服务器必须先运行然后客户端才能与它进行通信.四:客户端与服

Android应用开发基础篇(3)-----ListView

链接地址:http://www.cnblogs.com/lknlfy/archive/2012/02/16/2354625.html 一.概述 ListView是一个列表显示控件,它的应用非常广泛,在很多应用程序中都可以看到它的身影,比如来电通,网易新闻等等,特别是QQ.因此非常有必要熟练掌握它. 二.要求 能够利用ListView显示一些内容,如数据.文本,某一行被点击时有相应的提示:能够实现简单的ListView的动态插入和删除. 三.实现 新建工程MyListView,修改/res/lay