新闻详情

NEWS DETAILS

相机设置

2020/3/30 12:30:41

  现在手机拍照已经不是什么很高级的功能了,差不多每部手机都可以拍照。随着硬件的发展,像素也越来越高,而且在实际中的应用也越来越广。在Android系统中专门提供了一个类Camera来处理与相机有关的事件。Camera类是专门处理相机的连接与断开的类。Camera有如表11.2所示的几个事件。

         表11.2相机的事件

事件                说明

Camera.AutoFocusCallback 自动调焦功能

Camera.ErrorCallback 错误信息的捕捉

Camera.Parameters       相机的属性参数

Camera.PictureCallback 抽照、产生图片时触发

Camera.PreviewCallback 相机预览设置

Camera.ShutterCallback 快门设置

Camera.Size       出来图片的尺寸

  相机在Android中的应用非常简单,Camera没有构造函数,打开相机用open()就可以了,然后通过Camera.Parameters对相机进行一些属性的设置。下面通过一个实例来讲解相机功能的具体实现,首先看一下预览效果,如图11.5所示。

  相机的预览需要一个界面来显示预览前的界面,这里可以使用SurfaceView类。先看一下这个类的布局。

  (1)布局文件。这个布局文件就是SurfaceView类。

<?xrnl version^" 1.0" enc^ing^utf^-8"?>

<SurfaceView xmlns:android="http://schemas ・android.com/apk/res/android"

android: id=n@ +id/cameraPreview,'

android:layout_width-"fill_parent" ,

android: layout-^height-'* f ill_parentn

>

v/SurfaceView》  

  (2)声明变量及获得它们的实例(详细代码请参考光盘源代码:第11章\CameraDemo\src\com\zhy\camera\CameraDemoActivity.java)。

faceView surfaceview; //SurfaceView^HI ~

private SurfaceHolder sHolder; //声明 SurfaceHolder

private Camera camera; //声明 Camera 类

@Override

publie void onCreate(Bundle savedlnstanceState) {

.QnCrQate (savedTnstanceE匚 ate)小  

setContentview(R.layout.main);

//实例化 Surfaceview

SUj£^ceView = (Surfaceview) findViewByld(R.id.cameraPreview);

SurfaceHolder 实例

sHolder = surfaceview.getHolderf);

sHolder.addCallback (holdercallback) ; //增加一个回调瓯数

] sHolde萃.se"ype (SurfaceHolder. SURFACE_TYPE_PUSH_BUFFERS); 〃设置桑型

  (3)手机上的拍照按钮事件(详细代码请参考光盘源代码:第11章\CameraDemo\src\com\zhy\camera\CameraDemoActivity.java)。

//按键事彳一一手机上的拍照按钮

@Override

public boolean onKeyDown(int keyCode, KeyEvent event) {

if(keyCode-=KeyEvent.KEYCODE_CAMERA){

takePicture();

return true;

}

return super.onKeyDown(keyCode, event);

  (4)拍照功能的实现。这里调用Camera的一个方法takePicture,其中有一个参数就是表11.2说明的Camera.PictureCallback,所以需要实例化这个事件。

TTfSKL ~ ~~

private void takePicture(){

camera. stoppreview () ; //停止预览

//拍照

camera.takePicture(null, null, pictureCallbackJPEG);

}

//回调函数

private Camera. Picturecallback pictureCallbackJPEG = new Camera. PictureCallback ()

{

public void onPictureTaken(byte[I data, Camera camera) {

savePictrue(data);

camera. startPreview (); 〃开始拍照

  (5)保存照片。照片的名称就是拍照当天的时间,通过输出流把照片输出到SD卡中,利用方法write写出照片流。

i private void savePictrue(byte[] data){

i try {

1 //保存照片的名字

String picName = new DateFormat(),format("yyyyMMdd_hhmmss"t

iCalendar.getInstance(Locale.CHINA)) + "”jpeg”;

I FileOutputSt匸earn fileout = new FileOutputStream("/mnt/sdcard/"+

picName) ; //写出文彳牛到SD卡

j fileout.write(data, 0, data.length);

j fileout. flush () ; //刷断流

: fileout.close();//^闭

[ } catch (FileNotFoundException e) {

e.printstackTrace();

} catch (IOException e) {

i e.printstackTrace();

1 _JL }

  (6)打开相机,预览并且进行参数设置。打开相机使用的是方法是open()方法,camera.setPreviewDisplay()方法对相机进行预览设置,Camera.Parameters可以对相机的属性进行设置,如照片的大小等。

//W> WSXHSJIttW®

private SurfaceHolder.Callback holdercallback - new SurfaceHolder.Callback() {.

' //surface画布创建

public void surfaceCreated(SurfaceHolder holder) {

//打开相机 •;

camera= Camera.open(); :

try { ';

: //设置预览 '

camera.setPreviewDisplay(holder); '

[ } catch (IOException e) {

I e.printStackTrace(); E

} I

; } 一 ;

//surface画布改变

public void surfaceChanged (SurfaceHolder holder, int format, int wid th,:

int height) {

//获得相机的参数

Camera.Parameters parameters = camera.getParameters();

//设置照片的大小 :

parameters.setPreviewSize(320, 480); :

//设置照片的格式

parameters.setPictureFormat(PixelFormat.JPEG); j

//设置相机的参数 ;

i camera.setDisplayOrientation(90);

//开始预览

i camera.startPreview();

} [

! //surface画布销毁 f

i public void surfaceDestroyed(SurfaceHolder holder) { j

' //停止预览

! camera.stoppreview();

] //释放相机资源 |

j camera.release();

camera = null;

'■ I

  至此,关于相机的实例就完成了,这个实例主要用到的是SurfaceView类,以及相机的一些事件和Camear中的一些方法,如方法Camera.PictureCallback就是在相机拍照、产生图片时用到的。

公司地址:天津市滨海新区豪威大厦B座

津ICP备2022007965号-2  版权所有,违者必究

小程序

微信