Android拍照存储.docx

上传人:b****5 文档编号:7280084 上传时间:2023-05-11 格式:DOCX 页数:8 大小:1.23MB
下载 相关 举报
Android拍照存储.docx_第1页
第1页 / 共8页
Android拍照存储.docx_第2页
第2页 / 共8页
Android拍照存储.docx_第3页
第3页 / 共8页
Android拍照存储.docx_第4页
第4页 / 共8页
Android拍照存储.docx_第5页
第5页 / 共8页
Android拍照存储.docx_第6页
第6页 / 共8页
Android拍照存储.docx_第7页
第7页 / 共8页
Android拍照存储.docx_第8页
第8页 / 共8页
亲,该文档总共8页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

Android拍照存储.docx

《Android拍照存储.docx》由会员分享,可在线阅读,更多相关《Android拍照存储.docx(8页珍藏版)》请在冰点文库上搜索。

Android拍照存储.docx

Android拍照存储

首先要使用硬件camera,必须要在manifest文件中声明使用权限,例如应用中要使用camera及自动对焦功能,那么manifest文件中包含下列几行声明:

name="android.permission.CAMERA"/>

name="android.hardware.camera"/>

name="android.hardware.camera.autofocus"/>

通过该类实现照相功能,一般需要下列几个步骤:

1通过函数open(int)获得一个camera对象

2通过函数getParameters()得到一个已有的(默认的)设置

3如果有需要,可以通过函数setParameters(Camera.Parameters),修改第二步返回的Camera.Parameters对象.

4通过函数setDisplayOrientation(int)来设置屏幕的水平或垂直

5重要:

传递一个已经初始化好了的SurfaceHolder对象给函数setPreviewDisplay(SurfaceHolder),如果没有surface,carema是无法打开预览功能。

6重要:

调用函数startPreview()更新预览的surface,开始照相之前必须开启预览功能

7通过函数ltakePicture(Camera.ShutterCallback,Camera.PictureCallback,Camera.PictureCallback,Camera.PictureCallback)实现照相功能.在回调函数中可以得到实际的相片数据.

8每完成一次照相,预览功能会停止。

如果要照更多像,需要再次调用startPreview().

9调用stopPreview()停止预览.

10重要:

调用release()以便其他应用可以方便使用camera.使用camera的应用程序应该在onPause()(并且在onResume()中重新re-open()),立即释放camera.

按照以下步骤快速切换videorecording模式:

1如上所述得到一个初始化的Camera,并开启预览功能.

2调用unlock()使得media进程可以访问camera.

3将camera传递给函数setCamera(Camera).查看关于videorecording的MediaRecorder信息.

4完成了recording,调用reconnect()来re-acquireandre-lockthecamera.

5如果有需要,可以重新开启预览,照更多的相、录更多视频.

6最后如上所述调用函数stopPreview()andrelease()来停止预览.

这个类不是线程安全的,这意味着是通过eventthread使用该类。

在绝大多数需要长时间运行的操作(预览、聚焦、照相等)都是非同步的,只要有需求就会立刻唤醒相关回调函数。

而这些回调函数是由调用open(int)的eventthread来调用的。

故这些类方法一定不能同时在多个线程中运行。

注意:

不同性能的android设备有不同的硬件规格,如兆像素等级和自动对焦性能,为了使你的应用和更多设备兼容,最好不要限制camera规格。

 

拍照录像切换功能

1.Switcher继承自ImageView,在布局文件中直接布局即可

2.mSwitch为true时,滑块在下方,显示拍照界面;当mSwitch为false时,滑块在上方,显示录像界面。

3.当点击或触碰拍照录像切换按钮时:

MotionEvent.ACTION_UP-->tryToSetSwitch()-->mListener.onSwitchChanged(this,onOff)

在camera.java中实现该接口,调用switchToVideoMode()-->MenuHelper.gotoVideoMode(this)-->startCameraActivity(),并结束当前程序。

 

我们要调用摄像头的拍照功能,显然

第一步必须加入调用摄像头硬件的权限,拍完照后我们要将图片保存在SD卡中,必须加入SD卡读写权限,所以第一步,我们应该在Android清单文件中加入以下代码

name="android.permission.CAMERA"/>//摄像头权限

SD卡读写权限

name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

name="android.permission.WRITE_EXTERNAL_STORAGE"/>

第二步,要将摄像头捕获的图像实时地显示在手机上。

我们是用SurfaceView这个视图组件来实现的,因此在main.xml中加入下列代码

android:

layout_width="fill_parent"

android:

layout_height="fill_parent"

android:

id="@+id/surfaceview"

/>

第三步,设置窗口的显示方式

首先获得当前窗口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);

第四步,设置SurficeView显示控件的属性

找到surficeView

surfaceView=(SurfaceView)findViewById(R.id.surfaceview);

设置它的像素为800x600

surfaceView.getHolder().setFixedSize(800,480);

//下面设置surfaceView不维护自己的缓冲区,而是等待屏幕的渲染引擎将内容推送到用户面前

surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

第五步,就是为surficeView加入回调方法(callBack)

surfaceView.getHolder().addCallback(newSurfaceCallback());

上面的回调类是我们自己定义的,代码如下

privateclassSurfaceCallbackimplementsSurfaceHolder.Callback{

@Override

publicvoidsurfaceCreated(SurfaceHolderholder){

try{

camera=Camera.open();//打开硬件摄像头,这里导包得时候一定要注意是android.hardware.Camera

WindowManagerwm=(WindowManager)getSystemService(Context.WINDOW_SERVICE);//得到窗口管理器

Displaydisplay=wm.getDefaultDisplay();//得到当前屏幕

Camera.Parametersparameters=camera.getParameters();//得到摄像头的参数

parameters.setPreviewSize(display.getWidth(),display.getHeight());//设置预览照片的大小

parameters.setPreviewFrameRate(3);//设置每秒3帧

parameters.setPictureFormat(PixelFormat.JPEG);//设置照片的格式

parameters.setJpegQuality(85);//设置照片的质量

parameters.setPictureSize(display.getHeight(),display.getWidth());//设置照片的大小,默认是和屏幕一样大

camera.setParameters(parameters);

camera.setPreviewDisplay(surfaceView.getHolder());//通过SurfaceView显示取景画面

camera.startPreview();//开始预览

isPreview=true;//设置是否预览参数为真

}catch(IOExceptione){

Log.e(TAG,e.toString());

}

}

@Override

publicvoidsurfaceChanged(SurfaceHolderholder,intformat,intwidth,

intheight){

//TODOAuto-generatedmethodstub

}

@Override

publicvoidsurfaceDestroyed(SurfaceHolderholder){

if(camera!

=null){

if(isPreview){//如果正在预览

camera.stopPreview();

camera.release();

}

}

}

}

第六步,我们必须对按键事件进行监听,如是拍照还是聚焦,代码如下

publicbooleanonKeyDown(intkeyCode,KeyEventevent){//处理按键事件

if(camera!

=null&&event.getRepeatCount()==0)//代表只按了一下

{

switch(keyCode){

caseKeyEvent.KEYCODE_BACK:

//如果是搜索键

camera.autoFocus(null);//自动对焦

break;

caseKeyEvent.KEYCODE_DPAD_CENTER:

//如果是中间键

camera.takePicture(null,null,newTakePictureCallback());//将拍到的照片给第三个对象中,这里的TakePictureCallback()是自己定义的,在下面的代码中

break;

}

}

returntrue;//阻止事件往下传递,否则按搜索键会变成系统默认的

}

------------------------------------------------------------------------------------------

privatefinalclassTakePictureCallbackimplementsPictureCallback{

publicvoidonPictureTaken(byte[]data,Cameracamera){

try{

Bitmapbitmap=BitmapFactory.decodeByteArray(data,0,data.length);

Filefile=newFile(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".jpg");

FileOutputStreamoutputStream=newFileOutputStream(file);

press(CompressFormat.JPEG,100,outputStream);

outputStream.close();

camera.stopPreview();

camera.startPreview();//处理完数据之后可以预览

}catch(Exceptione){

Log.e(TAG,e.toString());

}

}

}

注意,代码中有两个回调类,一个是SurfaceCallback(),另外一个是TakePictureCallback(),初学者可能一时难以理解,通俗地讲,前者是用来监视surficeView这个暂时存放图片数据的显示控件的,根据它的显示情况调用不同的方法,包括surfaceCreated(),surfaceChanged(),surfaceDestroyed(),也就不难理解为什么会有这三个回调方法了(注意,在surfaceDestroyed()方法中必须释放摄像头,详细代码参见上方)。

TakePictureCallback()是为了监视是否拍照而设计的接口,期中也仅有一个方法,camera将拍照得到的数据传入方法,我们便可以对拍照得到的数据进行进一步处理了。

至此,简单的拍照功能介绍完毕!

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

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2