• android camera


    布局
    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/content_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="40dp"
        android:paddingLeft="0dp"
        android:paddingRight="0dp"
        android:paddingTop="0dp"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        tools:context="com.admin.smartcam.main.MainActivity"
        tools:showIn="@layout/app_bar_main">
    <FrameLayout
        android:id="@+id/camera_FrameLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
    </FrameLayout>
    
    
    </RelativeLayout>

    1、在android4.0以下的版本支持【 android.hardware.Camera】api

    2、其使用很简单

    代码如下:

    这个类用于返回一个camera
    package com.admin.smartcam.androidcamera.camera;
    
    /**
     * Created by Admin on 2017/4/27 0027.
     * android4.0以下版本使用
     */
    
    public class MinForCamera {
        private static int cameraBackOrFront = 0;
    
        private MinForCamera() {
        }
    
        public void setCamera(int cameraBackOrFront) {
            this.cameraBackOrFront = cameraBackOrFront;
        }
    
    
        private static android.hardware.Camera camera = android.hardware.Camera.open(cameraBackOrFront); // attempt to get a Camera instance
    
        public static android.hardware.Camera getCamera() {
            return camera; // returns null if camera is unavailable
        }
    }
    在MainActivity.java中调用:
        public void initScreen() {
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                    WindowManager.LayoutParams.FLAG_FULLSCREEN);// 设置全屏
            getWindow().setFormat(PixelFormat.TRANSLUCENT);
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);//设置高亮
        }
        @RequiresApi(api = Build.VERSION_CODES.ICE_CREAM_SANDWICH)
        private void startView() {
            if (checkCameraHardware(this) == true) {       //检测相机硬件
                final Camera mCamera = MinForCamera.getCamera();//获得系统摄像机
                showCamera = new ShowCamera(MainActivity.this, mCamera);
                FrameLayout preview = (FrameLayout) findViewById(R.id.camera_FrameLayout);
                preview.addView(showCamera);
    
            }
        }
        /**
         * 检查摄像机是否可用
         *
         * @param context
         * @return
         */
        private boolean checkCameraHardware(Context context) {
            if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
                // this device has a camera
                return true;
            } else {
                // no camera on this device
                return false;
            }
        }
    我使用的是SurfaceView作为显示载体
    package com.admin.smartcam.androidcamera.camera;
    
    import android.content.Context;
    import android.graphics.Paint;
    import android.graphics.PixelFormat;
    import android.hardware.Camera;
    import android.os.Build;
    import android.support.annotation.RequiresApi;
    import android.util.Log;
    import android.view.SurfaceHolder;
    import android.view.SurfaceView;
    import android.view.View;
    import android.widget.Toast;
    
    import java.lang.reflect.Method;
    import java.util.Objects;
    import java.util.Timer;
    import java.util.TimerTask;
    /**
     * 自定义相机显示
     * Created by Admin on 2017/1/31.
     */
    
    @RequiresApi(api = Build.VERSION_CODES.ICE_CREAM_SANDWICH)
    public class ShowCamera extends SurfaceView implements SurfaceHolder.Callback, Camera.AutoFocusCallback, View.OnClickListener, Camera.FaceDetectionListener {
        private SurfaceHolder hold;
        private Camera theCamera;
        private Context context;
        private Paint paint = null;
        Camera.Parameters parameters;
    
        @RequiresApi(api = Build.VERSION_CODES.ICE_CREAM_SANDWICH)
        public ShowCamera(Context context, Camera camera) {
            super(context);
            this.theCamera = camera;
            this.context = context;
            if (cameranumber() <= 0)      //没有可用相机
            {
                Toast.makeText(context, "未检测到可用相机", Toast.LENGTH_SHORT).show();
            } else {
               // videoMed = new VideoMed();  //录制视屏
                hold = getHolder();
                hold.addCallback(this);
                hold.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
            }
    
        }
    
        /**
         * 返回所有可用相机总数
         * @return
         */
        public int cameranumber() {
            return theCamera.getNumberOfCameras();//得到所有可用相机的总数
        }
    
        @RequiresApi(api = Build.VERSION_CODES.ICE_CREAM_SANDWICH)
        @Override
        public void surfaceCreated(SurfaceHolder surfaceHolder) {
            if (Integer.parseInt(Build.VERSION.SDK) >= 15) {
                initCamera(); //相机参数的初始化设置
                hold.addCallback(this); // holder加入回调接口
                // setType必须设置,要不出错.
                hold.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    
                TimerTask task = new TimerTask() {
                    @Override
                    public void run() {
                        //videoMed.StopWriteVideo();
                    }
                };
                Timer timer = new Timer();
                timer.scheduleAtFixedRate(task, 0, 1000);
            } else {
                setDispaly(parameters, theCamera); //控制图像正常显示
                theCamera.cancelAutoFocus();      //如果要实现连续的自动对焦,这一句必须加上
    
            }
    
        }
    
        /**
         * 预览发生改变
         *
         * @param surfaceHolder
         * @param i
         * @param i1
         * @param i2
         */
        @Override
        public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
            if (surfaceHolder.getSurface() == null) {
                // 预览不存在
                return;
            }
            // stop preview before making changes
            try {
                if (parameters.getMaxNumDetectedFaces() > 0)  //检测设备是否支持人脸识别
                    {
                        theCamera.stopFaceDetection();
                    }
                theCamera.stopPreview();
                //theCamera.setPreviewCallback(null);
                //theCamera.release();//释放资源
            } catch (Exception e) {
                Log.d("<<<相机改变>>>", "调整出错!+"+i+">>i1<<"+i1+">>12<<"+i2);
            }
    
            // 在这里做任何调整,旋转或重新格式化变化
            try {
                    theCamera.setPreviewDisplay(surfaceHolder);
                    surfaceHolder.setFixedSize(i,i1);
                    theCamera.startPreview();
                    //设置人脸识别监听
                    if (parameters.getMaxNumDetectedFaces() > 0) {  //检测设备是否支持人脸识别
                        Log.d("启动人脸检测》》","正在启动!");
                        theCamera.startFaceDetection();//启动人脸检测相机需要在startPreview()之后
                        theCamera.setFaceDetectionListener(ShowCamera.this);
                    }
            } catch (Exception e) {
                Log.d("相机改变:>>", "相机改变,调整出错!"+i+">>i1<<"+i1+">>12<<"+i2);
            }
        }
    
        /**
         * 预览结束,关闭相应资源
         * @param surfaceHolder
         */
        @Override
        public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
            if (theCamera != null) {
                try {
                    Log.d("相机销毁:>>", "相机销毁!"+theCamera);
                    //parameters.notify();
                    theCamera.stopFaceDetection();
                    //theCamera.setPreviewCallback(null);
                    theCamera.stopPreview();
                    //theCamera.setPreviewCallbackWithBuffer(null);
                    theCamera.release();
                    theCamera = null;
                    Log.d("相机销毁:>>", "相机销毁成功!"+theCamera);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    
        /**
         * 实现自动对焦
         *
         * @param b
         * @param camera
         */
        @Override
        public void onAutoFocus(boolean b, Camera camera) {
            if (b) {
                camera.cancelAutoFocus();//自动对焦。
            }
        }
    
        //相机参数的初始化设置
        @RequiresApi(api = Build.VERSION_CODES.ICE_CREAM_SANDWICH)
        private void initCamera() {
            if (theCamera != null) {
                Log.d("初始化相机","相机:"+theCamera);
                parameters = theCamera.getParameters();
                parameters.setPictureFormat(PixelFormat.JPEG);
                parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF); //不开启闪光灯 FLASH_MODE_ON//开启闪光灯
                parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);//1连续对焦
                theCamera.setParameters(parameters);
                setDispaly(parameters, theCamera);
                theCamera.cancelAutoFocus();//如果要实现连续的自动对焦,这一句必须加上
                //设置人脸识别监听
                if (parameters.getMaxNumDetectedFaces() > 0) synchronized (Objects.class){  //检测设备是否支持人脸识别
                    theCamera.startPreview();
                    Log.d("启动人脸检测》》","正在启动!");
                    //theCamera.startFaceDetection();//启动人脸检测相机需要在startPreview()之后
                    //theCamera.setFaceDetectionListener(ShowCamera.this);
                } else
                    //Toast.makeText(context, "你的设备不支持人脸识别", Toast.LENGTH_SHORT).show();
                    theCamera.startPreview();
            }
        }
    
        //控制图像的正确显示方向
        private void setDispaly(Camera.Parameters parameters, Camera camera) {
            if (Integer.parseInt(Build.VERSION.SDK) >= 8) {
                setDisplayOrientation(camera, 90);
            } else {
                parameters.setRotation(90);
            }
        }
    
        //实现的图像的正确显示
        private void setDisplayOrientation(Camera camera, int i) {
            Method downPolymorphic;
            try {
                downPolymorphic = camera.getClass().getMethod("setDisplayOrientation", new Class[]{int.class});
                if (downPolymorphic != null) {
                    downPolymorphic.invoke(camera, new Object[]{i});
                }
            } catch (Exception e) {
                Log.e("图像出错+Camera:", "图像出错!");
            }
        }
    
        @Override
        public void onClick(View view) {
            if (view != null) {
                Toast.makeText(context, "单击事件" + view, Toast.LENGTH_SHORT).show();
            }
        }
    
        @Override
        public void onFaceDetection(Camera.Face[] faces, Camera camera) {
            if (faces.length > 0) {
                for (Camera.Face face : faces) {
                    {
                        Log.d("人脸", "检测到人脸坐标为: " + face.rect.centerX() * 1.1f +
                                "
     检测到人脸坐标为:Y :  " + face.rect.centerY() * 1.1f);
                    }
                }
    //
    //            VideoMed video = new VideoMed();//录制视屏
    //            video.StopWriteVideo();
    //            new EmailToUser("1928654615@qq.com", "主人:检测到监控范围内有人出现!").start();
            }
        }
        private void timeTack()
        {
            Log.d("启动人脸检测》》","正在启动*******!");
            new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(1500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    Log.d("启动人脸检测》》","正在启动!");
                    theCamera.startFaceDetection();//启动人脸检测相机需要在startPreview()之后
                    theCamera.setFaceDetectionListener(ShowCamera.this);
                    Log.d("启动人脸检测》》","启动成功!");
                }
    
            }.run();
            //ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
            //service.scheduleAtFixedRate(runnable,2,0, TimeUnit.SECONDS);
        }
        private void facetimeTack() {
            TimerTask task = new TimerTask() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(1500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    theCamera.startFaceDetection();//启动人脸检测相机需要在startPreview()之后
                    theCamera.setFaceDetectionListener(ShowCamera.this);
                }
            };
            //new Timer().scheduleAtFixedRate(task,1500,5000000);
    
        }
    }
    记得加权限:  
      <uses-permission android:name="android.permission.CAMERA" />
    
        <uses-feature android:name="android.hardware.camera" />
        <uses-feature android:name="android.hardware.camera.autofocus" />
  • 相关阅读:
    Sqlite基础(一)
    个人作业冲刺(四)
    安卓用户名密码操作及虚拟机问题
    安卓之界面跳转
    个人作业冲刺(三)
    个人作业冲刺(二)
    个人作业冲刺(一)
    Android studio RatingBar(星级评分条)
    阅读笔记——《构建之法》4
    Android studio GridLayout(网格布局)
  • 原文地址:https://www.cnblogs.com/ywf520/p/6812991.html
Copyright © 2020-2023  润新知