Android之相机
16lz
2021-01-23
在Android中专门提供了Camera来处理相机相关的时间,Camera是一个专门用来连接和断开服务的类,Camera下面包括如下几个事件:
- Camera.AutoFocusCallback 自动调焦功能
- Camera.ErrorCallback错误信息扑捉
- Camera.parameters 相机的属性参数
- Camera.PictureCallback 拍照、产生图片时触发
- Camera.ShutterCallback 快门设置
- Camera.Size 图片的尺寸
要在Android中使用相机服务很简单,Camera没有构造方法,我们要使用它直接通过open()方法来打开相机设备,然后通过Camera.Parameters对相机的一些属性进行设置,比如输出图片的格式,大小等。使用Camera科技型的操作,如下:
方法说明
autoFocus设置自动对焦
getParameters 得到相机的参数
open启动相机服务
release 释放Camera服务
setParameters 设置预览的参数
setPreviewDisplay设置预览
startpreview开始预览
stopPreview停止预览
takePicture 拍照
这里重点说明一下拍照的方法和使用,takepicture方法要实现3个回调函数,分别是:Camera.ShutterCallback(快门)和两个Camera.PictureCallback(图像数据)。这里我们在拍照之后要取得图像数据就需要实现Camera.PictureCallback的onPictureTaken方法。onPictureTaken中第一个参数就是图像数据,第二个参数则是相机。
下面看一个通过相机拍照的例子,相机需要一个界面来预览当前的拍摄效果,这里可以使用SurfaceView类。
package com.yarin.android.Examples_07_06;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import android.app.Activity;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.PixelFormat;import android.hardware.Camera;import android.hardware.Camera.PictureCallback;import android.os.Bundle;import android.view.KeyEvent;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.Window;public class Activity01 extends Activity{private PreviewmPreview;/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);// Create our Preview view and set it as the content of our activity.mPreview = new Preview(this);setContentView(mPreview);}public boolean onKeyUp(int keyCode, KeyEvent event){switch (keyCode){case KeyEvent.KEYCODE_DPAD_CENTER:mPreview.takePicture();break;}return true;}}/* Preview-显示Preview */class Preview extends SurfaceView implements SurfaceHolder.Callback { SurfaceHolder mHolder; Camera mCamera; Bitmap CameraBitmap; Preview(Context context) { super(context); mHolder = getHolder(); mHolder.addCallback(this); mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } public void surfaceCreated(SurfaceHolder holder) { /* 启动Camera */ mCamera = Camera.open(); try { mCamera.setPreviewDisplay(holder); } catch (IOException exception) { /* 释放mCamera */ mCamera.release(); mCamera = null; // TODO: add more exception handling logic here } } public void surfaceDestroyed(SurfaceHolder holder) { /* 停止预览 */ mCamera.stopPreview(); mCamera = null; } public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { /* 构建Camera.Parameters对相机的参数进行设置 */ Camera.Parameters parameters = mCamera.getParameters(); /* 设置拍照的图片格式 */ parameters.setPictureFormat(PixelFormat.JPEG); /* 设置Preview的尺寸 */ parameters.setPreviewSize(320, 480); /* 设置图像分辨率 */ //parameters.setPictureSize(320, 480); /* 设置相机采用parameters */ mCamera.setParameters(parameters); /* 开始预览 */ mCamera.startPreview(); } /* 拍照片 */ public void takePicture() { if (mCamera != null) { mCamera.takePicture(null, null, jpegCallback); } } /* 拍照后输出图片 */ private PictureCallback jpegCallback = new PictureCallback() { public void onPictureTaken(byte[] _data, Camera _camera) { // TODO Handle JPEG image data CameraBitmap = BitmapFactory.decodeByteArray(_data, 0, _data.length); File myCaptureFile = new File("/sdcard/camera1.jpg"); try { BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(myCaptureFile)); CameraBitmap.compress(Bitmap.CompressFormat.JPEG, 80, bos); bos.flush(); bos.close(); /* 将拍到的图片绘制出来 */ Canvas canvas= mHolder.lockCanvas(); canvas.drawBitmap(CameraBitmap, 0, 0, null); mHolder.unlockCanvasAndPost(canvas); } catch (Exception e) { e.getMessage(); } } };}
更多相关文章
- android中webView JS调用Android的方法、webView的下拉刷新(Swipe
- Android中Activity状态的保存和恢复:onSaveInstanceState和onRest
- android 模拟器中启用相机API支持
- android 连接服务器的方法及安全性问题
- Android 打开相机、相册获取图片文件,支持Android 9.0系统
- android中Bitmap的放大和缩小的方法
- android中LayoutParams设置参数的理解
- Android遍历文件Listfile返回值为null问题解决方法适用Android8.
- Android 最新获取手机内置存储大小,SD卡存储空间大小方法