这里有新鲜出炉的精品教程,程序狗速度看过来!
Android 是一种基于 Linux 的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由 Google 公司和开放手机联盟领导及开发。尚未有统一中文名称,中国大陆地区较多人使用 "安卓" 或 "安致"。
本篇文章主要介绍了 Android Camera 实现毫秒级拍照实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
我们知道自定义 Camera 需要以下几步
1、打开相机
- public static Camera openFacingBackCamera() {
- Camera cam = null;
- Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
- for (int camIdx = 0, cameraCount = Camera.getNumberOfCameras(); camIdx < cameraCount; camIdx++) {
- Camera.getCameraInfo(camIdx, cameraInfo);
- if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
- try {
- //打开相应的摄像头,目前是前置摄像头
- cam = Camera.open(camIdx);
- } catch (RuntimeException e) {
- e.printStackTrace();
- if (cam!=null){
- cam.stopPreview();
- cam.release();
- }
- cam = null;
- }
- }
- }
- return cam;
- }
2、设置相关参数和预览
- //定义SurfaceView
- private SurfaceView localSurface;
- // 为surfaceHolder添加一个回调监听器
- localSurface.getHolder().addCallback(new SurfaceHolder.Callback() {
- @Override
- public void surfaceCreated(SurfaceHolder holder) {
- }
- @Override
- public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
- camera = CameraUtil.openFacingBackCamera();
- //设置相机预览旋转角度
- camera.setDisplayOrientation(180);
- if (camera != null) {
- Camera.Parameters parameters = camera.getParameters();// 获得相机参数
- List<Camera.Size> sizes = parameters.getSupportedPreviewSizes();
- List<Camera.Size> sizes_pic = parameters.getSupportedPictureSizes();
- Camera.Size cs = sizes.get(0);
- int mWidth = cs.width;
- int mHeight = cs.height;
- parameters.setPreviewSize(mWidth, mHeight);
- parameters.setPictureSize(sizes_pic.get(0).width, sizes_pic.get(0).height);
- parameters.setJpegQuality(85);//
- parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
- parameters.setPictureFormat(ImageFormat.JPEG);
- camera.setParameters(parameters);
- try {
- camera.setPreviewDisplay(localSurface.getHolder());
- camera.startPreview(); // 开始预览
- camera.autoFocus(null); // 自动对焦
- } catch (IOException e) {
- e.printStackTrace();
- camera.stopPreview();
- camera.release();
- camera = null;
- }
- }
- }
- @Override
- public void surfaceDestroyed(SurfaceHolder holder) {
- if (camera!=null){
- camera.stopPreview();
- camera.release();
- camera = null;
- }
- }
- } );
- // 设置该SurfaceView自己不维护缓冲
- localSurface.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
3、获取图片
- private void getViewImage() {
- //设置监听
- camera.setPreviewCallback(new Camera.PreviewCallback(){
- @Override
- public void onPreviewFrame(byte[] data, Camera camera) {
- Camera.Size size = camera.getParameters().getPreviewSize();
- try{
- YuvImage image = new YuvImage(data, ImageFormat.NV21, size.width, size.height, null);
- if(image!=null){
- ByteArrayOutputStream stream = new ByteArrayOutputStream();
- image.compressToJpeg(new Rect(0, 0, size.width, size.height), 80, stream);
- Bitmap bmp = BitmapFactory.decodeByteArray(stream.toByteArray(), 0, stream.size());
- //因为图片会放生旋转,因此要对图片进行旋转到和手机在一个方向上
- rotateBitmap(bmp);
- stream.close();
- }
- }catch(Exception ex){
- Log.e("Sys","Error:"+ex.getMessage());
- }
- }
- });
- }
旋转图片的方法
- public void rotateMyBitmap(Bitmap bmp){
- Matrix matrix = new Matrix();
- matrix.postScale(-1, 1); // 镜像水平翻转(如果左右颠倒)
- matrix.postRotate(180);
- Bitmap nbmp = Bitmap.createBitmap(bmp, 0,0, bmp.getWidth(), bmp.getHeight(), matrix, true);
- imageView.setImageBitmap(nbmp);
- };
自定义时间拍照
- private Handler mHandler = new Handler() {
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case 101:
- getViewImage();
- Log.e(TAG, "handleMessage: 拍照" );
- mHandler.sendEmptyMessageDelayed(102, 100);
- break;
- case 102:
- camera.setPreviewCallback(null);
- break ;
- }
- }
- };
然后点击按钮调用
- mHandler.sendEmptyMessageDelayed(101, 100);
来源: http://www.phperz.com/article/17/0623/336128.html