博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android实现前置后置摄像头相互切换
阅读量:6183 次
发布时间:2019-06-21

本文共 3355 字,大约阅读时间需要 11 分钟。

首先自定义一个继承自SurfaceView并且实现了SurfaceHolder.Callback接口的组件:

public class CameraView extends SurfaceView implements Callback {    private SurfaceHolder surfaceHolder;    private Camera mCamera;    public CameraView(Context context, AttributeSet attrs) {        super(context, attrs);    }    public void init(Camera camera){        surfaceHolder = getHolder();        surfaceHolder.addCallback(this);        mCamera = camera;    }        /**     * 初始化SurfaceView时调用一次,另外更改surface或者onpause->onresume时调用     */    @Override    public void surfaceChanged(SurfaceHolder holder, int format, int width,            int height) {        if(holder.getSurface() == null || mCamera == null){            return;        }        mCamera.stopPreview();        try {            mCamera.setPreviewDisplay(surfaceHolder);        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        mCamera.startPreview();    }    @Override    public void surfaceCreated(SurfaceHolder holder) {        if(mCamera == null){            return;        }        try {            mCamera.setPreviewDisplay(surfaceHolder);        } catch (IOException e) {            e.printStackTrace();        }        mCamera.startPreview();    }    @Override    public void surfaceDestroyed(SurfaceHolder holder) {        // TODO Auto-generated method stub    }}

检查设备是否有摄像头:

private boolean checkCamera(){    return MainActivity.this.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA);}

标记前置,后置摄像头,以及当前打开的摄像头,并且首先默认打开前置摄像头,监听Button的click事件,切换摄像头:

public class MainActivity extends Activity {    private Button button;    private Camera camera;    private CameraView cameraView;    private static final int FRONT = 1;//前置摄像头标记    private static final int BACK = 2;//后置摄像头标记    private int currentCameraType = -1;//当前打开的摄像头标记    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        if(!checkCamera()){            MainActivity.this.finish();        }        try {            camera = openCamera(FRONT);        } catch (Exception e) {            e.printStackTrace();        }        button = (Button)findViewById(R.id.button);        button.setOnClickListener(new Button.OnClickListener() {            @Override            public void onClick(View v) {                try {                    changeCamera();                } catch (IOException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }            }        });        cameraView = (CameraView)findViewById(R.id.cameraview);        cameraView.init(camera);    }        /**     * @return 摄像头是否存在     */    private boolean checkCamera(){        return MainActivity.this.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA);    }        @SuppressLint("NewApi")    private Camera openCamera(int type){        int frontIndex =-1;        int backIndex = -1;        int cameraCount = Camera.getNumberOfCameras();        CameraInfo info = new CameraInfo();        for(int cameraIndex = 0; cameraIndex

布局文件:

当然,首先得申明权限跟软硬件环境:

最好把activity的screenOrientation设置为landscape,不然显示的方向不对。

如果有可以优化的地方,望各位大侠指导,谢谢。

转载于:https://www.cnblogs.com/hithlb/p/3543760.html

你可能感兴趣的文章
solr教程
查看>>
我的友情链接
查看>>
钱旺之行:互联网经济的增长点——注意力价值经济
查看>>
hadoop Map-Reduce体系架构(3)
查看>>
android语音朗读功能demo实现
查看>>
CRT或XSHELL工具连接centos7经常自动断开
查看>>
使用 QuickBI 搭建酷炫可视化分析
查看>>
1-1 Zabbix 监控安装
查看>>
最近运维中遇到的一些问题及解决方法
查看>>
Hadoop集群(第10期副刊)_常用MySQL数据库命令
查看>>
LinkedHashMap的实现原理
查看>>
shell 判断语句
查看>>
LVS+keepalived+Nginx(前后端故障处理)全自动化负载均衡配置
查看>>
gdb调试(转自http://wenku.baidu.com/view/abdda42ee2bd960590c67730.html)
查看>>
我的友情链接
查看>>
一双皮鞋
查看>>
oracle闪回操作详解
查看>>
复制仓库
查看>>
percent之Timer
查看>>
折腾Java设计模式之中介者模式
查看>>