收藏 分享(赏)

Android-浅谈相机研发.pdf

上传人:HR专家 文档编号:6587222 上传时间:2019-04-18 格式:PDF 页数:11 大小:199.40KB
下载 相关 举报
Android-浅谈相机研发.pdf_第1页
第1页 / 共11页
Android-浅谈相机研发.pdf_第2页
第2页 / 共11页
Android-浅谈相机研发.pdf_第3页
第3页 / 共11页
Android-浅谈相机研发.pdf_第4页
第4页 / 共11页
Android-浅谈相机研发.pdf_第5页
第5页 / 共11页
点击查看更多>>
资源描述

1、Android浅谈相机研发(一)在android中应用相机功能,一般有两种:一种是直接调用系统相机,一种自己写的相机。我将分别演示两种方式的使用:第一种:是使用Intet跳转到系统相机,action为:android.m eia.ction.STIL_IMAGE_CAMERAjav代码:1Intetintet=newIntet();/调用照相机2intet.setAction(“android.media.ction.STIL_IMAGE_CAMERA“);3startActivity(intet);复制代码jav代码:4importandroid.ap.Activity;5iportandr

2、oid.contet.Intet;6importandroid.os.Bundle;78publiclasCameraTest_2extndsActivity9/*Caledwhentheactivityisfirstcreatd.*/101Overide12publicvoidonCreat(BundlesavedInstanceStae)13super.onCreat(savedInstanceStae);14setContetView(R.layout.main);15Intetintet=neIntet();/调用照相机16intet.setAction(“android.media.

3、ction.STIL_IMAGE_CAMERA“);17startActivity(intet);1819复制代码想要测试的,可以直接新建一个项目,并且把主activty的代码换成上面的,然后运行,我测试了一下,上面这个代码并不需要权限,毕竟只是调用系统自带的程序。当然网上还有一些其他相关的调用方法,只要设置对了action,那么系统就会调用系统自带的相机.第二种:(1)首先我们要自己创建一个照相,必须考虑用什么控件显示照相机中的预览效果,显然android已经帮我们做好了选择,那就是SurfaceView,而控制SurfaceView则需要一个surfaceHolder,他是系统提供的一个用

4、来设置surfaceie的一个对象,而它通过surfaceView.getolder()这个方法来获得。而Cam era提供一个setPreviwDisplay(SurfaceHolder)的方法来连接surfaceHolder,并通过他来控制surfaceView,而我们则使用android的Cam era类提供了startPreviw()和stopPreviw()来开启和关闭预览.关系如下:Cam eraSurfaceHolderSurfaceView.(2)知道怎么预览了,当然也要知道怎么开启相机.Cam era.open()这是个静态方法,如果相机没有别人用着,则会返回一个相机引用,如

5、果被人用着,则会抛出异常。很奇怪的是,这个方法,不能随便放,如放在构造方法或者onCreat()方法中,都会照成没有预览效果.(3)SurfaceHolder.Calback,这是个holder用来显示surfaceView数据的接口,他分别必须实现3个方法surfaceCreatd()这个方法是surface被创建后调用的surfacehanged()这个方法是当surfaceView发生改变后调用的surfaceDstroyed()这个是当surfaceie销毁时调用的.surfaceHolde通过adCalBack()方法将响应的接口绑定到他身上.surfaceolder还必须设定一个s

6、etType()方法,查看api的时候,发现这个方法已经过时,但是没有写,又会报错。各种奇怪。(4)我用以上知识写了一个MySurfaceView类,他继承于SurfaceView,并在里面实现了照相机的预览功能.这个我觉得最简单的照相机预览代码:jav代码:20importjav.io.IOException;21iportandroid.contet.Context;2importandroid.graphics.PixelFormat;23iportandroid.hardware.Caera;24importandroid.util.Log;25iportandroid.view.Su

7、rfaceHolder;26importandroid.vie.SurfaceViw;2728publiclasMySurfaceViwextndsSurfaceViwimplentsSurfaceHolder.Calback29SurfaceHolderholder;30CameramyCamera;31publicMySurfaceViw(Contextcontext)323super(context);34holder=getHolder();/获得surfaceHolder引用35holder.addCalback(this);36holder.setType(SurfaceHolde

8、r.SURFACE_TYPE_USH_BUFERS);/设置类型373839Overide40publicvoidsurfaceChanged(SurfaceHolderholder,intformat,intwidth,intheight)41myCamera.startPreviw();42434Overide45publicvoidsurfaceCreatd(SurfaceHolderholder)46/TODAuto-generatedmethodstub47if(myCamera=nul)48yCaera=Camera.open();/开启相机,不能放在构造函数中,不然不会显示画面.

9、49try50myCamera.setPreviwDisplay(holder);51catch(IOExceptione)52/TODAuto-generatedcatchblock53e.printSackTrace();545565758Overide59publicvoidsurfaceDstroyed(SurfaceHolderholder)60/TODAuto-generatedmethodstub61myCamera.stopPreviw();/停止预览62yCaera.relase();/释放相机资源63myCamera=nul;64Log.d(“ddd“,“4);656复制代

10、码Android浅谈相机研发(二)jav代码:1importandroid.ap.Activity;2iportandroid.os.Bundle;3importandroid.view.View;4iportandroid.vie.Vie.OnClickListenr;56publiclasCameraTest_3extndsActivity7/*Caledwhentheactivityisfirstcreatd.*/8MySurfaceVimySurface;910Overide1publicvoidonCreat(BundlesavedInstanceStae)12super.onCre

11、at(savedInstanceStae);13mySurface=newMySurfaceViw(this);14setContetVie(mySurface);1516复制代码而且必须给应用添加权限:(5)能够预览了,接下来就是拍照了,拍照用到了一个cam er.tackPiture()这个方法,这个方法,有三个参数分别是ShuterCalBackshuter,PictureCalBackraw,ictureCalBackjpeg.jav代码:17Overide18publicvoidonShuter()19/TODAuto-generatedmethodstub20Log.d(“ddd“

12、,“shuter“);212;23privatePictureCalbackraw=newPictureCalback()24Overide25publicvoidonPictureTaken(bytedata,Cameracmera)26/TODAuto-generatedmethodstub27Log.d(“ddd“,“raw“);2829;30privatePictureCalbackjpeg=newPictureCalback()31Overide32publicvoidonPictureTaken(bytedata,Cameracmera)3/TODAuto-generatedmet

13、hodstub34Log.d(“ddd“,“jpeg“);3536;复制代码当开始拍照时,会依次调用shuter的onShuter()方法,raw的onPictureTaken方法,jpeg的onPictureTaken方法.三个参数的作用是shuter-拍照瞬间调用,raw-获得没有压缩过的图片数据,jpeg-返回jpeg的图片数据当你不需要对照片进行处理,可以直接用nul代替.注意,当调用cam er.takePiture方法后,cam er关闭了预览,这时需要调用startPreviw()来重新开启预览。我用以上知识,加到上面的那个例子,就形成了下面的代码:jav代码:37importj

14、av。io。IOException;38iportandroid。contet。Context;39importandroid。graphics。PixelFormat;40iportandroid。hardware。Caera;41importandroid。hardware。Camera。PictureCalback;42iportandroid。hardware。Caera。ShuterCalback;43importandroid。util。Log;4 iportandroid。view。SurfaceHolder;45importandroid。vie。SurfaceViw;46 p

15、ubliclasMySurfaceViwextndsSurfaceViwimplentsSurfaceHolder。Calback47SurfaceHolderholder;48CameramyCamera;49privateShuterCalbackshuter=newShuterCalback()50Overide51publicvoidonShuter()52/TODAuto-generatedmethodstub53Log。d(“ddd“,“shuter“);545 ;56privatePictureCalbackraw=newPictureCalback()57Overide58pu

16、blicvoidonPictureTaken(bytedata,Cameracmera)59/TODAuto-generatedmethodstub60Log。d(“ddd“,“raw“);6162;63privatePictureCalbackjpeg=newPictureCalback()64Overide65publicvoidonPictureTaken(bytedata,Cameracmera)6 /TODAuto-generatedmethodstub67Log。d(“ddd“,“jpeg“);6869;70publicMySurfaceViw(Contextcontext)717

17、2super(context);73holder=getHolder();/获得surfaceHolder引用74holder。addCalback(this);75holder。setType(SurfaceHolder。SURFACE_TYPE_USH_BUFERS);/设置类型767 publicvoidtackPicture()7879myCamera。takePicture(nul,nul,nul);8081publicvoidvoerTack()8283myCamera。startPreviw();8485Overide86publicvoidsurfaceChanged(Surf

18、aceHolderholder,intformat,intwidth,87intheight)8 myCamera。startPreviw();8990Overide91publicvoidsurfaceCreatd(SurfaceHolderholder)92/TODAuto-generatedmethodstub93if(myCamera=nul)9495myCamera=Camera。open();/开启相机,不能放在构造函数中,不然不会显示画面。96try97myCamera。setPreviwDisplay(holder);98catch(IOExceptione)9 /TODAut

19、o-generatedcatchblock10e。printSackTrace();10102103104Overide105publicvoidsurfaceDstroyed(SurfaceHolderholder)106/TODAuto-generatedmethodstub107myCamera。stopPreviw();/停止预览108myCamera。relase();/释放相机资源109yCaera=nul;101 复制代码Android浅谈相机研发(三)jav代码:1importandroid.ap.Activity;2 iportandroid.os.Bundle;3 impo

20、rtandroid.view.View;4 iportandroid.vie.Vie.OnClickListenr;5 publiclasCameraTest_3extndsActivityimplentsOnClickListenr6 /*Caledwhentheactivityisfirstcreatd.*/7 MySurfaceVimySurface;8 boleanisClicked=false;9 Overide10publicvoidonCreat(BundlesavedInstanceStae)1 super.onCreat(savedInstanceStae);12mySurf

21、ace=newMySurfaceViw(this);13setContetVie(mySurface);14mySurface.stOnClickListenr(this);1516Overide17publicvoidonClick(Viewv)18/TODAuto-generatedmethodstub19if(!isClicked)2021mySurface.tackPicture();2 isClicked=true;23els2425mySurface.voerTack();26isClicked=false;2728复制代码这样就是实现了拍照的功能,那么怎样要图片保存呢?那么这是就

22、需要在那个参数中的jpeg的方法里面进行处理了,那个方法的dat参数,就是相片的数据。我们通过Bitm apFactory。decodeByteAray(dat,0,dat。length)来获得图片并通过io处理,将图片保存到想要保存的位置下面这段代码,是将照片保存到/sdcard/wjh。jpg;并把一些没有用到的代码全部删掉,剩下一些必须的代码jav代码:29importjav.io.BuferdInputSream;30iportjav.io.BuferdOutptSrea;31importjav.io.File;32iportjav.io.FileOutptSream;3importj

23、av.io.IException;34iportjav.io.OutptSream;35importandroid.contet.Context;36iportandroid.graphics.Bitmap;37importandroid.graphics.BitapFactory;38iportandroid.graphics.PixelFormat;39importandroid.hardware.Caera;40iportandroid.hardware.Camera.PictureCalback;41importandroid.hardware.Caera.ShuterCalback;

24、42iportandroid.util.Log;43importandroid.view.SurfaceHolder;4iportandroid.vie.SurfaceViw;4546publiclasMySurfaceViwextndsSurfaceViwimplentsSurfaceHolder.Calback47SurfaceHolderholder;48CameramyCamera;49privatePictureCalbackjpeg=newPictureCalback()5051Overide52publicvoidonPictureTaken(bytedata,Cameracme

25、ra)53/TODAuto-generatedmethodstub54try5Bitmapbm=BitmapFactory.decodeByteAray(data,0,data.length);56Filefile=newFile(“/sdcard/wjh.jpg“);57BuferdOutptSreambos=neBuferdOutptSream(newFileOutptSream(file);58bm.copres(Bitap.CopresFormat.JPEG,10,bos);59bos.flush();60bos.close();61catch(Exceptione)62e.print

26、SackTrace();636465;6publicMySurfaceViw(Contextcontext)6768super(context);69holder=getHolder();/获得surfaceHolder引用70holder.addCalback(this);71holder.setType(SurfaceHolder.SURFACE_TYPE_USH_BUFERS);/设置类型7273publicvoidtackPicture()74myCamera.tkePicture(nul,nul,jpeg);7576publicvoidvoerTack()7myCamera.star

27、tPreviw();787980Overide81publicvoidsurfaceChanged(SurfaceHolderholder,intformat,intwidth,intheight)82myCamera.startPreviw();838485Overide86publicvoidsurfaceCreatd(SurfaceHolderholder)87/TODAuto-generatedmethodstub8if(myCamera=nul)89yCaera=Camera.open();/开启相机,不能放在构造函数中,不然不会显示画面.90try91myCamera.setPreviwDisplay(holder);92catch(IOExceptione)93/TODAuto-generatedcatchblock94e.printSackTrace();959697989Overide10publicvoidsurfaceDstroyed(SurfaceHolderholder)10/TODAuto-generatedmethodstub102myCamera.stopPreviw();/停止预览103yCaera.relase();/释放相机资源104myCamera=nul;105106107复制代码

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 学术论文 > 大学论文

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报