能力拓展训练报告安卓照相机.docx
《能力拓展训练报告安卓照相机.docx》由会员分享,可在线阅读,更多相关《能力拓展训练报告安卓照相机.docx(28页珍藏版)》请在冰豆网上搜索。
能力拓展训练报告安卓照相机
提供源码下载地址:
计算机能力拓展训练任务书
学生姓名:
专业班级:
指导教师:
工作单位:
计算机科学与技术学院
题目:
基于Andriod环境的照相工具的设计
初始条件:
理论:
.NET、Java、Linux、Android或WindowsPhone环境,Oracle、SQLite、SQLServer、SQLServerCE或MySQL数据库,C#、Eclipse、C++或其它合适、有效的开发工具,等等。
实践:
计算机科学系实验中心提供计算机及软件开发环境。
要求完成的主要任务:
(1)分析设计目标:
研究说明课程设计任务、课题要达到的目标
(2)分析设计方法与技术:
研究课题所使用的设计方法,具体的开发环境和工具软件,分析课题使用的技术
(3)设计系统:
包括需求分析、总体设计(包括模块结构)、详细设计(包括界面、核心代码,在确定好的开发环境中利用确定的工具软件进行系统实现)。
(4)编制好程序后,设计若干测试用例,上机测试所设计的系统。
(5)设计报告按学院要求格式要求书写。
时间安排:
1、20周,周1-5,计算机学院实验中心(三楼),设计。
2、20周周5下午,计算机学院实验中心(三楼)汇报设计成果、交课程设计报告、源程序(CD盘)。
指导教师签名:
年月日
系主任(或责任教师)签名:
年月日
基于Andriod环境的照相工具的设计
目录
1、训练要求-----------------------------------------------------2
1.1、能力拓展训练的范围和内容规定如下-----------------2
1.2、能力拓展训练的目标-------------------------------2
2、系统概述------------------------------------------------------2
2.1题目描述------------------------------------------2
2.2背景介绍------------------------------------------2
2.3开发环境------------------------------------------2
3、需求分析-----------------------------------3
4、设计模型-----------------------------------4
4.1总体设计------------------------------------------4
4.2详细设计-----------------------------------------5
4.2.1Android中Camera的主要事件和方法----------------5
4.2.2Mycamera的主要功能设计-------------------------6
4.3MyCamer的界面设计--------------------------------7
4.4软件图标-----------------------------------------9
5、编码和调试--------------------------------------------------9
5.1主要函数编码---------------------------------------9
5.1.1MainActivity--------------------------------------9
5.1.2、PreviewImageView--------------------------------19
5.1.3主要按钮的编码-----------------------------------23
5.2调试中的主要问题与解决措施--------------------------25
6、结果分析-----------------------------------26
7、心得体会-----------------------------------28
8、参考文献-----------------------------------28
1、训练要求
1.1、能力拓展训练的范围和内容规定如下:
1.在信息系统领域,选择一个小型应用问题;
2.对所选应用问题进行需求分析和系统设计;
3.根据题目要求,选定设计开发工具,以及相应软件工具;
4.学习并掌握相关工具的安装及使用;
5.根据软件工程技术设计系统,并在搭建起的开发环境下进行系统开发和调试;
6.所完成的小型系统要能正常运行,达到一个原型系统功能目标。
1.2、能力拓展训练的目标
运用课堂所学的基本理论、技术、方法,通过学习、实践最新的知识与技术,拓展自己的知识层次和计算机应用能力。
通过对当今Web应用程序主流开发技术进行学习,提高自身的实践动手能力和创新能力,使所学更加贴近社会实际需要,为今后走向社会打下较坚实的基础。
2、系统概述
2.1题目描述
基于Andriod环境的照相工具的设计,在Andriod平台上实现简单的照相机应用程序,能在Andriod平台上成功运行。
2.2背景介绍
随着移动设备的不断发展,安卓平台上的应用程序的开发与完善越来越受到开发人员的青睐与重视,对于拍照,人们在日常生活中更趋向于用移动设备的照相机进行拍照存储,因为移动设备上的照相机软件方便并且功能齐全,与此同时照相机软件也在不断的更新,功能越来越全面越来越强大,除了传统的照相机外,还出现了像美图相机、魔漫相机等具有创新意义的照相机软件,了解照相机的基本功能的实现对于我们今后开发和完善照相机具有重要的意义。
因此,通过本次训练主要实现基本的照相机系统的功能,如何调用系统摄像头,如何拍照以及其他一些简单的功能。
2.3开发环境
搭建安卓开发环境需要如下配置:
1、eclipse-SDK-4.2-win64.zip(我的电脑是64位系统)
2、JDK(JavaDevelopmentKit)
3、ADT,安卓开发的一个eclipse的插件,即AndroidDevelopmentTools,为开
发者提供了一个完整的开发环境。
4、SDK,它可以为某个程序设计语言提供应用程序接口API的一些文件,但
也可能包括能与某种嵌入式系统通讯的复杂的硬件。
3、需求分析
随着科技的发展和无线移动互联网的普及,手机的功能越来越强大,人们对手机的需求也不仅仅是基本的打电话或玩简单的小游戏了,人们更多的是希望手机能像电脑一样方便,所以智能手机渐渐成为人们选择的目标。
而Google的Android系统凭借其通用、开源、免费的特点迅速的在短时间内占有了大量的市场,成为时下手机终端产品时下的热门。
而作为Android智能手机的必备功能之一的拍照功能更是常成为用户选择Android产品的重要依据,其质量、稳定性、拍摄效果往往可以左右人们的选择。
Android是基于Linux内核的软件平台和操作系统,是Google在2007年11月5日公布的手机系统平台,早期由Google开发,后由开放手机联盟(OpenHandsetAlliance)开发。
它采用了软件堆层(SoftwareStack,又名以软件叠层)的架构,主要分为三部分。
低层以Linux内核工作为基础,只提供基本功能;其他的应用软件则由各公司自行开发,以Java作为编写程序的一部分。
Android下的Camera模块同样为三部分,应用层,HAL层,Linux驱动层。
应用层由Google提供参考代码,有较完善的接口,HAL层需要与驱动层相配合,HAL层通常由芯片厂商提供参考代码,由于没有统一的标准,不同的芯片公司会有不同的代码结构。
驱动层会涉及Camera控制器驱动和CameraSensor驱动,amera控制器驱动会由芯片厂商提供参考代码,CameraSensor驱动是手机设计公司根据Camera控制器驱动提供的接口来对具体的Camera外设进行初始化和配置以协调Camera控制器和CameraSensor使他们能够正常工作。
但在CameraHAL层到驱动层没有固定的代码编写标准,这就为代码的编写提供了各种的框架结构,不利于手机的研发。
针对这些问题,本文主要利用java程序开发语言,研究如何在安卓平台上实现照相机的基本功能,如何利用API进行控制和配置照相机参数,帮助自己更好的理解
和尽快的解决AndroidCamera相关的问题,提升对安卓平台上应用程序开发的经验。
4、设计模型
4.1总体设计
本软件主要是实现安卓手机的照相功能,不涉及摄像功能。
本软件主要实现照相机软件的简单功能,主要有如下几个主要功能:
1)调用系统摄像头
通过API调用系统的摄像头,取景拍照
2)前置摄像头和后置摄像头的选择
通过设置摄像头模式的参数实现选择前置摄像头还是后置摄像头进行取景拍照
3)自动对焦
通过过调用API函数实现对图片的自动对焦
4)闪光灯的选择;
设置三个闪光灯模式:
自动,闪光,关闭,通过按钮来选择拍照时的闪光灯的模式
5)拍照
通过调用拍照按钮来实现获取照片,并转到预览图片的界面
6)保存图片
在预览图片界面,设置保存图片按钮,如果选择保存则在sd卡上创建文件保存图片,如不选则图片不保存
7)返回继续拍照
在预览图片界面设置返回继续拍照按钮,如果按下返回继续拍照,则跳转到拍照界面继续拍照。
8)在每个界面设置home键
按下home键则返回到手机主界面,退出照相机系统
4.2详细设计
4.2.1Android中Camera的主要事件和方法
Android中专门提供了Camera来处理相机相关的事件,Camera是一个专门用来连接和断开相机服务的类,Camera下面包括如下几个事件:
Camera.AutoFocusCallback:
自动调焦功能;
Camera.ErrorCallback:
错误信息捕捉;
Camera.Parameters:
相机的属性参数
Camera.PictureCallback:
拍照、产生图片时触发;
Camera.PreviewCallback:
相机预览设置;
Camera.ShutterCallback:
快门设置;
Camera.Size:
图片尺寸;
要在Android中使用相机服务很简单,Camera没有构造方法,我们要使用它直接通过open()方法来打开相机设备,然后通过Camera.Parameters对相机的一些属性进行设置,比如输出图片的格式、大小等等。
下面是Camera类一些常用的方法介绍。
这里重点说明一下拍照的方法和使用,takePicture方法要实现3个回调函数,分别是:
Camera.ShutterCallback(快门)和两个Camera.PictureCallback(图像数据)。
这里我们在拍照之后要取得图像数据就需要实现Camera.PictureCallback的onPictureTaken方法。
onPictureTaken中第一个参数就是图像数据,第二个参数则是相机。
4.2.2Mycamera的主要功能设计
相机应用程序拍摄的步骤为相机类提供图像的捕捉启动预览停止预览拍摄照片检索图片保存图片继续拍照。
采用open()方法获得相机实例。
获取与getParameters()相关的配置项目
如果有必要的话,可以重新配置相机特性参数,修改返回的Camera.Parameters对象,并调用setParameters(Camera.Parameters).
如果要改回显示方向的话,则调用setDisplayOrentation(int)
传递完全初始化的SurfaceHoloer给setPreviewDisplay((SurfaceHolder)。
如果没有一个表面景象surface的话,相机将无法启动预览。
调用startPreview()来开始更新预览表面景象surface。
在可以拍摄一张照片之前,就必须是已经可以开始预览。
当你决定要拍摄这一张照片时,调用takePicture(Camera.ShutterCallbackshutter,Camera.PictureCallbackraw,Camera.PictureCallbackpostview,Camera.PictureCallbackjpeg)。
捕获一张照片,然后等待处理的回调,取得实际图像数据。
拍摄一张照片后,预览显示就已经停止了。
然后转到预览拍到的图片决定是否保存图片,图片现在bitmap里面存储,如果需要保存则通过FiledestDir=newFile(dir),Filefile=newFile(dir+"/"+filename)来实现,并且无论是否保存都需要释放bitmap的资源,否侧会出现内存不足的错误。
调用stopPreview()来停止更新预览表面景象surface。
调用release()来释放相机,应用程序应立即在onPause()阶段释放相机,如果想要重新获取相机的实例,要做onResume()中调用reaOpen()方法。
4.3MyCamer的界面设计
1)拍照界面
包含四个ImageButton按钮,分别为拍照按钮,home键按钮,摄像头转换按钮,闪关灯选择按钮。
闪光灯按钮点开为一个listview,分别为:
自动,开启,关闭。
2)照片预览处理界面
包含三个包含三个ImageButton按钮,分别为返回拍照按钮,home键按钮,保存按钮。
4.4软件图标
5、编码和调试
5.1主要函数编码
5.1.1MainActivity
1)主要变量及参数设置:
privatestaticfinalStringTAG="MainActivity";
privateSurfaceViewsurfaceView;
privateCameracamera;
privateImageButtonstartCameraBtn;
privateImageButtonflashModeBtn;
privateImageButtonquitTohome;
privateImageButtonswitchCamera;
finalintFORWARD_CAMERA=1;//前摄像头
finalintBACK_CAMERA=0;//后摄像头
intcameraType=BACK_CAMERA;
privatePopupWindowtipPopupWindow;//弹出窗口
privateRelativeLayoutlayout;
privateListViewlistView;
privateStringflash[]={"自动","开启","关闭"};
privateAudioManagermyAudioManager;//控制音量和模式
privateintringMode;
publicstaticBitmapprviewImageBitMap;
2)onCreate函数的实现主要用来初始化window布局,以及设置拍照进入无声模式
publicvoidonCreate(BundlesavedInstanceState)
{
super.onCreate(savedInstanceState);
Windowwindow=getWindow();
requestWindowFeature(Window.FEATURE_NO_TITLE);
window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,//设置全屏
WindowManager.LayoutParams.FLAG_FULLSCREEN);
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);//让屏幕保持高亮
setContentView(R.layout.main);//布局文件
initView();
myAudioManager=(AudioManager)getSystemService(Context.AUDIO_SERVICE);//获得AudioManager实例对象
setRingMode(myAudioManager.getRingerMode());
//显示信息,短时间
Toast.makeText(MainActivity.this,"无声拍照模式!
",Toast.LENGTH_SHORT).show();
myAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
//是否清空了bitmap
if(MainActivity.prviewImageBitMap==null)
{
Log.v("bitMap","NULL!
");
}
}
3)初始化拍照界面函数,设置对按钮的监听
privatevoidinitView()
{
startCameraBtn=(ImageButton)findViewById(R.id.startCameraBtn);
flashModeBtn=(ImageButton)findViewById(R.id.flashModeBtn);
quitTohome=(ImageButton)findViewById(R.id.quitTohome);
switchCamera=(ImageButton)findViewById(R.id.switchCamera);
startCameraBtn.setOnClickListener(newstartCameraOnClick());
flashModeBtn.setOnClickListener(newflashModeCameraOnClick());
quitTohome.setOnClickListener(newquitTohomeOnClick());
intnumCamera=Camera.getNumberOfCameras();
//Log.v("numCamera","有前置摄像头");
if(numCamera>=2)
{
Log.v("numCamera","有前置摄像头");
switchCamera.setOnClickListener(newswitchCameraOnclick());
}
SharedPreferencessharedPreferences=getSharedPreferences(
"issetValueXml",Context.MODE_PRIVATE);
inti=sharedPreferences.getInt("onoff",0);
if(i==0){
flashModeBtn.setBackgroundResource(R.drawable.flashmode_auto);
}elseif(i==1){
flashModeBtn.setBackgroundResource(R.drawable.flashmode_open);
}elseif(i==2){
flashModeBtn.setBackgroundResource(R.drawable.flashmode_off);
}
surfaceView=(SurfaceView)findViewById(R.id.surfaceView);
surfaceView.getHolder().setFixedSize(surfaceView.getWidth(),
surfaceView.getHeight());
//设置SurfaceHolder对象的类型
surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
//指定用于捕捉拍照事件的SurfaceHolder.Callback对象
surfaceView.getHolder().addCallback(newSurfaceCallback());
}
4)调用camera,并且开始预览景像
publicvoidsurfaceCreated(SurfaceHolderholder)
{
try
{
camera=Camera.open(cameraType);
camera.setDisplayOrientation(getPreviewDegree(MainActivity.this));
camera.setPreviewDisplay(surfaceView.getHolder());
camera.startPreview();
}
catch(IOExceptione)
{
Log.e(TAG,e.toString());
}
}
5)回调函数,获取相机参数
privatefinalclassSurfaceCallbackimplementsSurfaceHolder.Callback
{
@Override
publicvoidsurfaceChanged(SurfaceHolderholder,intformat,intwidth,
intheight)
{
Camera.Parametersparameters=camera.getParameters();
WindowManagerwm=(WindowManager)getSystemService(Context.WINDOW_SERVICE);
Displaydisplay=wm.getDefaultDisplay();
parameters.setPreviewFrameRate(3);
//设置照片格式