zoukankan      html  css  js  c++  java
  • Android调用摄像头(一)

    我们要调用摄像头的拍照功能,显然
    第一步必须加入调用摄像头硬件的权限,拍完照后我们要将图片保存在SD卡中,必须加入SD卡读写权限,所以第一步,我们应该在Android清单文件中加入以下代码
    <uses-permissionandroid:name="android.permission.CAMERA"/>//摄像头权限
            SD卡读写权限
            <uses-permissionandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
            <uses-permission  android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    第二步,要将摄像头捕获的图像实时地显示在手机上。
    我们是用SurfaceView这个视图组件来实现的,因此在main.xml中加入下列代码
    <SurfaceView  
            android:layout_width="fill_parent" 
            android:layout_height="fill_parent" 
            android:id="@+id/surfaceview"
      />
    第三步,设置窗口的显示方式
            首先获得当前窗口  Windowwindow = getWindow();//得到窗口
            接着设置没有标题  requestWindowFeature(Window.FEATURE_NO_TITLE);//没有标题
            接着设置全屏  window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
                    WindowManager.LayoutParams.FLAG_FULLSCREEN);//设置全屏
            当然,我们在拍照过程中,屏幕必须一致处于高亮状态,因此接着加入下面代码
          window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);//设置高亮
    至此,我们将窗口的显示方式规定死了,然后才能设置窗口上显示的组件(顺序非常重要)
      setContentView(R.layout.main);
    第四步,设置SurficeView显示控件的属性
          找到surficeView
          surfaceView= (SurfaceView) findViewById(R.id.surfaceview);
          设置它的像素为800x600
          surfaceView.getHolder().setFixedSize(800,480);
        //下面设置surfaceView不维护自己的缓冲区,而是等待屏幕的渲染引擎将内容推送到用户面前
                    surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    第五步,就是为surficeView加入回调方法(callBack)
    surfaceView.getHolder().addCallback(new SurfaceCallback());
    上面的回调类是我们自己定义的,代码如下
    private class SurfaceCallbackimplements SurfaceHolder.Callback{
    @Override
    public voidsurfaceCreated(SurfaceHolder holder) {
    try {
    camera =Camera.open();//打开硬件摄像头,这里导包得时候一定要注意是android.hardware.Camera
    WindowManager wm = (WindowManager)getSystemService(Context.WINDOW_SERVICE);//得到窗口管理器
    Display display  = wm.getDefaultDisplay();//得到当前屏幕
    Camera.Parameters parameters =camera.getParameters();//得到摄像头的参数
    parameters.setPreviewSize(display.getWidth(),display.getHeight());//设置预览照片的大小
    parameters.setPreviewFrameRate(3);//设置每秒3帧
    parameters.setPictureFormat(PixelFormat.JPEG);//设置照片的格式
    parameters.setJpegQuality(85);//设置照片的质量
    parameters.setPictureSize(display.getHeight(),display.getWidth());//设置照片的大小,默认是和        屏幕一样大
    camera.setParameters(parameters);
    camera.setPreviewDisplay(surfaceView.getHolder());//通过SurfaceView显示取景画面
    camera.startPreview();//开始预览
    isPreview = true;//设置是否预览参数为真
    } catch (IOException e) {
    Log.e(TAG, e.toString());
    }
    }
     
    @Override
    public voidsurfaceChanged(SurfaceHolder holder, int format, int width,
    int height) {
    // TODO Auto-generated methodstub
    }
                                 
    @Override
    public voidsurfaceDestroyed(SurfaceHolder holder) {
    if(camera!=null){
    if(isPreview){//如果正在预览 
    camera.stopPreview();
    camera.release();
    }
    }
    }
         
            }
     
  • 相关阅读:
    JavaSE 基础 第51节 定义自己的异常
    JavaSE 基础 第50节 Java中的异常链
    JavaSE 基础 第49节 手动抛出异常
    JavaSE 基础 第48节 Java中的异常声明
    JavaSE 基础 第47节 获取异常信息
    JavaSE 基础 第46节 异常的分类
    JavaSE 基础 第45节Java异常快速入门
    JavaSE 基础 第44节 引用外部类的对象
    JavaSE 基础 第43节 静态内部类
    通用爬虫
  • 原文地址:https://www.cnblogs.com/wangdayang/p/14913197.html
Copyright © 2011-2022 走看看