Android轻松集成Camera拍照
最近有在做Camera拍照相关的项目,从一开始到现在看了好多资料,Camera 的适配和处理相当费劲,所以将Camera封装了一下,现在分享出来,希望能很好的封装关于Camera的一系列操作,简化关于Camera的开发。
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">
<attr name="isShowTop" format="boolean"/>
</declare-styleable>
<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实例并设置监听
private CameraNative mCameraNative;
mCameraNative = CameraNative.getInst();
mCameraNative.setSaveDir(new File(ImageUtils.getSystemDcimPath()));
mCameraNative.setOnFlashChangeListener(new CameraNative.OnFlashChangeListener() {
@Override
public boolean OnTurnFlashOn() {
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) {
}
});
闪光灯API
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);
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
public void switchPicSize(int size, ImageView iv, int... res)
//无关UI变化
public void switchPicSize(int size)
//获取当前照片大小设置
public int getCurrentSize()
照片模式API
public void switchTakeMode(int mode)
public int getTakeMode()
切换镜头API
public boolean switchCameraFacing(int cameraId)
拍照API
public static abstract class OnTakePicListener {
public void onTakePic(byte[] data, CameraInfo info) {
}
public boolean isSave2Local() {
return true;
}
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
public Bitmap handlePicData(byte[] data, int sampleSize, CameraInfo info)
其他
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;
}