zoukankan      html  css  js  c++  java
  • SurfaceView之拍照

    SurfaceView只有当activity显示到了前台,该控件才会被创建,因此需要监听SurfaceView的创建。

    1   // SurfaceView只有当activity显示到了前台,该控件才会被创建     因此需要监听surfaceview的创建
    2   holder.addCallback(new MySurfaceCallback());
    在拍照的时候相机是被占用的,拍照之后需要重新开启预览。
     
    具体拍照的demo:
      1 package com.android.hzy.takepicture;
      2 
      3 import java.io.File;
      4 import java.io.FileOutputStream;
      5 import java.io.IOException;
      6 
      7 import android.app.Activity;
      8 import android.hardware.Camera;
      9 import android.hardware.Camera.Parameters;
     10 import android.hardware.Camera.PictureCallback;
     11 import android.os.Bundle;
     12 import android.os.Environment;
     13 import android.util.Log;
     14 import android.view.SurfaceHolder;
     15 import android.view.SurfaceHolder.Callback;
     16 import android.view.SurfaceView;
     17 import android.view.View;
     18 import android.view.Window;
     19 import android.view.WindowManager;
     20 
     21 public class MainActivity extends Activity {
     22     
     23     private SurfaceView surfaceview;
     24     private Camera camera;
     25 
     26     @Override
     27     protected void onCreate(Bundle savedInstanceState) {
     28         super.onCreate(savedInstanceState);
     29         requestWindowFeature(Window.FEATURE_NO_TITLE); // 没有标题  必须在设置布局之前找到调用
     30         setContentView(R.layout.activity_main);
     31         
     32         getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, // 设置全屏显示
     33                 WindowManager.LayoutParams.FLAG_FULLSCREEN);
     34         
     35         surfaceview = (SurfaceView) findViewById(R.id.surfaceview);
     36         SurfaceHolder holder = surfaceview.getHolder();
     37         holder.setFixedSize(176, 155);// 设置分辨率 
     38         holder.setKeepScreenOn(true);
     39         holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
     40         
     41         // SurfaceView只有当activity显示到了前台,该控件才会被创建     因此需要监听surfaceview的创建
     42         holder.addCallback(new MySurfaceCallback());
     43         
     44     }
     45     
     46     /**
     47      * 监听surfaceview的创建
     48      * @author Administrator
     49      *    Surfaceview只有当activity显示到前台,该空间才会被创建
     50      */
     51     private final class MySurfaceCallback implements Callback{
     52 
     53         @Override
     54         public void surfaceChanged(SurfaceHolder holder, int format, int width,
     55                 int height) {
     56             // TODO Auto-generated method stub
     57             
     58         }
     59 
     60         @Override
     61         public void surfaceCreated(SurfaceHolder holder) {
     62             // TODO Auto-generated method stub
     63 
     64             try {
     65                 // 当surfaceview创建就去打开相机
     66                 camera = Camera.open();
     67                 Parameters params = camera.getParameters();
     68                 Log.i("i", params.flatten());
     69                 params.setJpegQuality(80);  // 设置照片的质量
     70                 params.setPictureSize(1024, 768);
     71                 params.setPreviewFrameRate(5);  // 预览帧率
     72                 camera.setParameters(params); // 将参数设置给相机
     73                 // 设置预览显示
     74                 camera.setPreviewDisplay(surfaceview.getHolder());
     75                 // 开启预览
     76                 camera.startPreview();
     77             } catch (IOException e) {
     78                 // TODO Auto-generated catch block
     79                 e.printStackTrace();
     80             }
     81             
     82         }
     83 
     84         @Override
     85         public void surfaceDestroyed(SurfaceHolder holder) {
     86             // TODO Auto-generated method stub
     87             if(camera != null){
     88                 camera.release();
     89                 camera = null;
     90             }
     91         }
     92         
     93     }
     94 
     95     public void autofoucs(View v){
     96         // 自动对焦由硬件来完成
     97     }
     98     
     99     public void takepicture(View v){
    100         /*
    101          * shutter:快门被按下
    102          * raw:相机所捕获的原始数据
    103          * jpeg:相机处理的数据
    104          */
    105         camera.takePicture(null, null, new MyPictureCallback());
    106     }
    107     
    108     private final class MyPictureCallback implements PictureCallback{
    109 
    110         @Override
    111         public void onPictureTaken(byte[] data, Camera camera) {
    112             // TODO Auto-generated method stub
    113             try {
    114                 File file = new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".jpg");
    115                 FileOutputStream fos = new FileOutputStream(file);
    116                 fos.write(data);
    117                 // 在拍照的时候相机是被占用的,拍照之后需要重新预览
    118                 camera.startPreview();
    119             } catch (Exception e) {
    120                 // TODO Auto-generated catch block
    121                 e.printStackTrace();
    122             }
    123             
    124         }
    125         
    126     }
    127 
    128 }
  • 相关阅读:
    mvc使用model进行数据的增加修改的方法
    c#导出word在iis部署上报异常
    做个转圈圈的咚咚
    VS2008中AJAX的部署问题(工具箱中无AJAX Extensions选项卡)
    关于 AjaxControlToolkit requires ASP.NET Ajax 4.0 scripts. 错误
    ASP.NET关于继承DropDownList的自定义DDL控件
    线性表顺序表示的C#实现(参考数据结构(C语言版))
    WORD2003出现的乱码
    线性表链式表示的C#实现(参考数据结构(C语言版))
    有错误先找自己的原因(若你百度不出为什么vista开网页慢,可以来试试这方法)
  • 原文地址:https://www.cnblogs.com/androidez/p/2892439.html
Copyright © 2011-2022 走看看