14.3.2 实现自己的拍照Activity(1)

14.3.2  实现自己的拍照Activity(1)

本节的例子代码所在的工程目录是src\ch14\ch14_camera

拍照的核心类是android.hardware.Camera,通过Camera类的静态方法open可以获得Camera对象,并通过Camera类的startPreview方法开始拍照,最后通过Camera类的takePicture方法结束拍照,并在相应的事件中处理照片数据。

上述的过程只是拍照过程的简化。在拍照之前,还需要做如下的准备工作。

指定用于显示拍照过程影像的容器,通常是SurfaceHolder对象。由于影像需要在SurfaceView对象中显示,因此可以使用SurfaceView类的getHolder方法获得SurfaceHolder对象。

在拍照过程中涉及到一些状态的变化。这些状态包括开始拍照(对应surfaceCreated事件方法);拍照状态变化(例如图像格式或方向,对应surfaceChanged事件方法);结束拍照(对应surfaceDestroyed事件方法)。这3个事件方法都是在SurfaceHolder.Callback接口中定义的,因此,需要使用SurfaceHolder接口的addCallback方法指定SurfaceHolder.Callback对象,以便捕捉这3个事件。

拍完照后需要处理照片数据。处理这些数据的工作需要在PictureCallback接口的onPictureTaken方法中完成。当调用Camera类的takePicture方法后,onPictureTaken事件方法被调用。

如果需要自动对焦,需要调用Camera类的autoFocus方法。该方法需要一个AutoFocusCallback类型的参数值。AutoFocusCallback是一个接口,在该接口中定义了一个onAutoFocus方法,当摄像头正在对焦或对焦成功都会调用该方法。

为了使拍照功能更容易使用,本节的例子将拍照功能封装在了Preview类中,代码如下:

 
 
  1. class Preview extends SurfaceView implements SurfaceHolder.Callback  
  2. {  
  3.     private SurfaceHolder holder;  
  4.     private Camera camera;  
  5.     //  创建一个PictureCallback对象,并实现其中的onPictureTaken方法  
  6.     private PictureCallback pictureCallback = new PictureCallback()  
  7.     {  
  8.         //  该方法用于处理拍摄后的照片数据  
  9.         @Override  
  10.         public void onPictureTaken(byte[] data, Camera camera)  
  11.         {  
  12.             //  data参数值就是照片数据,将这些数据以 key-value形式保存,以便其他调用该Activity的程序可  
  13.             //  以获得照片数据  
  14.             getIntent().putExtra("bytes", data);  
  15.             setResult(20, getIntent());  
  16.             //  停止照片拍摄  
  17.             camera.stopPreview();  
  18.             camera = null;  
  19.             //  关闭当前的Activity  
  20.             finish();  
  21.         }  
  22.     };  
  23.     //  Preview类的构造方法  
  24.     public Preview(Context context)  
  25.     {  
  26.         super(context);  
  27.         //  获得SurfaceHolder对象  
  28.         holder = getHolder();  
  29.         //  指定用于捕捉拍照事件的SurfaceHolder.Callback对象  
  30.         holder.addCallback(this);  
  31.         //  设置SurfaceHolder对象的类型  
  32.         holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);  
  33.     }  
  34.     //  开始拍照时调用该方法  
  35.     public void surfaceCreated(SurfaceHolder holder)  
  36.     {  
  37.         //  获得Camera对象   
  38.         camera = Camera.open();  
  39.         try  
  40.         {  
  41.             //  设置用于显示拍照影像的SurfaceHolder对象  
  42.             camera.setPreviewDisplay(holder);  
  43.         }  
  44.         catch (IOException exception)  
  45.         {  
  46.             //  释放手机摄像头  
  47.             camera.release();  
  48.             camera = null;  
  49.         }  
  50.     }  
  51.     //  停止拍照时调用该方法  
  52.     public void surfaceDestroyed(SurfaceHolder holder)  
  53.     {  
  54.         //  释放手机摄像头  
  55.         camera.release();  
  56.     }  
  57.     //  拍照状态变化时调用该方法  
  58.     public void surfaceChanged(final SurfaceHolder  holder, int format, int w, int h)  
  59.     {  
  60.         try  
  61.         {  
  62.             Camera.Parameters parameters = camera.getParameters();  
  63.             //  设置照片格式  
  64.             parameters.setPictureFormat(PixelFormat.JPEG);  
  65.             // 根据屏幕方向设置预览尺寸  
  66.             if (getWindowManager().getDefaultDisplay().getOrientation() == 0)  
  67.                 parameters.setPreviewSize(h, w);  
  68.             else  
  69.                 parameters.setPreviewSize(w, h);  
  70.             //  设置拍摄照片的实际分辨率,本例中的分辨率是1024×768  
  71.             parameters.setPictureSize(1024, 768);  
  72.             // 设置保存的图像大小  
  73.             camera.setParameters(parameters);  
  74.             //  开始拍照  
  75.             camera.startPreview();  
  76.             //  准备用于表示对焦状态的图像(类似图14.8所示的对焦符号)  
  77.             ivFocus.setImageResource(R.drawable.focus1);  
  78.             LayoutParams layoutParams = new LayoutParams(  
  79.                     LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);  
  80.             ivFocus.setScaleType(ScaleType.CENTER);  
  81.             addContentView(ivFocus, layoutParams);  
  82.             ivFocus.setVisibility(VISIBLE);  
  83.             // 自动对焦  
  84.             camera.autoFocus(new AutoFocusCallback()  
  85.             {  
  86.                 @Override  
  87.                 public void onAutoFocus(boolean success, Camera camera)  
  88.                 {  
  89.                     if (success)  
  90.                     {  
  91.                        //  success为true表示对焦成功,改 变对焦状态图像(一个绿色的png图像)  
  92.                         ivFocus.setImageResource(R.drawable.focus2);  
  93.                     }  
  94.                 }  
  95.             });  
  96.         }  
  97.         catch (Exception e)  
  98.         {  
  99.         }  
  100.     }  
  101.     //  停止拍照,并将拍摄的照片传入PictureCallback接口的onPictureTaken方法  
  102.     public void takePicture()  
  103.     {  
  104.         if (camera != null)  
  105.         {  
  106.             camera.takePicture(null, null, pictureCallback);  
  107.         }  
  108.     }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
牙科就诊管理系统利用当下成熟完善的SSM框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的Mysql数据库进行程序开发。实现了用户在线查看数据。管理员管理病例管理、字典管理、公告管理、药单管理、药品管理、药品收藏管理、药品评价管理、药品订单管理、牙医管理、牙医收藏管理、牙医评价管理、牙医挂号管理、用户管理、管理员管理等功能。牙科就诊管理系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。 管理员在后台主要管理病例管理、字典管理、公告管理、药单管理、药品管理、药品收藏管理、药品评价管理、药品订单管理、牙医管理、牙医收藏管理、牙医评价管理、牙医挂号管理、用户管理、管理员管理等。 牙医列表页面,此页面提供给管理员的功能有:查看牙医、新增牙医、修改牙医、删除牙医等。公告信息管理页面提供的功能操作有:新增公告,修改公告,删除公告操作。公告类型管理页面显示所有公告类型,在此页面既可以让管理员添加新的公告信息类型,也能对已有的公告类型信息执行编辑更新,失效的公告类型信息也能让管理员快速删除。药品管理页面,此页面提供给管理员的功能有:新增药品,修改药品,删除药品。药品类型管理页面,此页面提供给管理员的功能有:新增药品类型,修改药品类型,删除药品类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值