Camera 手电筒修改
文档内容:修改原生接口,使用节点控制的方式替换原生调用hal层接口。
一、应用设置API
应用设置手电筒代码,调用系统接口 setTorchMode
private final CameraManager mCameraManager;private final Context mContext;public FlashlightControllerImpl(Context context) {mContext = context;mCameraManager = (CameraManager) mContext.getSystemService(Context.CAMERA_SERVICE);}public void setFlashlight(String cameraId, boolean enabled) {synchronized (this) {try {mCameraManager.setTorchMode(cameraId, enabled);} catch (CameraAccessException e) {Log.e(TAG, "Couldn't set torch mode", e);}}}
这里CameraManager调用会直接到 libcameraservice 的 CameraService.cpp 中,这点不同于一般XXXManager 之类的实现代码在 framework 中 services.jar 模块之中。
二、关键函数
CameraService.cpp 中执行几个重要函数
setTorchMode 操作闪光灯
Status CameraService::setTorchMode(const String16& cameraId, bool enabled,const sp<IBinder>& clientBinder) {Mutex::Autolock lock(mServiceLock);ATRACE_CALL();if (enabled && clientBinder == nullptr) {ALOGE("%s: torch client binder is NULL", __FUNCTION__);return STATUS_ERROR(ERROR_ILLEGAL_ARGUMENT,"Torch client Binder is null");}String8 id = String8(cameraId.string());//ADD 写节点打开手电筒代码块std::string idStr = std::string(id);char value[PROPERTY_VALUE_MAX];memset(value, 0, sizeof(value));property_get("sys.torch.rw_dev", value, "0");int32_t serviceStatus = ICameraServiceListener::TORCH_STATUS_NOT_AVAILABLE;if (0 == strcmp(value, "1") && idStr.compare("0") == 0) {if (enabled) {FILE *fp = NULL;fp = fopen("/sys/class/leds/led:torch_0/brightness", "w");fprintf(fp, "250");fclose(fp);fp = fopen("/sys/class/leds/led:switch_0/brightness", "w");fprintf(fp, "1");fclose(fp);serviceStatus = ICameraServiceListener::TORCH_STATUS_AVAILABLE_ON;} else {FILE *fp = NULL;fp = fopen("/sys/class/leds/led:switch_0/brightness", "w");fprintf(fp, "0");fclose(fp);serviceStatus = ICameraServiceListener::TORCH_STATUS_AVAILABLE_OFF;}// 通知手电筒状态变化for (auto& i : mListenerList) {i->getListener()->onTorchStatusChanged(serviceStatus, String16{cameraId});}return Status::ok();}//ADD... ...// 判断是否设置为系统相机int uid = CameraThreadState::getCallingUid();if (shouldRejectSystemCameraConnection(id)) {return STATUS_ERROR_FMT(ERROR_ILLEGAL_ARGUMENT, "Unable to set torch mode"" for system only device %s: ", id.string());}... ...// 原生check闪光灯是否可用StatusInternal cameraStatus = state->getStatus();... ...// 原生操作闪光灯地方status_t err = mFlashlight->setTorchMode(id, enabled);... ...return Status::ok();
}
onTorchStatusChangedLocked 手电筒状态回调函数
即使改成写节点的方式操作手电筒,开启关闭camera后也会执行此函数通知状态
void CameraService::onTorchStatusChangedLocked(const String8& cameraId,TorchModeStatus newStatus, SystemCameraKind systemCameraKind) {ALOGI("%s: Torch status changed for cameraId=%s, mHCameraIdStr=%s, newStatus=%d",__FUNCTION__, cameraId.string(), mHCameraIdStr.string(), newStatus);TorchModeStatus status;status_t res = getTorchStatusLocked(cameraId, &status);if (res) {ALOGE("%s: cannot get torch status of camera %s: %s (%d)",__FUNCTION__, cameraId.string(), strerror(-res), res);return;}if (status == newStatus) {return;}// 增加判断,对于后摄(后摄有闪光灯)打开时,关闭手电筒char value[PROPERTY_VALUE_MAX];memset(value, 0, sizeof(value));property_get("sys.torch.rw_dev", value, "0");std::string idStr = std::string(cameraId);if (0 == strcmp(value, "1") && newStatus != TorchModeStatus::AVAILABLE_ON) {if (idStr.compare("0") == 0) {FILE *fp = NULL;fp = fopen("/sys/class/leds/led:switch_0/brightness", "w");fprintf(fp, "0");fclose(fp);}}// 原生的Torch回调事件,通知应用手电筒状态的res = setTorchStatusLocked(cameraId, newStatus);... ...broadcastTorchModeStatus(cameraId, newStatus, systemCameraKind);
}
开启关闭Camera执行如下函数
// closeCamera时会执行disconnect步骤
binder::Status CameraService::BasicClient::disconnect() {binder::Status res = Status::ok();if (mDisconnected) {return res;}... ...
}// openCamera时会执行connect步骤
template<class CALLBACK, class CLIENT>
Status CameraService::connectHelper(const sp<CALLBACK>& cameraCb, const String8& cameraId,int api1CameraId, int halVersion, const String16& clientPackageName,const std::unique_ptr<String16>& clientFeatureId, int clientUid, int clientPid,apiLevel effectiveApiLevel, bool shimUpdateOnly,/*out*/sp<CLIENT>& device) {binder::Status ret = binder::Status::ok();String8 clientName8(clientPackageName);... ...
}
Camera 手电筒修改相关推荐
- 全志A31下5M的CMOS Camera移植修改记录表
最近一段时间都在用A31评估几颗5M的摄像头,包括ov5640.MT9P001.ov2710.A31下移植不同的摄像头驱动的好处在于,驱动结构规范化,采用video_device下的suddev的架构 ...
- 02-Linux 网络基础(Network Namespase、veth pair、bridge、Iptables)
Linux 网络基础 Network Namespase 简单认识 Linux的namespace(名字空间)的作用就是"隔离内核资源".在Linux的世界里,文件系统挂载点.主机 ...
- PPC修改注册表大全 (注册表必看)(转载)
在PPC上很多功能可以通过改注册表实现 下面是一些较为常用的注册表修改方法 一共有133条 前面是目录 后面对应的是实现功能和修改方法--希望对大家有帮助 理论上通用与WM2003 5.0 6.1 ...
- Android camera开发(11)---Camera软件架构
Camera软件架构 Camera软件架构 主要包含三个部分的介绍: 1)Android Camera 架构:Android系统原生架构简要介绍. 2)Mediatek Android Camera架 ...
- MTK 驱动开发(22)---camera 硬件和软件概述
1.Camera 硬件介绍 1,Image Sensor类型 a) YUV Sensor YUV Sensor输出的Data格式为YUV,图像的效果处理使用Sensor内部的ISP,BB端接收 ...
- 召唤神龙~让我们来看看源码及简单的修改分析,讲的很清楚哦
最近召唤神龙好火哈哈哈哈哈哈哈 先给大家一个官方正版链接:[召唤神龙] 在给大家一套源码,这个源码不能本地运行,可以简单搭个服务器环境就可以啦:https://gitee.com/bendantada ...
- Qcom平台 Camera 之单刷调试
前言 有关Android 平台 camera 调试的一些知识点,有助于调试验证. 目录 一些知识点 调试 vendor 镜像问题 调试 device-vendor.mk 调试 msm8953_came ...
- Android Camera开发(一)之基础知识
概述 Android手机关于Camera的使用,一是拍照,二是摄像,由于Android提供了强大的组件功能,为此对于在Android手机系统上进行Camera的开发,我们可以使用两类方法:一是借助In ...
- 【MTK Camera】简介与概述
Camera 硬件介绍 1.1 图像传感器的类型(Image Sensor) a) YUV sensor 输出数据(data)格式为YUV,即图像的明亮度.色度.浓度.(缩写与英文单词未对应) 图像 ...
最新文章
- 计算机类东北大学和大连理工,东北大学VS大连理工大学,谁才是第一,辽宁本地考生也两难...
- python模块基础之getpass模块
- ESP32 各种时钟参数值设置
- 多索引表 (1)boost::multi_index多索引容器
- Linux学习之CentOS(三)----将Cent0S 7的网卡名称eno16777736改为eth0
- linux suse 共享目录_SUSE环境下YAST源(连接共享目录)
- Linux的10个最危险的命令
- 不会优化数据库,早晚被优化!
- 服务器上搭shinyApp:shiny-server配置及报错解决
- 半导体界仙童“八叛逆”又一人去世,仅存一人!
- 慧荣SM2258XT+B17颗粒,固态硬盘无法格式化已开卡成功,经验分享+量产工具,SM2259XT2类似
- 2021年全球与中国飞机飞行控制系统(FCS)行业市场规模现状及企业市场份额分析
- 洛洛阅读—自己写的简约Android小说阅读器背景
- CSS中id选择器失效,代码看起来没问题
- 从0到1做好KOL运营实操
- 体验共享单车后对于Locman技术实现的几点思考
- myeclipse Snippets的配置
- python 打包exe_python pyinstaller打包exe报错的解决方法
- idea创建Maven工程后提示Maven projects need to be imported
- 第二章求100以内偶数之和
热门文章
- 【MATLAB】matlab中clc,close,close all,clear,clear all作用区别
- 绝妙的 channel
- 关于负数的除法和余数的结果
- Error in DESeqDataSet(se, design = design, ignoreRank) : some values in assay are not integers
- mysql缓冲和缓存设置
- window.event.keyCode - 兼容chrom和Firefox
- 2019年自考计算机应用基础(实践),2019年自考计算机应用基础试题练习(九)
- 红石外汇 RedstoneFX|每日汇评:澳元在非农后的反弹停滞,受困于下降趋势线
- 形容计算机科学与技术的句子,描写科学的句子精选40句
- 高等数学笔记-乐经良老师-第四章-微分中值定理和导数的应用-第四节-利用导数研究函数性态