简介
相机模块库, 自定义相机, 通过简单的调用即可实现拍照图片裁剪录像及录像抓拍功能;
实现图片压缩, 减少图片体积; 自定义相机可避免使用系统相机导致的照片或视频体积过大问题;
内置相机及 sd 卡权限获取的处理;
github 链接如下, 帮忙 star 支持下~
github 链接
实现功能:
- 拍照
- 图片裁剪
- 录像
- 录像抓拍
在项目中导入该库
在工程的 build.gradle 中加入:
- allprojects {
- repositories {
- ...
- maven { url "https://jitpack.io" }
- }
- }
module 的 build.gradle 中加入依赖:
- dependencies {
- compile 'com.github.autume:syd-camera:v1.0.0'
- }
使用
拍照
具体使用可参考 demo 中的 CameraTestActivity
启动相机
参照以下方式传入图片质量照片最小宽度配置相机预览界面最小宽度配置, 直接跳转到拍照界面进行拍照;
相关的配置参数:
- picQuality: 图片质量 0~100, 默认 80
- picWidth: 照片最小宽度配置, 默认 800
- previewWidth: 相机预览界面最小宽度配置, 默认 1280
- pictureSize: 照片尺寸限制, 单位 kb, 不存入则仅根据图片质量进行压缩, 实际压缩后的大小会比该值略大一些
- Intent intent = new Intent(CameraTestActivity.this, SydCameraActivity.class);
- intent.putExtra(CameraParaUtil.picQuality, 70); // 图片质量 0~100
- intent.putExtra(CameraParaUtil.picWidth, 1536); // 照片最小宽度配置, 高度根据屏幕比例自动配置
- intent.putExtra(CameraParaUtil.previewWidth, 1280); // 相机预览界面最小宽度配置, 高度根据屏幕比例自动配置
- startActivityForResult(intent, CameraParaUtil.cameraRequestCode);
接收拍照返回
拍照返回中获取到存储的照片路径后可根据需求对照片进行处理, 路径获取方式: picturePath = data.getStringExtra(CameraParaUtil.picturePath);
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- super.onActivityResult(requestCode, resultCode, data);
- // Log.i(TAG, "onActivityResult resultCode:" + resultCode + ",requestCode:" + requestCode);
- if (resultCode == Activity.RESULT_CANCELED){
- Log.i(TAG, "拍照取消!");
- return;
- }
- if (resultCode != Activity.RESULT_OK){
- Log.w(TAG, "拍照失败!");
- return;
- }
- if (requestCode == CameraParaUtil.cameraRequestCode) {
- String picturePath;
- picturePath = data.getStringExtra(CameraParaUtil.picturePath);
- img_photo.setImageBitmap(BitmapFactory.decodeFile(picturePath));
- Log.d(TAG, "onActivityResult picturePath:" + picturePath);
- }
- }
图片裁剪
启动裁剪
参照以下方式传入图片质量待裁剪图片路径, 直接跳转到裁剪界面进行图片裁剪;
相关的配置参数:
- cropQuality: 图片质量 0~100, 默认 80
- cropTitle: 裁剪界面标题
- cropDestPicPath: 裁剪后图片所位于的文件夹名称
- cropSrcPicPath: 待裁剪的源文件路径
- private void startCrop(String path) {
- Intent intent = new Intent(CameraTestActivity.this, IcomwellCropActivity.class);
- intent.putExtra(CropParaUtil.cropQuality, 70); // 图片质量 0~100
- intent.putExtra(CropParaUtil.cropTitle, "添加封面");
- intent.putExtra(CropParaUtil.cropSrcPicPath, path);
- startActivityForResult(intent, CropParaUtil.REQUEST_CODE_FROM_CUTTING);
- }
接收裁剪返回
裁剪返回中获取存储的裁剪后图片路径后可根据需求对图片进行处理, 路径获取: data.getStringExtra(CropParaUtil.cropDestPicPath);
- switch (requestCode) {
- case CropParaUtil.REQUEST_CODE_FROM_CUTTING:
- String cropDestPicPath;
- cropDestPicPath = data.getStringExtra(CropParaUtil.cropDestPicPath);
- img_photo.setImageBitmap(BitmapFactory.decodeFile(cropDestPicPath));
- Log.d(TAG, "onActivityResult cropDestPicPath:" + cropDestPicPath);
- break;
- default:
- break;
- }
自定义图片裁剪 UI
若需要自定义裁剪界面 U, 可参考 SydCropActivity, 自定义布局
录像功能
参照以下方式传入相关参数, 直接跳转到录像界面进行录像;
相关的配置参数:
- picQuality: 录像质量 0~100, 默认 80
- picWidth: 视频最小宽度配置, 默认 800
- previewWidth: 相机预览界面最小宽度配置, 默认 1280
- pictureSize: 照片尺寸限制, 单位 kb, 不存入则仅根据图片质量进行压缩, 实际压缩后的大小会比该值略大一些
- picDuration: 自动抓拍时间间隔, 单位秒, 默认 3600 秒, 传入小于等于 0 的数则为关闭自动抓拍
- videoDuration: 录像分段间隔, 单位秒, 默认 1800 秒
照片和录像分别位于: sydPhotosydVideo 文件夹下
- private void startVideo() {
- Intent intent = new Intent(CameraTestActivity.this, SydVideoActivity.class);
- intent.putExtra(CameraParaUtil.picQuality, 70); // 图片质量 0~100
- intent.putExtra(CameraParaUtil.picWidth, 1536); // 照片最小宽度配置, 高度根据屏幕比例自动配置
- intent.putExtra(CameraParaUtil.previewWidth, 1280); // 相机预览界面最小宽度配置, 高度根据屏幕比例自动配置
- startActivityForResult(intent, CameraParaUtil.REQUEST_CODE_FROM_VIDEO);
- }
特殊情况兼容处理
三星 A8 出现无权限存储文件的问题, 处理方式为将拍照或裁剪的图片存于 Bitmap 中, 直接返回 Bitmap
- // 裁剪后的图片, 文件存储失败的情况下存入 croppedBitmap
- public static Bitmap croppedBitmap;
- // 拍照后的图片, 文件存储失败的情况下存入 pictureBitmap, 裁剪时取不到本地文件则也作为图片裁剪的来源
- public static Bitmap pictureBitmap;
- /**
- * 兼容三星 A8 出现无权限存储文件的处理,
- * 将手机重启后可正常存储文件..
- * @param resultCode
- */
- private void onResultExceptionHandle(int resultCode) {
- // 拍照失败处理, 针对三星 A8 无法存储文件处理, 拍照失败后检查 CameraParaUtil.pictureBitmap 是否有数据
- if (resultCode == CameraParaUtil.REQUEST_CODE_FROM_CAMERA_FAIL && CameraParaUtil.pictureBitmap != null) {
- if (Invoke.isPicNeedDeal) {
- // 使用 pictureBitmap 进行裁剪
- startCropForBitmap();
- } else {
- // 不需要裁剪
- uploadPicture(CameraParaUtil.pictureBitmap);
- }
- }
- // 裁剪失败处理, 针对三星 A8 无法存储文件处理, 失败后检查 CropParaUtil.croppedBitmap 是否有数据
- if (resultCode == CropParaUtil.REQUEST_CODE_FROM_CUTTING_FAIL && CropParaUtil.croppedBitmap != null) {
- uploadPicture(CropParaUtil.croppedBitmap);
- }
- }
来源: https://juejin.im/entry/5aabe3456fb9a028d82b8767