zoukankan      html  css  js  c++  java
  • 基于android的远程视频监控系统——实现,

    本帖仅献给和我一样热爱Android开发,并渴望学习的朋友们。
    现在我将分享我的学习过程,希望大家通过学习也能够独立完成这个简单的系统。
    (PS.这个系统是我在学习java和android一个月的时间内鼓捣出来的,所以没有基础的朋友也不要担心。分几步,一切就简单了)

    如标题所述,今天我们将学习如何打开摄像头,并在屏幕上预览图像。使用Camera的步骤:
    (1)调用Camera的open()方法打开相机;
    (2)调用Camera的getParameters()方法获取拍照参数,该方法返回一个Camera.Parameters对象;
    (3)调用Camera的setParameters()方法//android2.3.3以后无需此步;
    (4)调用Camera的startPreview()方法开始预览取景,在预览取景之前需要调用Camera的setPreviewDisplay(SurfaceHolder holder)方法设置使用哪个surfaceview来显示取景图片;
    (5)结束程序时,调用Camera的stopPreview()结束取景预览,并调用release()方法释放资源。
    以上过程参考《疯狂android讲义》,这本书确实不错,能够快速入门。整个系统大部分框架是参考此书的,部分问题在网上搜的资料。

    1.在AndroidManifest.xml文件中添加camera的权限

        <!-- 授予程序使用摄像头的权限 -->
            <uses-permission android:name="android.permission.CAMERA" /> 
            <uses-feature android:name="android.hardware.camera" /> 
            <uses-feature android:name="android.hardware.camera.autofocus" />
    

    2.在界面布局文件中添加一个surfaceview用于显示预览图片

    <SurfaceView
            android:id="@+id/sView"
            android:layout_width="fill_parent" 
            android:layout_height="fill_parent"
            />
    

    3.程序主体
    在这里我们定义了一个SurfaceView变量sView用于获取布局文件中定义的SurfaceView组件。
    我们在SurfaceView被创建时调用initcamera()初始化摄像头,在SurfaceView被销毁时释放摄像头。而这两个时间是通过surfaceHolder.addCallback得到的,看看下面代码就明白了。

    public class MainActivity extends Activity {
    
            SurfaceView sView;
            SurfaceHolder surfaceHolder;
            int screenWidth, screenHeight;
            // 定义系统所用的照相机
            Camera camera;
            //是否在浏览中
            boolean isPreview = false;
        @Override
            public void onCreate(Bundle savedInstanceState)
            {
                    super.onCreate(savedInstanceState);
                    // 设置全屏
                    requestWindowFeature(Window.FEATURE_NO_TITLE);
                    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                            WindowManager.LayoutParams.FLAG_FULLSCREEN);
                    setContentView(R.layout.activity_main);
                    WindowManager wm = (WindowManager) getSystemService(
                            Context.WINDOW_SERVICE);
                    Display display = wm.getDefaultDisplay();
                    // 获取屏幕的宽和高
                    screenWidth = display.getWidth();
                    screenHeight = display.getHeight();
                    // 获取界面中SurfaceView组件
                    sView = (SurfaceView) findViewById(R.id.sView);
                    // 获得SurfaceView的SurfaceHolder
                    surfaceHolder = sView.getHolder();
                    // 为surfaceHolder添加一个回调监听器
                    surfaceHolder.addCallback(new Callback()
                    {
                            @Override
                            public void surfaceChanged(SurfaceHolder holder, int format, int width,
                                    int height)
                            {
                            }
                            @Override
                            public void surfaceCreated(SurfaceHolder holder)
                            {
                                    // 打开摄像头
                                    initCamera();
                            }
                            @Override
                            public void surfaceDestroyed(SurfaceHolder holder)
                            {
                                    // 如果camera不为null ,释放摄像头
                                    if (camera != null)
                                    {
                                            if (isPreview)
                                                    camera.stopPreview();
                                            camera.release();
                                            camera = null;
                                    }
                            }                
                    });
                    // 设置该SurfaceView自己不维护缓冲    
                    surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
            }
    
            private void initCamera()
            {
                    if (!isPreview)
                    {
                            camera = Camera.open();
                    }
                    if (camera != null && !isPreview)
                    {
                            try
                            {
                                    Camera.Parameters parameters = camera.getParameters();
                                    // 设置预览照片的大小
                                    parameters.setPreviewSize(screenWidth, screenHeight);
                                    // 每秒显示4帧
                                    parameters.setPreviewFrameRate(4);
                                    // 设置图片格式
                                    parameters.setPictureFormat(PixelFormat.JPEG);
                                    // 设置JPG照片的质量
                                    parameters.set("jpeg-quality", 85);
                                    //设置照片的大小
                                    parameters.setPictureSize(screenWidth, screenHeight);
                                    //android2.3.3以后无需下步
                                    //camera.setParameters(parameters);
                                    //通过SurfaceView显示取景画面
                                    camera.setPreviewDisplay(surfaceHolder);
                                    // 开始预览
                                    camera.startPreview();
                                    // 自动对焦
                                    camera.autoFocus(null);
                            }
                            catch (Exception e)
                            {
                                    e.printStackTrace();
                            }
                            isPreview = true;
                    }
            }
        
    }

    就这样你就可以使用摄像头预览了。当然你会发现预览的图像转了90度,方向不对。我们在AndroidManifest.xml文件的activity属性设置中添加。

    android:screenOrientation="landscape"
    

    设置成横屏就OK了。如果黑屏请检查camera.setParameters(parameters);这步是否与自己系统匹配,2.3.3以后是不须此步的。
    就这样简单,我们就完成了无线视频监控的第一步,实现了摄像头图像的预览。在这里我们设置了预览但是却没有对每帧图像数据进行处理,下次将讲如何获得摄像头的每一帧图像以及如何处理。

    下面是sdk2.3.3下的源码,在我android4.04系统的手机上也能运行。由于android开发工具的升级,这个源码包跟以前版本有所不同,不知道和旧版本是否有冲突。如过不行大家新建个工程,再把3个关键文件的内容复制过去应该没问题。

    源码:

    CameraPreview.rar

    值得推荐的活动:1.写博客推荐高薪工作 写博客送小米2代&魅族MX

                                2.转帖就送30下载豆

                                3.关注http://weibo.com/u/2975543812得好礼

     

    顺便推荐下各地开发QQ群:

    广州群252743081
    广州超级群218251417
    南京群 220818530
    上海群252742977
    深圳群252742753(已满)
    深圳群之二 260134856
    成都群 252743807
    北京群111059554
    西安群252746034
    武汉群121592153
    杭州群253603803
    厦门群253604146
    湖南群217494504
    大连群253672904
    青岛群 257925319

  • 相关阅读:
    Understanding performance, load and stress testing
    添加查看原型的插件
    Navicat Premium 15安装破解
    APP 测试 与 WEB 测试的本质区别
    app专项测试(稳定性测试、安全性测试)
    ubantu在登录界面一致循环的问题
    Ubuntu虚拟机安装
    装WIN7
    Linux线程模型浅析
    django中常用的数据查询方法
  • 原文地址:https://www.cnblogs.com/tijing/p/2668564.html
Copyright © 2011-2022 走看看