EasyCamera轻松集成Camera拍照

EasyCamera轻松集成Camera拍照Android轻松集成Camera拍照

Android轻松集成Camera拍照

最近有在做Camera拍照相关的项目,从一开始到现在看了好多资料,Camera 的适配和处理相当费劲,所以将Camera封装了一下,现在分享出来,希望能很好的封装关于Camera的一系列操作,简化关于Camera的开发。

Github库代码链接


compile ‘com.march.cameralibs:easycameralibs:1.0.8’

更新日志

1.0.7 三星手机推出后台返回崩溃

1.0.8 小米手机红米note2机型适配


2.简单介绍

2.1 不需要再去关注如何使用camera类和设置相关参数,提供简单的API接口

2.2 支持UI和Camera参数同步切换,不需要在外部修改UI,更便捷

2.3 使用Camera和SurfaceView

2.4 自支持触摸定点对焦和自动对焦

2.5 支持连拍和正常拍摄

2.6 异步存储照片,内存优化

2.7 适配6.0及大多数机型,支持图片横屏拍摄自动旋转


3.功能介绍

3.1 切换闪光灯

3.2 切换拍照模式,连拍模式像素略低,可调节

3.3 切换照片大小,支持3:4,1:1

3.4 图片本地存储

3.5 横屏图片自动旋转

3.6 镜头切换


4.update log

4.1 init

4.2 自定义控件CamContainerView内置定点对焦和UI切换


5.基本API使用说明

在xml文件中使用

//参数说明
<declare-styleable name="CamContainerView">
        //是否在顶部显示遮挡,如果为true,切换到1:1时,会在顶部出现黑色遮挡物,如果为false,预览界面始终在屏幕顶端
        <attr name="isShowTop" format="boolean"/>
</declare-styleable>

//xml实例
<com.march.libs.mycamera.CamContainerView
        android:id="@+id/activity_mycamera_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        cam:isShowTop="true"/>

创建Activity同步生命周期

    @Override
    protected void onResume() {
        super.onResume();
        CameraNative.getInst().onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        CameraNative.getInst().onPause();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        CameraNative.getInst().onDestroy();
    }

获取CameraNative实例并设置监听

//get the singleton of CameraNative
private CameraNative mCameraNative;
mCameraNative = CameraNative.getInst();

//设置保存图片的路径
mCameraNative.setSaveDir(new File(ImageUtils.getSystemDcimPath()));

//设置闪光灯监听,有三个回调可以自由实现,使用该回调方法可以自定义在开启闪光灯时的额外操作,比如弹窗提醒
mCameraNative.setOnFlashChangeListener(new CameraNative.OnFlashChangeListener() {
            @Override
            public boolean OnTurnFlashOn() {
            //your code
                   return true;
            }
});

//设置照片拍摄的监听的监听,将会实现三个方法用来检测图片的存储进度
mCameraNative.setOnSavePicListener(this);
@Override
public void InSaveProgress(int num, float percent) {
        L.info("正在存储 " + num + " rate " + percent);
        //由于拍摄和存储是异步进行的,在这里可以回调保存的进度
}
@Override
public void OnSaveOver() {
        L.info("保存完成");
        //保存完成,回调发生
}

//错误回调监听
mCameraNative.setOnErrorListener(new CameraNative.OnErrorListener() {
            @Override
            public void error(int errorCode,String errMsg) {
            //重大错误会使用错误回调交给开发者处理,比如相机没有获得权限无法打开,详细参照CameraConstant错误码

            }
        });

闪光灯API

//切换闪光灯

//如果相机支持自动状态将会切换到自动状态,否则直接切换到关闭状态,是可以自适应的切换模式
//切换闪关灯状态,不涉及UI的变化
public void switchLightWithAuto()
//flashBtn ImageView 切换按钮 可以为空,为空时不切换
//res int[] 资源数组,长度必须是3,可以为空,为空时不切换
public void switchLightWithAuto(ImageView flashBtn, int... res)
eg:
mCameraNative.switchLightWithAuto(flashBtn,
                R.mipmap.camera_flashOn,
                 R.mipmap.camera_flashAuto,
                  R.mipmap.camera_flashOff);

//开启和关闭状态切换
//切换闪关灯状态,不涉及UI的变化
public void switchLight()
//flashBtn ImageView 切换按钮 可以为空,为空时不切换
//res int[] 资源数组,长度必须是2,可以为空,为空时不切换
public void switchLight(ImageView flashBtn, int... res)
eg:
mCameraNative.switchLight(flashBtn,
                    R.mipmap.camera_flashOn,
                        R.mipmap.camera_flashOff);

照片大小API

//size参数:(CameraConstant.AutoSwitch,CameraConstant.Four2Three,CameraConstant.One2One)
//涉及UI的变化
public void switchPicSize(int size, ImageView iv, int... res)
//无关UI变化
public void switchPicSize(int size)
//获取当前照片大小设置
public int getCurrentSize()

照片模式API

//mode参数:(CameraConstant.AutoSwitch,CameraConstant.MODE_PIC,CameraConstant.MODE_GIF)
//切换照片模式,两种模式
//MODE_PIC 照片模式,像素在300w以上
//MODE_GIF 连拍模式,相片像素600*800

//切换拍照模式,同时重新初始化相机
public void switchTakeMode(int mode)
public int getTakeMode()

切换镜头API

//cameraId参数:(CameraConstant.AutoSwitch,CameraConstant.CAMERA_FACING_BACK,CameraConstant.CAMERA_FACING_FRONT)
//切换camera镜头方向
public boolean switchCameraFacing(int cameraId)

拍照API

//拍照回调的接口,它不但是数据回调的接口也是对数据处理进行的参数配置,实现部分方法
public static abstract class OnTakePicListener { 
   
         // 在操作过程中会返回data,由开发者自己做更多处理
        //当你想将它转化为bitmap时调用mCameraNative.handlePicData()方法进行转换
        public void onTakePic(byte[] data, CameraInfo info) {

        }

        //是否保存到本地,默认保存
        public boolean isSave2Local() {
             return true;
        }

        //采样的标准,根据二进制数据大小决定采样率默认是1
        public int getInSampleSize(byte[] data) {
            return 1;
        }
    }
//普通拍照
public boolean doTakePic(String fileName, OnTakePicListener listener)

//快速连拍
//开始连拍时调用doStartTakeFastPic()
public void doStartTakeFastPic()
//拍摄一张,使用listener获取拍摄的数据
public void doTakeFastPic(String fileName, OnTakePicListener listener)
//拍摄完毕停止连拍
public void doStopFastPic()

图片处理API

//在外部处理byte数组,返回bitmap,比如回调public void onTakePic(byte[] data, CameraInfo info) 的数据
public Bitmap handlePicData(byte[] data, int sampleSize, CameraInfo info)

其他

//由于存储照片是异步的,拍摄完毕之后需要调用doTakePicOver()方法,并在OnSaveOver()回调中执行相关操作
doTakePicOver()
//停止照片自定旋转,横屏拍摄的照片将不会自动横向显示
public void shutDownAutoRotate()
//记住上次的模式。不需要每次都设置
public void setAllowRememberLastTimeMode(boolean allowRememberLastTimeMode)
//关闭log
public void setLogEnable(boolean log)

常用操作

public void clickBtn(View view) {
        switch (view.getId()) {
            case R.id.activity_mycamera_take:
                cameraNative.doTakePic(System.currentTimeMillis() + ".jpg", new CameraNative.OnTakePicListener() {
                    @Override
                    public void onTakePic(byte[] data, CameraInfo info) {
                        Bitmap bitmap = CameraNative.getInst().handlePicData(data, info);
                    }

                    @Override
                    public boolean isSave2Local() {
                        return true;
                    }

                    @Override
                    public int getInSampleSize(byte[] data) {
                        return 2;
                    }
                });
                break;
            case R.id.activity_mycamera_switch:
                cameraNative.switchCameraFacing(CameraConstant.AutoSwitch);
                break;
            case R.id.activity_mycamera_flash:
                cameraNative.switchLightWithAuto();
                break;
            case R.id.activity_mycamera_over:
                cameraNative.takePicOver();
                break;
            case R.id.activity_mycamera_mode:
                cameraNative.switchTakeMode(CameraConstant.AutoSwitch);
                break;
            case R.id.activity_mycamera_size:
                cameraNative.switchPicSize(CameraConstant.AutoSwitch);
                break;
        }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/38938.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注