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