Android 照相机的实例应用

发布时间 - 2026-01-11 03:02:08    点击率:

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  # 相机 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】  Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】  Android自定义listview布局实现上拉加载下拉刷新功能  在centOS 7安装mysql 5.7的详细教程  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  Laravel如何集成Inertia.js与Vue/React?(安装配置)  JS实现鼠标移上去显示图片或微信二维码  Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)  Android中AutoCompleteTextView自动提示  简历在线制作网站免费版,如何创建个人简历?  利用python获取某年中每个月的第一天和最后一天  高防服务器:AI智能防御DDoS攻击与数据安全保障  Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】  Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?  如何在云主机上快速搭建网站?  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  b2c电商网站制作流程,b2c水平综合的电商平台?  php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】  python中快速进行多个字符替换的方法小结  浅谈javascript alert和confirm的美化  Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)  网站优化排名时,需要考虑哪些问题呢?  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  晋江文学城电脑版官网 晋江文学城网页版直接进入  如何快速启动建站代理加盟业务?  如何正确下载安装西数主机建站助手?  EditPlus 正则表达式 实战(3)  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  Laravel中的withCount方法怎么高效统计关联模型数量  Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程  成都网站制作公司哪家好,四川省职工服务网是做什么用?  Laravel如何使用.env文件管理环境变量?(最佳实践)  Python文件操作最佳实践_稳定性说明【指导】  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程  如何在IIS中配置站点IP、端口及主机头?  如何在建站宝盒中设置产品搜索功能?  如何快速生成专业多端适配建站电话?  详解Android中Activity的四大启动模式实验简述  Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解  Laravel如何实现邮箱地址验证功能_Laravel邮件验证流程与配置  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  网站制作企业,网站的banner和导航栏是指什么?  C++时间戳转换成日期时间的步骤和示例代码  大型企业网站制作流程,做网站需要注册公司吗?  Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】  如何快速配置高效服务器建站软件?  Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件