Android轻松集成Camera拍照
16lz
2021-01-24
Android轻松集成Camera拍照
1.最近有在做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"> <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(); CameraNative.getInst().onPause(); } @Override protected void onDestroy() { super.onDestroy(); CameraNative.getInst().onDestory(); }
获取CameraNative实例并设置监听
//get the singleton of CameraNativeprivate 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);@Overridepublic void InSaveProgress(int num, float percent) { L.info("正在存储 " + num + " rate " + percent); //由于拍摄和存储是异步进行的,在这里可以回调保存的进度}@Overridepublic void OnSaveOver() { L.info("保存完成"); //保存完成,回调发生}@Overridepublic void CanotTake() { ToastUtil.show("稍候操作"); //camera拍摄过快时将会产生异常,会回调改方法}//错误回调监听mCameraNative.setOnErrorListener(new CameraNative.OnErrorListener() { @Override public void error(String errMsg) { //错误信息,默认错误信息仍旧是会打印的 } });
闪光灯API
//切换闪光灯//如果相机支持将会切换到自动状态,否则直接切换到关闭状态,是可以自适应的切换模式,需要设置按钮和相关资源//flashBtn ImageView 切换按钮 可以为空,为空时不切换//res int[] 资源数组,长度必须是3,可以为空,为空时不切换public void toogleLightWithAuto(ImageView flashBtn, int... res)mCameraNative.toogleLightWithAuto(flashBtn, R.mipmap.camera_flashon, R.mipmap.camera_flashauto, R.mipmap.camera_flashoff);//开启和关闭状态切换//flashBtn ImageView 切换按钮 可以为空,为空时不切换//res int[] 资源数组,长度必须是2,可以为空,为空时不切换public void toogleLight(ImageView flashBtn, int... res) mCameraNative.toogleLight(flashBtn, R.mipmap.camera_flashon, R.mipmap.camera_flashoff);
照片大小API
//自动切换图片资源同时切换图片大小//size参数 为CameraNative.NotConvert时将会自己切换否则切换到制定状态(CameraNative.NotConvert,CameraNative.One2One,CameraNative.Four2Three)public void switchPicSize(int size, ImageView iv, int... res) //无关资源切换参数同上public void switchPicSize(int size)public boolean isSizeOne2One() public boolean isFour2Three()
照片模式API
//切换照片模式,两种模式//MODE_PIC 照片模式,像素在300w以上 //MODE_GIF 连拍模式,相片像素600*800//切换拍照模式,同时重新初始化相机public void switchTakeMode(int mode)public boolean isTakePic()public boolean isTakeGif()
拍照API
//拍摄照片//fileName 指定文件名存储,不能为空//接口public static abstract class OnTakePicListener {//拍摄获得的二进制数组 public void onTakePic(byte[] data) { }//处理之后的bitmap public void onTakePic(Bitmap bit) { }//是否处理成bitmap,默认不处理 public boolean isConvert2Bitmap() { return false; }//压缩的sampleSize,默认不压缩 public int getInSampleSize(byte[] data) { return 1; }}public boolean doTakePic(String fileName, boolean isConvert2Bit, OnTakePicListener listener)//快速连拍//开始连拍时调用doStartTakeFastPic()public void doStartTakeFastPic()//拍摄一张,fileName == null时不存储,使用listener获取拍摄的数据public void doTakeFastPic(String fileName, OnTakePicListener listener)//拍摄完毕停止连拍public void doStopFastPic()
图片处理API
//在外部处理byte数组,返回bitmappublic Bitmap handlePicData(boolean isFast, byte[] data, int sampleSize)
其他
//由于存储照片是异步的,拍摄完毕之后需要调用doTakePicOver()方法,并在OnSaveOver()回调中执行相关操作doTakePicOver()//停止照片自定旋转,横屏拍摄的照片将不会自动横向显示public void shutDownAutoRotate()
常用操作
public void clickBtn(View view) { switch (view.getId()) { case R.id.activity_mycamera_take: //拍照 cameraNative.doTakePic(str(System.currentTimeMillis()) + ".jpg", null); break; case R.id.activity_mycamera_switch: //切换摄像头 cameraNative.switchCamera(); break; case R.id.activity_mycamera_flash: //切换闪光灯 cameraNative.toogleLightWithAuto(null); break; case R.id.activity_mycamera_over: //拍照结束 cameraNative.takePicOver(); break; case R.id.activity_mycamera_mode: //切换拍摄模式 cameraNative.switchTakeMode(CameraNative.NotConvert); break; case R.id.activity_mycamera_size: //切换照片大小 cameraNative.switchPicSize(CameraNative.NotConvert); break; } }
更多相关文章
- Android(安卓)Hook Java
- Appium的一点一滴:Appium 和Android真机
- [Android实例] Handler+ExecutorService(线程池)+MessageQueue模
- Android(安卓)判断是开发debug模式,还是发布release模式
- 通过Camera进行拍照
- Android(安卓)webview 播放视频无法播放以及可以播放预览图为加
- 《Android开发技术周报》笔记
- My Android(安卓)Camera Notes
- Android(安卓)N新特性