很多app都要求自定义一个相机,类似违章查询拍照,美图相机之类的应用都要求自定义相机,网上的例子大多数我也看过,很多例子是有坑的,存在各种各样的问题,常见的就是问题就是适配性很差,这里我分享一下我做的一个自定义相机,算是浅度实现吧,实现了拍照和保存和添加水印的功能,做过测试,三星S7,华为荣耀7,oppoR9s,vivoY66都可以通过测试

截屏.jpg

好了下面直接上代码吧,关于坑点,会在代码中注释:

第一步,配置权限:

第二步,重写一个surfaceview,并在onSrfacexxxx三个方法中,里面把预览及相机初始化的一些工作做了

public void surfaceCreated(SurfaceHolder holder) {

Log.d(TAG, "surfaceCreated() is called");

try {

mCamera = Camera.open(0);

mCamera.setDisplayOrientation(90);

mCamera.setPreviewDisplay(holder);

mCamera.startPreview();

} catch (IOException e) {

Log.d(TAG, "Error setting camera preview: " + e.getMessage());

}

}

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {

Log.d(TAG, "surfaceChanged() is called");

try {

mCamera.autoFocus(new Camera.AutoFocusCallback() {

@Override

public void onAutoFocus(boolean success, Camera camera) {

isSuccess = success;

initCamera();

mCamera.cancelAutoFocus();

mCamera.startPreview();

}

});

} catch (Exception e) {

Log.d(TAG, "Error starting camera preview: " + e.getMessage());

}

}

private void initCamera() {

mParameters = mCamera.getParameters();

mParameters.setPictureFormat(ImageFormat.JPEG);

List pictureSizes = mParameters.getSupportedPictureSizes();

Camera.Size picSize = null;

WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);

Display display = wm.getDefaultDisplay();

int screenWidth = display.getWidth();

int screenHeight = display.getHeight();

//相机支持的拍摄图片尺寸,拍照图片尺寸小于等于屏幕尺寸,实现适配

if (pictureSizes.size() > 1) {

for (Camera.Size size2 : pictureSizes) {

System.out.println("initCamera:" + size2.width + size2.height);

if (size2.width * size2.height <= screenWidth * screenHeight) {

if (picSize == null) {

picSize = size2;

} else {

if ((size2.width * size2.height) > (picSize.width * picSize.height)) {

picSize = size2;

}

}

}

}

} else {

picSize = pictureSizes.get(0);

}

mParameters.setPictureSize(picSize.width, picSize.height);

//设置尺寸以适配所有机型,图片尺寸小于等于屏幕尺寸,部分机型崩溃的问题得到了解决

mParameters.setJpegQuality(99); // 设置照片质量

List aa = mParameters.getSupportedFocusModes();

//设置对焦模式,低端机型可能不支持快速对焦,当然现在大部分机型支持,但是也得适配啊

if (aa.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) {

mParameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);//快速对焦

} else {

mParameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);

}

try {

mCamera.setParameters(mParameters);

mCamera.startPreview();

} catch (Exception e) {

}

}

public void surfaceDestroyed(SurfaceHolder holder) {

if (mCamera != null) {

mCamera.setPreviewCallback(null);

mCamera.stopPreview();

mCamera.release();

mCamera = null;

}

Log.d(TAG, "surfaceDestroyed() is called");

}

//拍照

public void takePicture(Camera.PictureCallback imageCallback) {

Log.d(TAG, "takePicture: " + isSuccess);

if (isSuccess) {

mCamera.takePicture(null, null, imageCallback);

} else {//如果不成功则重试对焦,否则拍出的照片可能糊

initCamera();

mCamera.cancelAutoFocus();

mCamera.takePicture(null, null, imageCallback);

}

}

}

第三步,在Activity中去实现拍照的操作:

//绑定surfaceView

FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);

mCameraSurPreview = new SurfacePreview(this);

preview.addView(mCameraSurPreview);

//拍照

mCameraSurPreview.takePicture(this);

Android添加拍照功能,Android自定义相机,添加水印相关推荐

  1. Android添加拍照功能,Android相机开发(二): 给相机加上偏好设置

    Android Camera Develop: add settings to camera app 概述 继上一篇实现了一个最简单的相机APP后,本篇主要介绍实现相机的各种偏好设置,比如分辨率.闪光 ...

  2. Android添加拍照功能,Android开发实现拍照功能的方法实例解析

    本文实例讲述了Android开发实现拍照功能的方法.分享给大家供大家参考,具体如下: 解析: 1)判断是否有摄像头checkCameraHardware(this) 2)获得相机camera = Ca ...

  3. android 静默拍照功能,Android实现静默拍照功能

    本文实例为大家分享了Android实现静默拍照功能的具体代码,供大家参考,具体内容如下 1.申请权限(6.0以后要动态申请) 2.创建相机工具类 CameraPreview: public class ...

  4. android 添加附件功能,Android实现带附件的邮件发送功能

    本文实例讲解了基于基于jmail实现android邮件发送功能,分享给大家供大家参考,具体内容如下 在android上发送邮件方式: 第一种:借助gmail app客户端,缺点是必须使用gmail帐号 ...

  5. android添加截图功能,Android应用开发之Android 5.0及以上编程实现屏幕截图功能的方法...

    本文将带你了解Android应用开发Android 5.0及以上编程实现屏幕截图功能的方法,希望本文对大家学Android有所帮助. 本文实例讲述了Android   5.0及以上编程实现屏幕截图功能 ...

  6. icordova拍照_ionic2/3实战-添加拍照功能cordova-plugin-camera

    效果演示 源代码已上传到github 由于ionic版本更新较快,有些写法可能改变来不及更新简书,请以github代码为准 ionic2.0插件的使用方式和ionic3.0已不一样 ionic2实战- ...

  7. android开启照相功能,Android打开系统相机并拍照的2种显示方法

    本文实例为大家分享了Android打开系统相机并拍照的具体实现代码,供大家参考,具体内容如下 目标效果: 第二张为点击第一个按钮拍照后显示的,比较模糊,第三章为点击第二个按钮拍照后显示的,比较清楚. ...

  8. Android开发(Jetpack) 学习CameraX 自定义相机实现

    目录 一.CameraX和Camera2 二.CameraX的引入 三.自定义拍照 四.自定义视频录制 五.XML 配置 一.CameraX和Camera2 CameraX 是一个 Jetpack 库 ...

  9. android裁剪图片功能,Android实现拍照、选择图片并裁剪图片功能

    一. 实现拍照.选择图片并裁剪图片效果 按照之前博客的风格,首先看下实现效果. 二. uCrop项目应用 想起之前看到的Yalantis/uCrop效果比较绚,但是研究源码之后发现在定制界面方面还是有 ...

最新文章

  1. mysql user 用户名长度_为什么注册的用户账号长度不能超过5个字符
  2. python图像检测_如何用Python检测图像中的矩形项
  3. 软件测试和系统试验,实验四 软件系统性测试
  4. web语义化方便了谁?
  5. mysql error report,ECSHOP网店系统提示MYSQL SERVER ERROR REPORT的解决方法
  6. 最简单的Asp.Net 2.0 TreeView的Checkbox级联操作
  7. python和java选择哪个-观点|Java 与 Python:你应该选择哪个?
  8. 在qq2003里实现qq2000的皮肤
  9. 新手建站之【网站备案】③
  10. Linux篇-The slave I/O thread stops because master and slave have equal...
  11. 网络安全系列-VIII: 什么是渗透测试 Penetration Test?
  12. 网站标题设计与搜索引擎
  13. (27)Verilog实现倍频【方法四】
  14. 微型计算机主板最新发展,三镇学子齐瞩目——精英主板 Intel915P平台新技术体验营首选武汉...
  15. Excel跨表查询关联数据
  16. 微信“小游戏”遭抄袭质疑;程维霸气谈美团约战;苹果就降速门道歉 |一周业界事
  17. 赵小楼《天道》《遥远的救世主》深度解析(5)丁元英之所以能成为丁元英的条件的可能之一(一)
  18. 互联网人,你有一副春联待查收
  19. ASICS各跑鞋分类及选购方法
  20. 核平滑方法——局部多项式回归

热门文章

  1. 36 万美元套利!3 步骤揭秘黑客 DeFi 闪电贷全过程
  2. 听说Java老古董了?快被淘汰了?高级开发:我还就真看上它了!
  3. 不懂物联网,就别怪时代抛弃你!
  4. 低代码再掀炒作热潮?
  5. 再见,中关村“金三角”!
  6. Windows 7,难说再见
  7. 为什么物联网产品迫切需要良好的 UI/UX 设计?
  8. 华为回应“停止社招”;iPhone XS 取消美颜; iCloud 大面积瘫痪 | 极客头条
  9. 微信小游戏凭什么拿走开发者 70% 的日流水?
  10. 身价百亿的中本聪是如何打造出“创世区块”的?