• 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();
    }
    }
    }
         
            }
     
  • 相关阅读:
    随便写的,关于外部提交按钮
    thinkPHP--empey标签
    ramdajs库应用场景
    数组常用用法--map,filter,reduce
    接口签名
    四种常见的 POST 提交数据方式
    localhost、127.0.0.1和0.0.0.0和本机IP的区别
    ftp与sftp
    本地已有项目上传git
    github和gitlab比较
  • 原文地址:https://www.cnblogs.com/wangdayang/p/14913197.html
Copyright © 2020-2023  润新知