android 前摄镜像的源码修改

2024-03-26 18:58

本文主要是介绍android 前摄镜像的源码修改,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近遇到一个客户需求,要求在前摄的时候,不要求镜像预览,拍出来的照片也不要求镜像。

科谱一下,前摄镜像的原因是让镜头对着自己,当镜子使用,是专门这么设计的。

既然客户有要求,那就得修改了。

通过各种渠道找,之前想通过驱动层修改代码, 但是驱动同事告诉我,预览可以修改,拍出来的照片修改不了。

拍出来 的照片只能是在应用层修改,那就只能在AP侧找源码。

此代码是基于高通的基础之上的,android 7.1平台。

packages\apps\SnapdragonCamera\src\com\android\camera\PhotoModule.java

private void setFlipValue() {// Read Flip mode from adb command//value: 0(default) - FLIP_MODE_OFF//value: 1 - FLIP_MODE_H//value: 2 - FLIP_MODE_V//value: 3 - FLIP_MODE_VHint preview_flip_value = SystemProperties.getInt("debug.camera.preview.flip", 0);int video_flip_value = SystemProperties.getInt("debug.camera.video.flip", 0);int picture_flip_value = SystemProperties.getInt("debug.camera.picture.flip", 0);int rotation = CameraUtil.getJpegRotation(mCameraId, mOrientation);mParameters.setRotation(rotation);if (rotation == 90 || rotation == 270) {// in case of 90 or 270 degree, V/H flip should reverseif (preview_flip_value == 1) {preview_flip_value = 2;} else if (preview_flip_value == 2) {preview_flip_value = 1;}if (video_flip_value == 1) {video_flip_value = 2;} else if (video_flip_value == 2) {video_flip_value = 1;}if (picture_flip_value == 1) {picture_flip_value = 2;} else if (picture_flip_value == 2) {picture_flip_value = 1;}}String preview_flip = CameraUtil.getFilpModeString(preview_flip_value);String video_flip = CameraUtil.getFilpModeString(video_flip_value);String picture_flip = CameraUtil.getFilpModeString(picture_flip_value);if(CameraUtil.isSupported(preview_flip, CameraSettings.getSupportedFlipMode(mParameters))){mParameters.set(CameraSettings.KEY_QC_PREVIEW_FLIP, preview_flip);}if(CameraUtil.isSupported(video_flip, CameraSettings.getSupportedFlipMode(mParameters))){mParameters.set(CameraSettings.KEY_QC_VIDEO_FLIP, video_flip);}if(CameraUtil.isSupported(picture_flip, CameraSettings.getSupportedFlipMode(mParameters))){mParameters.set(CameraSettings.KEY_QC_SNAPSHOT_PICTURE_FLIP, picture_flip);}}

找到这个函数,

添加log,

private void setFlipValue() {// Read Flip mode from adb command//value: 0(default) - FLIP_MODE_OFF//value: 1 - FLIP_MODE_H//value: 2 - FLIP_MODE_V//value: 3 - FLIP_MODE_VHint preview_flip_value = SystemProperties.getInt("debug.camera.preview.flip", 0);int video_flip_value = SystemProperties.getInt("debug.camera.video.flip", 0);int picture_flip_value = SystemProperties.getInt("debug.camera.picture.flip", 0);int rotation = CameraUtil.getJpegRotation(mCameraId, mOrientation);Log.d("leo","preview_flip_value-->"+preview_flip_value);Log.d("leo","video_flip_value-->"+video_flip_value);Log.d("leo","picture_flip_value-->"+picture_flip_value);Log.d("leo","rotation-->"+rotation);Log.d("leo","mCameraId-->"+mCameraId);Log.d("leo","mOrientation-->"+mOrientation);mParameters.setRotation(rotation);if (rotation == 90 || rotation == 270) {// in case of 90 or 270 degree, V/H flip should reverseif (preview_flip_value == 1) {preview_flip_value = 2;} else if (preview_flip_value == 2) {preview_flip_value = 1;}if (video_flip_value == 1) {video_flip_value = 2;} else if (video_flip_value == 2) {video_flip_value = 1;}if (picture_flip_value == 1) {picture_flip_value = 2;} else if (picture_flip_value == 2) {picture_flip_value = 1;}}String preview_flip = CameraUtil.getFilpModeString(preview_flip_value);String video_flip = CameraUtil.getFilpModeString(video_flip_value);String picture_flip = CameraUtil.getFilpModeString(picture_flip_value);Log.d("leo","preview_flip-->"+preview_flip);Log.d("leo","video_flip-->"+video_flip);Log.d("leo","picture_flip-->"+picture_flip);if(CameraUtil.isSupported(preview_flip, CameraSettings.getSupportedFlipMode(mParameters))){mParameters.set(CameraSettings.KEY_QC_PREVIEW_FLIP, preview_flip);}if(CameraUtil.isSupported(video_flip, CameraSettings.getSupportedFlipMode(mParameters))){mParameters.set(CameraSettings.KEY_QC_VIDEO_FLIP, video_flip);}if(CameraUtil.isSupported(picture_flip, CameraSettings.getSupportedFlipMode(mParameters))){mParameters.set(CameraSettings.KEY_QC_SNAPSHOT_PICTURE_FLIP, picture_flip);}}
在代码的这个地方,
mParameters.set
设置相机的属性时,会有一个flip属性,这个属性就可以设置拍出来的照片是否镜像,v方向还是h方向镜像。
如果需要修改,可以参考以下:

private void setFlipValue() {// Read Flip mode from adb command//value: 0(default) - FLIP_MODE_OFF//value: 1 - FLIP_MODE_H//value: 2 - FLIP_MODE_V//value: 3 - FLIP_MODE_VHint preview_flip_value = SystemProperties.getInt("debug.camera.preview.flip", 0);int video_flip_value = SystemProperties.getInt("debug.camera.video.flip", 0);int picture_flip_value = SystemProperties.getInt("debug.camera.picture.flip", 0);int rotation = CameraUtil.getJpegRotation(mCameraId, mOrientation);Log.d("leo","preview_flip_value-->"+preview_flip_value);Log.d("leo","video_flip_value-->"+video_flip_value);Log.d("leo","picture_flip_value-->"+picture_flip_value);Log.d("leo","rotation-->"+rotation);Log.d("leo","mCameraId-->"+mCameraId);Log.d("leo","mOrientation-->"+mOrientation);
// 在这个地方添加对cameraiId的判断,也就是你想镜像哪一个camera,就判断一个id就可以了,
// 对filp的修改也是根据你的需要来修改的,我这里只需要修改拍照后的镜像,那就修改picture_flip_value
if(2 == mCameraId){picture_flip_value = 2;}mParameters.setRotation(rotation);if (rotation == 90 || rotation == 270) {// in case of 90 or 270 degree, V/H flip should reverseif (preview_flip_value == 1) {preview_flip_value = 2;} else if (preview_flip_value == 2) {preview_flip_value = 1;}if (video_flip_value == 1) {video_flip_value = 2;} else if (video_flip_value == 2) {video_flip_value = 1;}if (picture_flip_value == 1) {picture_flip_value = 2;} else if (picture_flip_value == 2) {picture_flip_value = 1;}}String preview_flip = CameraUtil.getFilpModeString(preview_flip_value);String video_flip = CameraUtil.getFilpModeString(video_flip_value);String picture_flip = CameraUtil.getFilpModeString(picture_flip_value);Log.d("leo","preview_flip-->"+preview_flip);Log.d("leo","video_flip-->"+video_flip);Log.d("leo","picture_flip-->"+picture_flip);if(CameraUtil.isSupported(preview_flip, CameraSettings.getSupportedFlipMode(mParameters))){mParameters.set(CameraSettings.KEY_QC_PREVIEW_FLIP, preview_flip);}if(CameraUtil.isSupported(video_flip, CameraSettings.getSupportedFlipMode(mParameters))){mParameters.set(CameraSettings.KEY_QC_VIDEO_FLIP, video_flip);}if(CameraUtil.isSupported(picture_flip, CameraSettings.getSupportedFlipMode(mParameters))){mParameters.set(CameraSettings.KEY_QC_SNAPSHOT_PICTURE_FLIP, picture_flip);}}
亲测有效哦,实际拍出来的效果我就不上图了,请gongchengshi们自己动手试试吧。






这篇关于android 前摄镜像的源码修改的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/849535

相关文章

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

java实现docker镜像上传到harbor仓库的方式

《java实现docker镜像上传到harbor仓库的方式》:本文主要介绍java实现docker镜像上传到harbor仓库的方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 前 言2. 编写工具类2.1 引入依赖包2.2 使用当前服务器的docker环境推送镜像2.2

springboot项目打jar制作成镜像并指定配置文件位置方式

《springboot项目打jar制作成镜像并指定配置文件位置方式》:本文主要介绍springboot项目打jar制作成镜像并指定配置文件位置方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录一、上传jar到服务器二、编写dockerfile三、新建对应配置文件所存放的数据卷目录四、将配置文

Android DataBinding 与 MVVM使用详解

《AndroidDataBinding与MVVM使用详解》本文介绍AndroidDataBinding库,其通过绑定UI组件与数据源实现自动更新,支持双向绑定和逻辑运算,减少模板代码,结合MV... 目录一、DataBinding 核心概念二、配置与基础使用1. 启用 DataBinding 2. 基础布局

Android ViewBinding使用流程

《AndroidViewBinding使用流程》AndroidViewBinding是Jetpack组件,替代findViewById,提供类型安全、空安全和编译时检查,代码简洁且性能优化,相比Da... 目录一、核心概念二、ViewBinding优点三、使用流程1. 启用 ViewBinding (模块级

SQL Server修改数据库名及物理数据文件名操作步骤

《SQLServer修改数据库名及物理数据文件名操作步骤》在SQLServer中重命名数据库是一个常见的操作,但需要确保用户具有足够的权限来执行此操作,:本文主要介绍SQLServer修改数据... 目录一、背景介绍二、操作步骤2.1 设置为单用户模式(断开连接)2.2 修改数据库名称2.3 查找逻辑文件名

Oracle修改端口号之后无法启动的解决方案

《Oracle修改端口号之后无法启动的解决方案》Oracle数据库更改端口后出现监听器无法启动的问题确实较为常见,但并非必然发生,这一问题通常源于​​配置错误或环境冲突​​,而非端口修改本身,以下是系... 目录一、问题根源分析​​​二、保姆级解决方案​​​​步骤1:修正监听器配置文件 (listener.

Linux中修改Apache HTTP Server(httpd)默认端口的完整指南

《Linux中修改ApacheHTTPServer(httpd)默认端口的完整指南》ApacheHTTPServer(简称httpd)是Linux系统中最常用的Web服务器之一,本文将详细介绍如何... 目录一、修改 httpd 默认端口的步骤1. 查找 httpd 配置文件路径2. 编辑配置文件3. 保存