Android 照相机的实例应用

 更新时间:2017年08月30日 14:26:33   投稿:lqh  
这篇文章主要介绍了Android 照相机的实例应用的相关资料,希望通过此文能掌握Android照相机的使用方法,需要的朋友可以参考下

Android 照相机的实例应用

关键技术:

SurfaceHolder.Callback

public class MyCameraDemo extends Activity { 
  private SurfaceView surface = null ; 
  private Button but = null ; 
  private SurfaceHolder holder = null ; 
  private Camera cam = null ; 
  private boolean previewRunning = true ; 
  @Override 
  public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    super.setContentView(R.layout.main); 
    this.but = (Button) super.findViewById(R.id.but) ; 
    this.surface = (SurfaceView) super.findViewById(R.id.surface) ; 
     
    this.holder = this.surface.getHolder() ; 
    this.holder.addCallback(new MySurfaceViewCallback()) ; 
    //设置缓冲类型 
    this.holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS) ; 
    //设置分辨率 
    this.holder.setFixedSize(600, 350); 
     
    this.but.setOnClickListener(new OnClickListenerImpl()) ; 
  } 
  private class OnClickListenerImpl implements OnClickListener { 
 
    @Override 
    public void onClick(View v) { 
      if(MyCameraDemo.this.cam != null) { 
        //自动对焦 
        MyCameraDemo.this.cam.autoFocus(new AutoFocusCallbackImpl()) ; 
      } 
    } 
     
  } 
   
  private class MySurfaceViewCallback implements SurfaceHolder.Callback { 
 
    //当预览界面格式大小改变时,调用 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, 
        int height) { 
       
    } 
 
    //初次实例化界面调用 
    public void surfaceCreated(SurfaceHolder holder) { 
      MyCameraDemo.this.cam = Camera.open(0) ;  // 取得第一个摄像头 
      //窗口服务 
      WindowManager manager = (WindowManager) MyCameraDemo.this 
          .getSystemService(Context.WINDOW_SERVICE); 
      //取得display显示对象 
      Display display = manager.getDefaultDisplay() ; 
      //照相机参数 
      Parameters param = MyCameraDemo.this.cam.getParameters() ; 
      //将照相机预览大小设置为display大小 
      param.setPreviewSize(display.getWidth(), display.getHeight()) ; 
      param.setPreviewFrameRate(5) ; // 一秒5帧 
      param.setPictureFormat(PixelFormat.JPEG) ; // 图片形式 
      param.set("jpen-quality", 80) ;//图片质量,最高100 
      MyCameraDemo.this.cam.setParameters(param) ; 
      try { 
        MyCameraDemo.this.cam.setPreviewDisplay(MyCameraDemo.this.holder) ; 
      } catch (IOException e) { 
      } 
      MyCameraDemo.this.cam.startPreview() ; // 进行预览 
      MyCameraDemo.this.previewRunning = true ;  // 已经开始预览 
    } 
 
    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
      if(MyCameraDemo.this.cam != null) { 
        if(MyCameraDemo.this.previewRunning) { 
          MyCameraDemo.this.cam.stopPreview() ;  // 停止预览 
          MyCameraDemo.this.previewRunning = false ; 
        } 
        MyCameraDemo.this.cam.release() ; 
      } 
    } 
     
  } 
   
  private class AutoFocusCallbackImpl implements AutoFocusCallback { 
 
    @Override 
    public void onAutoFocus(boolean success, Camera camera) { 
      if(success) {  // 成功 
        MyCameraDemo.this.cam.takePicture(sc, pc, jpgcall) ; 
      } 
    } 
     
  } 
   
  private PictureCallback jpgcall = new PictureCallback() { 
 
    @Override 
    public void onPictureTaken(byte[] data, Camera camera) {  // 保存图片的操作 
      Bitmap bmp = BitmapFactory.decodeByteArray(data, 0, data.length); 
      String fileName = Environment.getExternalStorageDirectory() 
          .toString() 
          + File.separator 
          + "mldnphoto" 
          + File.separator 
          + "MLDN_" + System.currentTimeMillis() + ".jpg"; 
      File file = new File(fileName) ; 
      if (!file.getParentFile().exists()) { 
        file.getParentFile().mkdirs() ; // 创建文件夹 
      } 
      try { 
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file)) ; 
        bmp.compress(Bitmap.CompressFormat.JPEG, 80, bos) ; // 向缓冲区之中压缩图片 
        bos.flush() ; 
        bos.close() ; 
        Toast.makeText(MyCameraDemo.this, 
            "拍照成功,照片已保存在" + fileName + "文件之中!", Toast.LENGTH_SHORT) 
            .show(); 
      } catch (Exception e) { 
        Toast.makeText(MyCameraDemo.this, 
            "拍照失败!", Toast.LENGTH_SHORT) 
            .show(); 
      } 
      MyCameraDemo.this.cam.stopPreview() ; 
      MyCameraDemo.this.cam.startPreview() ; 
    } 
     
  } ; 
   
  private ShutterCallback sc = new ShutterCallback(){ 
    @Override 
    public void onShutter() { 
      // 按下快门之后进行的操作 
    } 
  } ; 
  private PictureCallback pc = new PictureCallback() { 
 
    @Override 
    public void onPictureTaken(byte[] data, Camera camera) { 
       
    } 
     
  } ; 
} 

 主布局函数

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout  
  xmlns:android="http://schemas.android.com/apk/res/android" 
  android:orientation="vertical"  
  android:layout_width="fill_parent" 
  android:layout_height="fill_parent"> 
  <Button 
    android:id="@+id/but"  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"  
    android:text="照相" /> 
  <SurfaceView 
    android:id="@+id/surface" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" />  
</LinearLayout> 

以上就是Android 相机的使用方法,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • Android开发之禁止下拉通知栏的方法

    Android开发之禁止下拉通知栏的方法

    这篇文章主要介绍了Android开发之禁止下拉通知栏的方法,实例分析了Android权限控制与Activity相应设置技巧,需要的朋友可以参考下
    2016-01-01
  • Android应用中使用XmlSerializer序列化XML数据的教程

    Android应用中使用XmlSerializer序列化XML数据的教程

    这篇文章主要介绍了Android应用中使用XmlSerializer序列化XML数据的教程,XmlSerializer序列化XML同时也是将数据写为XML格式的基本方法,需要的朋友可以参考下
    2016-04-04
  • Android侧滑菜单之DrawerLayout用法详解

    Android侧滑菜单之DrawerLayout用法详解

    今天小编就为大家分享一篇关于Android侧滑菜单之DrawerLayout用法详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • 基于Flutter实现动态高斯模糊的流程步骤

    基于Flutter实现动态高斯模糊的流程步骤

    一个App加上高斯模糊会形成一种高级的感觉,本文将介绍如何制作一个根据背景内容来动态高斯模糊,文中有详细的代码实现步骤,代码示例讲解的非常详细,具有一定的参考价值,需要的朋友可以参考下
    2023-11-11
  • Android Button按钮的四种点击事件

    Android Button按钮的四种点击事件

    这篇文章主要为大家详细介绍了Android Button按钮的四种点击事件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • Android最新状态栏处理介绍

    Android最新状态栏处理介绍

    大家好,本篇文章主要讲的是Android最新状态栏处理介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • Kotlin集合List Set Map使用介绍详解

    Kotlin集合List Set Map使用介绍详解

    集合是可变数量(可能为0)的一组条目,kotlin标准库提供一个整套用于集合管理的工具,各种集合对于解决问题都具有重要意义,并且经常用到。kotlin中的集合与Java基本类似
    2022-09-09
  • Android 自定义View手写签名并保存图片功能

    Android 自定义View手写签名并保存图片功能

    这篇文章主要介绍了Android 自定义View手写签名并保存图片功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2020-03-03
  • Android  MeasureSpec的理解和源码的解析

    Android MeasureSpec的理解和源码的解析

    这篇文章主要介绍了Android MeasureSpec的理解和源码的解析的相关资料,希望通过本文大家可以掌握理解这部分内容,需要的朋友可以参考下
    2017-09-09
  • Android实现粒子中心扩散动画效果

    Android实现粒子中心扩散动画效果

    粒子动画效果相比其他动画来说是非常复杂了的,主要涉及三个方面,粒子初始化、粒子位移、粒子回收等问题,本篇将实现两种动画效果,代码基本相同,只是旋转速度不一样,需要的朋友可以参考下
    2024-02-02

最新评论