EX07_15.java
上传用户:vip_99
上传日期:2021-03-27
资源大小:61159k
文件大小:8k
源码类别:

android开发

开发平台:

Java

  1. package irdc.ex07_15;
  2. import java.io.BufferedOutputStream;
  3. import java.io.File;
  4. import java.io.FileOutputStream;
  5. import android.app.Activity;
  6. import android.graphics.Bitmap;
  7. import android.graphics.BitmapFactory;
  8. import android.graphics.PixelFormat;
  9. /* 引用Camera类 */
  10. import android.hardware.Camera;
  11. /* 引用PictureCallback作为取得拍照后的事件 */
  12. import android.hardware.Camera.PictureCallback;
  13. import android.hardware.Camera.ShutterCallback;
  14. import android.os.Bundle;
  15. import android.util.DisplayMetrics;
  16. import android.util.Log;
  17. import android.view.SurfaceHolder;
  18. import android.view.SurfaceView;
  19. import android.view.View;
  20. import android.view.Window;
  21. import android.widget.Button;
  22. import android.widget.ImageView;
  23. import android.widget.TextView;
  24. import android.widget.Toast;
  25. /* 使Activity实现SurfaceHolder.Callback */
  26. public class EX07_15 extends Activity
  27. implements SurfaceHolder.Callback
  28. {
  29.   /* 创建私有Camera对象 */
  30.   private Camera mCamera01;
  31.   private Button mButton01, mButton02, mButton03;
  32.   
  33.   /* 作为review照下来的相片之用 */
  34.   private ImageView mImageView01;
  35.   private TextView mTextView01;
  36.   private String TAG = "HIPPO";
  37.   private SurfaceView mSurfaceView01;
  38.   private SurfaceHolder mSurfaceHolder01;
  39.   //private int intScreenX, intScreenY;
  40.   
  41.   /* 默认相机预览模式为false */
  42.   private boolean bIfPreview = false;
  43.   
  44.   /* 将照下来的图片存储在此 */
  45.   private String strCaptureFilePath = "/sdcard/camera_snap.jpg";
  46.   
  47.   /** Called when the activity is first created. */
  48.   @Override
  49.   public void onCreate(Bundle savedInstanceState)
  50.   {
  51.     super.onCreate(savedInstanceState);
  52.     
  53.     /* 使应用程序全屏幕运行,不使用title bar */
  54.     requestWindowFeature(Window.FEATURE_NO_TITLE);
  55.     setContentView(R.layout.main);
  56.     
  57.     /* 判断存储卡是否存在 */
  58.     if(!checkSDCard())
  59.     {
  60.       /* 提醒User未安装存储卡 */
  61.       mMakeTextToast
  62.       (
  63.         getResources().getText(R.string.str_err_nosd).toString(),
  64.         true
  65.       );
  66.     }
  67.     
  68.     /* 取得屏幕解析像素 */
  69.     DisplayMetrics dm = new DisplayMetrics();
  70.     getWindowManager().getDefaultDisplay().getMetrics(dm);
  71.     //intScreenX = dm.widthPixels;
  72.     //intScreenY = dm.heightPixels;
  73.     //Log.i(TAG, Integer.toString(intScreenX));
  74.         
  75.     mTextView01 = (TextView) findViewById(R.id.myTextView1);
  76.     mImageView01 = (ImageView) findViewById(R.id.myImageView1);
  77.     
  78.     /* 以SurfaceView作为相机Preview之用 */
  79.     mSurfaceView01 = (SurfaceView) findViewById(R.id.mSurfaceView1);
  80.     
  81.     /* 绑定SurfaceView,取得SurfaceHolder对象 */
  82.     mSurfaceHolder01 = mSurfaceView01.getHolder();
  83.     
  84.     /* Activity必须实现SurfaceHolder.Callback */
  85.     mSurfaceHolder01.addCallback(EX07_15.this);
  86.     
  87.     /* 额外的设置预览大小设置,在此不使用 */
  88.     //mSurfaceHolder01.setFixedSize(320, 240);
  89.     
  90.     /*
  91.      * 以SURFACE_TYPE_PUSH_BUFFERS(3)
  92.      * 作为SurfaceHolder显示类型 
  93.      * */
  94.     mSurfaceHolder01.setType
  95.     (SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  96.     
  97.     mButton01 = (Button)findViewById(R.id.myButton1);
  98.     mButton02 = (Button)findViewById(R.id.myButton2);
  99.     mButton03 = (Button)findViewById(R.id.myButton3);
  100.     
  101.     /* 打开相机及Preview */
  102.     mButton01.setOnClickListener(new Button.OnClickListener()
  103.     {
  104.       @Override
  105.       public void onClick(View arg0)
  106.       {
  107.         // TODO Auto-generated method stub
  108.         
  109.         /* 自定义初始化打开相机函数 */
  110.         initCamera();
  111.       }
  112.     });
  113.     
  114.     /* 停止Preview及相机 */
  115.     mButton02.setOnClickListener(new Button.OnClickListener()
  116.     {
  117.       @Override
  118.       public void onClick(View arg0)
  119.       {
  120.         // TODO Auto-generated method stub
  121.         
  122.         /* 自定义重置相机,并关闭相机预览函数 */
  123.         resetCamera();
  124.       }
  125.     });
  126.     
  127.     /* 拍照 */
  128.     mButton03.setOnClickListener(new Button.OnClickListener()
  129.     {
  130.       @Override
  131.       public void onClick(View arg0)
  132.       {
  133.         // TODO Auto-generated method stub
  134.         
  135.         /* 当存储卡存在才允许拍照,存储暂存图像文件 */
  136.         if(checkSDCard())
  137.         {
  138.           /* 自定义拍照函数 */
  139.           takePicture();
  140.         }
  141.         else 
  142.         {
  143.           /* 存储卡不存在显示提示 */
  144.           mTextView01.setText
  145.           (
  146.             getResources().getText(R.string.str_err_nosd).toString()
  147.           );
  148.         }
  149.       }
  150.     });
  151.   }
  152.   
  153.   /* 自定义初始相机函数 */
  154.   private void initCamera()
  155.   {
  156.     if(!bIfPreview)
  157.     {
  158.       /* 若相机非在预览模式,则打开相机 */
  159.       mCamera01 = Camera.open();
  160.     }
  161.     
  162.     if (mCamera01 != null && !bIfPreview)
  163.     {
  164.       Log.i(TAG, "inside the camera");
  165.       
  166.       /* 创建Camera.Parameters对象 */
  167.       Camera.Parameters parameters = mCamera01.getParameters();
  168.       
  169.       /* 设置相片格式为JPEG */
  170.       parameters.setPictureFormat(PixelFormat.JPEG);
  171.       
  172.       /* 指定preview的屏幕大小 */
  173.       parameters.setPreviewSize(320, 240);
  174.       
  175.       /* 设置图片分辨率大小 */
  176.       parameters.setPictureSize(320, 240);
  177.       
  178.       /* 将Camera.Parameters设置予Camera */
  179.       mCamera01.setParameters(parameters);
  180.       
  181.       /* setPreviewDisplay唯一的参数为SurfaceHolder */
  182.       mCamera01.setPreviewDisplay(mSurfaceHolder01);
  183.       
  184.       /* 立即运行Preview */
  185.       mCamera01.startPreview();
  186.       bIfPreview = true;
  187.     }
  188.   }
  189.   
  190.   /* 拍照撷取图像 */ 
  191.   private void takePicture()
  192.   {
  193.     if (mCamera01 != null && bIfPreview) 
  194.     {
  195.       /* 调用takePicture()方法拍照 */
  196.       mCamera01.takePicture
  197.       (shutterCallback, rawCallback, jpegCallback);
  198.     }
  199.   }
  200.   
  201.   /* 相机重置 */
  202.   private void resetCamera()
  203.   {
  204.     if (mCamera01 != null && bIfPreview)
  205.     {
  206.       mCamera01.stopPreview();
  207.       /* 扩展学习,释放Camera对象 */
  208.       //mCamera01.release();
  209.       mCamera01 = null;
  210.       bIfPreview = false;
  211.     }
  212.   }
  213.    
  214.   private ShutterCallback shutterCallback = new ShutterCallback()
  215.   { 
  216.     public void onShutter() 
  217.     { 
  218.       // Shutter has closed 
  219.     } 
  220.   }; 
  221.    
  222.   private PictureCallback rawCallback = new PictureCallback() 
  223.   { 
  224.     public void onPictureTaken(byte[] _data, Camera _camera) 
  225.     { 
  226.       // TODO Handle RAW image data 
  227.     } 
  228.   }; 
  229.   private PictureCallback jpegCallback = new PictureCallback() 
  230.   {
  231.     public void onPictureTaken(byte[] _data, Camera _camera)
  232.     {
  233.       // TODO Handle JPEG image data
  234.       
  235.       /* onPictureTaken传入的第一个参数即为相片的byte */
  236.       Bitmap bm = BitmapFactory.decodeByteArray
  237.                   (_data, 0, _data.length);
  238.       
  239.       /* 创建新文件 */
  240.       File myCaptureFile = new File(strCaptureFilePath);
  241.       try
  242.       {
  243.         BufferedOutputStream bos = new BufferedOutputStream
  244.         (new FileOutputStream(myCaptureFile));
  245.         
  246.         /* 采用压缩转档方法 */
  247.         bm.compress(Bitmap.CompressFormat.JPEG, 80, bos);
  248.         
  249.         /* 调用flush()方法,更新BufferStream */
  250.         bos.flush();
  251.         
  252.         /* 结束OutputStream */
  253.         bos.close();
  254.         
  255.         /* 将拍照下来且存储完毕的图文件,显示出来 */ 
  256.         mImageView01.setImageBitmap(bm);
  257.         
  258.         /* 显示完图文件,立即重置相机,并关闭预览 */
  259.         resetCamera();
  260.         
  261.         /* 再重新启动相机继续预览 */
  262.         initCamera();
  263.       }
  264.       catch (Exception e)
  265.       {
  266.         Log.e(TAG, e.getMessage());
  267.       }
  268.     }
  269.   };
  270.   
  271.   /* 自定义删除文件函数 */
  272.   private void delFile(String strFileName)
  273.   {
  274.     try
  275.     {
  276.       File myFile = new File(strFileName);
  277.       if(myFile.exists())
  278.       {
  279.         myFile.delete();
  280.       }
  281.     }
  282.     catch (Exception e)
  283.     {
  284.       Log.e(TAG, e.toString());
  285.       e.printStackTrace();
  286.     }
  287.   }
  288.   
  289.   public void mMakeTextToast(String str, boolean isLong)
  290.   {
  291.     if(isLong==true)
  292.     {
  293.       Toast.makeText(EX07_15.this, str, Toast.LENGTH_LONG).show();
  294.     }
  295.     else
  296.     {
  297.       Toast.makeText(EX07_15.this, str, Toast.LENGTH_SHORT).show();
  298.     }
  299.   }
  300.   
  301.   private boolean checkSDCard()
  302.   {
  303.     /* 判断存储卡是否存在 */
  304.     if(android.os.Environment.getExternalStorageState().equals
  305.     (android.os.Environment.MEDIA_MOUNTED))
  306.     {
  307.       return true;
  308.     }
  309.     else
  310.     {
  311.       return false;
  312.     }
  313.   }
  314.   
  315.   @Override
  316.   public void surfaceChanged
  317.   (SurfaceHolder surfaceholder, int format, int w, int h)
  318.   {
  319.     // TODO Auto-generated method stub
  320.     Log.i(TAG, "Surface Changed");
  321.   }
  322.   
  323.   @Override
  324.   public void surfaceCreated(SurfaceHolder surfaceholder)
  325.   {
  326.     // TODO Auto-generated method stub
  327.     Log.i(TAG, "Surface Changed");
  328.   }
  329.   
  330.   @Override
  331.   public void surfaceDestroyed(SurfaceHolder surfaceholder)
  332.   {
  333.     // TODO Auto-generated method stub
  334.     /* 当Surface不存在,需要删除图片 */
  335.     try
  336.     {
  337.       delFile(strCaptureFilePath);
  338.     }
  339.     catch(Exception e)
  340.     {
  341.       e.printStackTrace();
  342.     }
  343.     Log.i(TAG, "Surface Destroyed");
  344.   }
  345. }