首先找到Android拍照的时候所执行的函数代码在:

packages/apps/Camera/src/com/android/camera/Camera.java

找到这个地方:

mCameraDevice.setParameters(mParameters);  
mCameraDevice.takePicture(mShutterCallback, mRawPictureCallback,  
        mPostViewPictureCallback, new JpegPictureCallback(loc));  
mPreviewing = false;

据我理解,这里就是拍照的时候所执行的,而这里应该是调用的camera库里的takepicture下面我们找到库文件:

device/samsung/proprietary/libcamera

库文件就在这里,下面我们进入SeccameraHWInterface.cpp文件查找takepicture如下:

status_t CameraHardwareSec::takePicture()  
{  
    LOGV("%s :", __func__);  
  
    stopPreview();  
  
    Mutex::Autolock lock(mStateLock);  
    if (mCaptureInProgress) {  
        LOGE("%s : capture already in progress", __func__);  
        return INVALID_OPERATION;  
    }  
  
    if (mPictureThread->run("CameraPictureThread", PRIORITY_DEFAULT) != NO_ERROR) {  
        LOGE("%s : couldn't run picture thread", __func__);  
        return INVALID_OPERATION;  
    }  
    mCaptureInProgress = true;  
  
    return NO_ERROR;  
}

里面的mPictureThread->run就是拍照的东西了,具体我就不分析了。接下来我们找下闪光灯的接口

在SecCamera.h里你会发现下面三个函数接口:

bool            getFlashSupport(void);  
int            setFlashMode(int flash_mode);  
int            getFlashMode(void);

其中setFlashMode即为设置闪光灯的接口,找到这个函数

在SecCamera.cpp里如下:

int SecCamera::setFlashMode(int flash_mode)  
{  
    LOGV("%s(flash_mode(%d))", __func__, flash_mode);  
  
    if (flash_mode <= FLASH_MODE_BASE || FLASH_MODE_MAX <= flash_mode) {  
        LOGE("ERR(%s):Invalid flash_mode (%d)", __func__, flash_mode);  
        return -1;  
    }  
  
    if (m_params->flash_mode != flash_mode) {  
        m_params->flash_mode = flash_mode;  
        if (m_flag_camera_start) {  
            if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_FLASH_MODE, flash_mode) < 0) {  
                LOGE("ERR(%s):Fail on V4L2_CID_CAMERA_FLASH_MODE", __func__);  
                return -1;  
            }  
        }  
    }  
    return 0;  
}

这里又会调用fimc_v4l2_s_ctrl函数代码如下:

static int fimc_v4l2_s_ctrl(int fp, unsigned int id, unsigned int value)  
{  
    struct v4l2_control ctrl;  
    int ret;  
  
    ctrl.id = id;  
    ctrl.value = value;  
    //LOGD("%s :--------------------------value is %d",__func__,value);//add dao  
    ret = ioctl(fp, VIDIOC_S_CTRL, &ctrl);  
    if (ret < 0) {  
        LOGE("ERR(%s):VIDIOC_S_CTRL(id = %#x (%d), value = %d) failed ret = %d\n",  
            __func__, id, id-V4L2_CID_PRIVATE_BASE, value, ret);  
  
        return ret;  
    }  
  
    return ctrl.value;  
}

在这里进行了ioctl下面我们到内核里面去看看。

在内核下面的drivers/media/video/v4l2-ioctl.c有如下代码:

case VIDIOC_S_CTRL:  
{  
    struct v4l2_control *p = arg;  
    struct v4l2_ext_controls ctrls;  
    struct v4l2_ext_control ctrl;  
  
    if (!ops->vidioc_s_ctrl && !ops->vidioc_s_ext_ctrls)  
        break;  
  
    dbgarg(cmd, "id=0x%x, value=%d\n", p->id, p->value);  
  
    if (ops->vidioc_s_ctrl) {  
        ret = ops->vidioc_s_ctrl(file, fh, p);  
        break;  
    }  
    if (!ops->vidioc_s_ext_ctrls)  
        break;  
  
    ctrls.ctrl_class = V4L2_CTRL_ID2CLASS(p->id);  
    ctrls.count = 1;  
    ctrls.controls = &ctrl;  
    ctrl.id = p->id;  
    ctrl.value = p->value;  
    if (check_ext_ctrls(&ctrls, 1))  
        ret = ops->vidioc_s_ext_ctrls(file, fh, &ctrls);  
    break;  
}

很快我就想到了摄像头驱动里有这样的设置:

代码在drivers/media/video/samsung/ficm/ov2640.c

static const struct v4l2_subdev_core_ops ov2640_core_ops = { 
.init = ov2640_init, /* initializing API */ 
.s_config = ov2640_s_config, /* Fetch platform data */ 
.queryctrl = ov2640_queryctrl, 
.querymenu = ov2640_querymenu, 
.g_ctrl = ov2640_g_ctrl, 
.s_ctrl = ov2640_s_ctrl, 
};

这里有一个s_ctrl,事实证明确实是执行了ov2640_s_ctrl至于怎么调用过来的没有深入研究。

下面我们看到这个函数开始的部分

static int ov2640_s_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl) 

struct i2c_client *client = v4l2_get_subdevdata(sd); 
struct ov2640_state *state = to_state(sd); 
int err = 0; 
int value = ctrl->value;

switch (ctrl->id) {

case V4L2_CID_CAMERA_FLASH_MODE: 
case V4L2_CID_CAMERA_BRIGHTNESS: 
break;

第一个就是闪光灯的选项,文件系统里面设置闪光灯的就是传入的这个,可没作任何处理就直接跳出了。下面我在增加闪光灯驱动:

static int flash_ctrl(int mode) 

int err;

err = gpio_request(S5PV210_GPD0(2), "GPD0"); //power 
if (err) { 
printk(KERN_ERR "failed to request GPD0 for " 
"flashlight power control\n"); 
return err; 

gpio_direction_output(S5PV210_GPD0(2), 1);

err = gpio_request(S5PV210_GPD0(3), "GPD0"); //mode 
if (err) { 
printk(KERN_ERR "failed to request GPD0 for " 
"flashlight mode control\n"); 
return err; 

/* 
high is flash mode,low is torch mode 
*/ 
switch(mode) { 
case FLASH_MODE_ON: 
gpio_direction_output(S5PV210_GPD0(3), 1); 
break; 
case FLASH_MODE_TORCH: 
gpio_direction_output(S5PV210_GPD0(3), 0); 
break; 
default: 
break; 

mdelay(100); 
gpio_direction_output(S5PV210_GPD0(2), 0);

gpio_free(S5PV210_GPD0(2)); 
gpio_free(S5PV210_GPD0(3)); 
return err; 
}

电路我就不发出来了,流程搞清楚了,大家就好弄了。

修改ov2640_s_ctrl为:

case V4L2_CID_CAMERA_FLASH_MODE:

err = flash_ctrl(value); 
break;

只修改相关设置,其它的不变。现在接口已经全部写好,在看到文件系统里。
在拍照之前加上闪光灯设置,这个可以在库里设置也可以在app里设置,我直接在库里设置的,路径我就不在打了,前面的相关函数已经全部给出了,如下:

status_t CameraHardwareSec::takePicture() 

LOGV("%s :", __func__);

stopPreview();

Mutex::Autolock lock(mStateLock); 
if (mCaptureInProgress) { 
LOGE("%s : capture already in progress", __func__); 
return INVALID_OPERATION; 
}

mSecCamera->setFlashMode(FLASH_MODE_ON);//add by dao

if (mPictureThread->run("CameraPictureThread", PRIORITY_DEFAULT) != NO_ERROR) { 
LOGE("%s : couldn't run picture thread", __func__); 
return INVALID_OPERATION; 

mCaptureInProgress = true;

return NO_ERROR; 
}

在拍照之前设置FlashMode为FLASH_MODE_ON模式,结果发现这样不行,搞了半天终于发现问题所在,直接把setFlashMode改为如下:

int SecCamera::setFlashMode(int flash_mode) 

LOGV("%s(flash_mode(%d))", __func__, flash_mode);

fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_FLASH_MODE, flash_mode); 
/* 
if (flash_mode <= FLASH_MODE_BASE || FLASH_MODE_MAX <= flash_mode) { 
LOGE("ERR(%s):Invalid flash_mode (%d)", __func__, flash_mode); 
return -1; 
}

if (m_params->flash_mode != flash_mode) { 
m_params->flash_mode = flash_mode; 
if (m_flag_camera_start) { 
if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_FLASH_MODE, flash_mode) < 0) { 
LOGE("ERR(%s):Fail on V4L2_CID_CAMERA_FLASH_MODE", __func__); 
return -1; 



*/ 
return 0; 
}

重新编译库和内核,下载,结果测试成功。

Android 为摄像头增加闪光灯相关推荐

  1. android 为摄像头增加闪光灯(s5pv210)

    昨天刚好闪光灯弄过来,今天简单的做下总结.大概的说下,具体我也没有深入研究,不过效果确实是有了. 首先找到android拍照的时候所执行的函数代码在: packages/apps/Camera/src ...

  2. Android -- 获取摄像头帧数据解码

    由于Android下摄像头预览数据只能  ImageFormat.NV21 格式的,所以解码时要经过一翻周折. Camera mCamera = Camera.open();Camera.Parame ...

  3. android 7调用摄像头,Android调用摄像头拍照(兼容7.0)

    [实例简介] Android调用摄像头拍照(兼容7.0)Demo,原博客文章https://blog.csdn.net/u010356768/article/details/70808162 [实例截 ...

  4. Android双目三维重建:Android双目摄像头实现双目测距

    Android双目三维重建:Android双目摄像头实现双目测距 目录 Android双目三维重建:Android双目摄像头实现双目测距 1.开发版本 2.Android双目摄像头 3.双目相机标定 ...

  5. dso与Android,DSO 安装及运行 —— dso_ros + Android 手机摄像头

    转载请注明出处,谢谢 原创作者:Mingrui 原创链接:https://www.cnblogs.com/MingruiYu/p/12425855.html 本文要点: dso 配置安装 dso 离线 ...

  6. android 切换摄像头加动画,android前后摄像头切换

    android前后摄像头切换demo,startview后的页面上有切换.拍照两个按钮,拍照后照片未保存,需要保存的请看下方注释,实现了拍照.聚焦功能,以下是CameraPreview.java源码: ...

  7. 基于计算机视觉的Android手机摄像头实现长度测量

    前言:该项目创作于几年前,当时采用的技术和开发环境想必现在已经得到了大大的改进,欢迎有了解最新技术进展的同行来交流指点. Android手机摄像头实现长度测量 1.功能简介 使用手机摄像头拍摄目标物体 ...

  8. android 相机闪光灯,在Android中使用相机闪光灯闪烁

    我已经写了一个简单的代码,它应该会在500ms暂停时闪烁Android设备的相机闪光灯.但有些事情是没有做...在Android中使用相机闪光灯闪烁 public void flicker_500ms ...

  9. Android OpenGL 摄像头,使用OpenGLES 在 android 上显示摄像头滤镜效果

    突然发现 下午无事可干了,心里慌得狠,总想找点事儿事情做.初学android,也是初学OpenGLES,想起自己的许多经验都是这个平台给予的,今天在这里也分享下一段自己整合的代码,如何使用Opengl ...

最新文章

  1. swift 连接mysql数据库_Swift - 操作SQLite数据库(引用SQLite3库)
  2. Java内存模型与线程(思维导图)
  3. 阿里云mysql 日志_mysql日志-阿里云开发者社区
  4. 前端学习(3244):react的生命周期新
  5. centos 安装低版本内核_Docker安装教程
  6. 微软05年面临的10大挑战
  7. 【蓝桥结果填空】:时间显示
  8. android伸缩动画,Android 伸缩动画xml配置
  9. 使用Java代码发送邮件
  10. MongoDB 覆盖索引查询
  11. win8下IE10停止工作解决办法
  12. 《英国金融科技国家报告》翻译与摘录
  13. 让我们一起来做软件专利流氓吧
  14. js多维数组包含有children时,将数组平铺成一维数组
  15. Switch 开关,将字写在滑块上面
  16. Android版股票K线图实现方案
  17. WIN7下网络共享设置
  18. 【Maven】什么是Maven?Maven有什么用?
  19. Show 与 ShowModal 区别
  20. 漏洞分析丨HEVD-10.TypeConfusing[win7x86]

热门文章

  1. 探店通系统,短视频矩阵源码,抖音矩阵系统,look
  2. Mac node切换版本,指定版本
  3. 俺的作品也开始有盗版了... hiahia... 奇怪, 为什么我反而很得意涅...
  4. 关于C语言中的重点转义字符详解
  5. Vue项目中常见问题(23)动态展示Floor组件
  6. VC++常用功能开发
  7. springboot整合Chat Generative Pre-trained Transformer
  8. Serverless无服务器介绍、原理及应用场景分析
  9. strchr()函数与strrchr()函数的实现
  10. MD5加密(MD5Util )