zoukankan      html  css  js  c++  java
  • android开发——自己定义相机(Camera)开发总结

    近期这段时间我一直在开发自己定义相机。谷歌了些网上的demo。发现有非常多各种各样的问题。终于还是从API的camera类開始学习,进行改进。

    以下对之前的实现进行一些总结。

    官方camera API:
    http://developer.android.com/guide/topics/media/camera.html
    中文翻译:
    http://www.cnblogs.com/over140/archive/2011/11/16/2251344.html

    自己定义相机大致实现流程:

    这里写图片描写叙述
    预览Camera这一块。有三个类能够实现:Surfaceview、GLSurfaceView、TextureView。Android4.0自带Camera应用採用SurfaceView预览,Android4.2採用GLSurfaceView来预览。Android4.4採用TextureView。
    这三者的差别和联系请看这篇文章 Android 5.0(Lollipop)中的SurfaceTexture,TextureView, SurfaceView和GLSurfaceView
    我这里总结採用Surfaceview预览camera的自己定义相机开发。

    1. Manifest声明
    确保在清单文件增加Camera权限。存储权限等等。
    2. 创建预览类
    使用SurfaceView控件实现摄像头实时预览画面。


    SurfaceView是View的子类。所以它拥有View的一切方法和属性。

    同一时候多出的Surface专门用来绘制的类。
    SurfaceView有以下三个特点:

        A. 具有独立的画图表面。
    
        B. 须要在宿主窗体上挖一个洞来显示自己。
    
        C. 它的UI绘制能够在独立的线程中进行。这样就能够进行复杂的UI绘制。而且不会影响应用程序的主线程响应用户输入。
    

    来自 Android视图SurfaceView的实现原理分析
    创建一个继承surfaceView和实现SurfaceHolder.Callback的类。SurfaceHolder.CallBack用来监听Surface的变化。实现三个方法:
    (1)surfaceCreated(SurfaceHolder holder):在该类创建的时候调用。进行打开camera操作,怎样实现看下一步。


    (2)surfaceChanged(SurfaceHolder holder, int format, int width,int height):在surface改变时候调用,这里实现图形的绘制。进行開始预览操作,怎样实现看下一步。


    (3)surfaceDestroyed(SurfaceHolder holder):在surface销毁时候调用,这里一般对资源进行释放。进行释放摄像头等操作。
    3. 封装CameraInterface类
    採用单例模式创建CameraInterface类,里面操作Camera的检測、打开、预览、拍照、关闭以及保存图片的回调。

    CheckCamera(Context mContext)
    doOpenCamera(Context mContext,int cameraId)
    doStartPreview(SurfaceHolder holder, float previewRate)
    doStopCamera()
    ...

    这样在上一步里,我们仅仅需获得CameraInterface实例后直接调用方法。这样的方式使Camera的逻辑和界面的UI耦合度减少。同一时候也保证了程序的扩展性和可重用性。
    4. 创建自己定义布局

    第二步的摄像预览类必须被放入一个activity的layout中,连同其他用户界面控件一起(拍照button。摄像头切换)。实现拍照或摄像功能。这里注意要採用FrameLayout容纳摄像预览类,能够把附加的图片信息或控件叠加到实时预览画面上。比方要实现中间亮四周暗的实时预览界面,则我们须要在这里自己定义view。


    5. 创建相机Activity
    这里就是控件注冊,监听控件点击事件等。
    相同的takePicture拍照,切换摄像头后又一次创建相机实例都封装在CameraInterface类中。


    6. 拍照以及保存图片
    拍照会在上一步控件点击事件发生,触发mCamera.takePicture(mShutterCallback, mRawCallback, mJpegPictureCallback);
    这里须要实现拍照的快门声音、拍照保存照片的回调方法。相同都在单例类CameraInterface中实现。
    同一时候要注意需求。假设拍照后继续实时预览,则要再次触发doStartPreview。假设是跳转到预览Activity则通过Intent进行跳转。


    7. 释放摄像头

        /**
         * 停止预览,释放Camera
         */
        public void doStopCamera(){
            if(null != mCamera)
            {
                mCamera.setPreviewCallback(null);
                mCamera.stopPreview(); 
                isPreviewing = false; 
                mPreviwRate = -1f;
                mCamera.release();
                mCamera = null;     
            }
        }
  • 相关阅读:
    Hackerspace
    删除指定的多个文件
    windows 复制 文本文件内容 到剪切板
    Two-Factor Authentication 2FA
    Carriage-Return Line-Feed
    外观模式(Facade) Adapter及Proxy 设计模式之间的关系 flume 云服务商多个sdk的操作 face

    A good example is a User-Agent switcher which changes User-Agent on every request:
    Colly provides a clean interface to write any kind of crawler/scraper/spider
    java的(PO,VO,TO,BO,DAO,POJO)解释
  • 原文地址:https://www.cnblogs.com/lxjshuju/p/7202293.html
Copyright © 2011-2022 走看看