文档内容:修改原生接口,使用节点控制的方式替换原生调用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 手电筒修改相关推荐

  1. 全志A31下5M的CMOS Camera移植修改记录表

    最近一段时间都在用A31评估几颗5M的摄像头,包括ov5640.MT9P001.ov2710.A31下移植不同的摄像头驱动的好处在于,驱动结构规范化,采用video_device下的suddev的架构 ...

  2. 02-Linux 网络基础(Network Namespase、veth pair、bridge、Iptables)

    Linux 网络基础 Network Namespase 简单认识 Linux的namespace(名字空间)的作用就是"隔离内核资源".在Linux的世界里,文件系统挂载点.主机 ...

  3. PPC修改注册表大全 (注册表必看)(转载)

    在PPC上很多功能可以通过改注册表实现  下面是一些较为常用的注册表修改方法 一共有133条 前面是目录 后面对应的是实现功能和修改方法--希望对大家有帮助 理论上通用与WM2003  5.0 6.1 ...

  4. Android camera开发(11)---Camera软件架构

    Camera软件架构 Camera软件架构 主要包含三个部分的介绍: 1)Android Camera 架构:Android系统原生架构简要介绍. 2)Mediatek Android Camera架 ...

  5. MTK 驱动开发(22)---camera 硬件和软件概述

    1.Camera 硬件介绍 1,Image Sensor类型 a)     YUV Sensor YUV Sensor输出的Data格式为YUV,图像的效果处理使用Sensor内部的ISP,BB端接收 ...

  6. 召唤神龙~让我们来看看源码及简单的修改分析,讲的很清楚哦

    最近召唤神龙好火哈哈哈哈哈哈哈 先给大家一个官方正版链接:[召唤神龙] 在给大家一套源码,这个源码不能本地运行,可以简单搭个服务器环境就可以啦:https://gitee.com/bendantada ...

  7. Qcom平台 Camera 之单刷调试

    前言 有关Android 平台 camera 调试的一些知识点,有助于调试验证. 目录 一些知识点 调试 vendor 镜像问题 调试 device-vendor.mk 调试 msm8953_came ...

  8. Android Camera开发(一)之基础知识

    概述 Android手机关于Camera的使用,一是拍照,二是摄像,由于Android提供了强大的组件功能,为此对于在Android手机系统上进行Camera的开发,我们可以使用两类方法:一是借助In ...

  9. 【MTK Camera】简介与概述

    Camera 硬件介绍 1.1  图像传感器的类型(Image Sensor) a) YUV sensor 输出数据(data)格式为YUV,即图像的明亮度.色度.浓度.(缩写与英文单词未对应) 图像 ...

最新文章

  1. 计算机类东北大学和大连理工,东北大学VS大连理工大学,谁才是第一,辽宁本地考生也两难...
  2. python模块基础之getpass模块
  3. ESP32 各种时钟参数值设置
  4. 多索引表 (1)boost::multi_index多索引容器
  5. Linux学习之CentOS(三)----将Cent0S 7的网卡名称eno16777736改为eth0
  6. linux suse 共享目录_SUSE环境下YAST源(连接共享目录)
  7. Linux的10个最危险的命令
  8. 不会优化数据库,早晚被优化!
  9. 服务器上搭shinyApp:shiny-server配置及报错解决
  10. 半导体界仙童“八叛逆”又一人去世,仅存一人!
  11. 慧荣SM2258XT+B17颗粒,固态硬盘无法格式化已开卡成功,经验分享+量产工具,SM2259XT2类似
  12. 2021年全球与中国飞机飞行控制系统(FCS)行业市场规模现状及企业市场份额分析
  13. 洛洛阅读—自己写的简约Android小说阅读器背景
  14. CSS中id选择器失效,代码看起来没问题
  15. 从0到1做好KOL运营实操
  16. 体验共享单车后对于Locman技术实现的几点思考
  17. myeclipse Snippets的配置
  18. python 打包exe_python pyinstaller打包exe报错的解决方法
  19. idea创建Maven工程后提示Maven projects need to be imported
  20. 第二章求100以内偶数之和

热门文章

  1. 【MATLAB】matlab中clc,close,close all,clear,clear all作用区别
  2. 绝妙的 channel
  3. 关于负数的除法和余数的结果
  4. Error in DESeqDataSet(se, design = design, ignoreRank) : some values in assay are not integers
  5. mysql缓冲和缓存设置
  6. window.event.keyCode - 兼容chrom和Firefox
  7. 2019年自考计算机应用基础(实践),2019年自考计算机应用基础试题练习(九)
  8. 红石外汇 RedstoneFX|每日汇评:澳元在非农后的反弹停滞,受困于下降趋势线
  9. 形容计算机科学与技术的句子,描写科学的句子精选40句
  10. 高等数学笔记-乐经良老师-第四章-微分中值定理和导数的应用-第四节-利用导数研究函数性态