Android Camera调用过程分析
源代码版本:allwinner 4.0.4
frameworks代码:
frameworks/base/core/java/android/hardware/Camera.java
JNI层代码:
frameworks/base/core/jni/android_hardware_Camera.cpp
client端代码:
frameworks/base/libs/camera/
server端代码:
frameworks/base/services/camera/libcameraservice/
HAL层代码:
device/softwinner/common/hardware/camera/
camera配置文件:
system/etc/ camera.cfg
先从应用程序open camera分析,其调用流程如下图:
图中,JNI的Camera::connect函数通过跨进程调用,服务端CameraService会创建Client实体BnCamera, 并且经过binder转换,返回给JNI connet函数一个BpCamera代理,有了这个代理,就可以远程调用CameraService内嵌类client的方法,如startPreview,autoFocus等等;
并且,Camera::connect将Camera对象作为参数传递给服务端,Camera类继承自BnCameraClient,所以JNI 端Camera自身也创建了BnCameraClient实体,跨进程后,CameraService获得其代理BpCameraClient,有了这个代理,服务端就可以回调Camera端的notifyCallback,dataCallback,dataCallbackTimestamp等方法。在这种情景下,可以把CameraService视为客户端,而Camera则为服务端。
framework层的调用流程大概就如上所述,HAL层是厂商自己实现的,不同方案代码结构各有不同,这里分析的是allwinner的源代码。接着以startPreview为例子,看framework层是如何调用HAL层的。调用流程如下图所示:
对上述图中简要说明几点:
1. framework的几个callback函数在构造函数初始化时候就已经注册到了HAL中,以实现HAL层有数据时候回调framework, 最终framework回调app中的注册函数
2. CameraHardware类在初始化时候开启了DoCommandThread和DoAutoFocusThread线程,用来监听上层的命令和动作,前者监听如设置摄像头的白光平衡,曝光度,快门模式等;后者用来监听自动对焦命令。
3. doStartPreview最终会调用V4L2Camera类的startWorkerThread来启动线程,该线程实现方法在V4L2CameraDevice类的inWorkerThread函数。该函数首先调用ioctl(mCamFd, VIDIOC_DQBUF, buf)获取图像数据,并将数据进行格式转换和大小缩放。最后用OSAL_Queue方法将数据入队列并发出通知信号。
4. V4L2CameraDevice类的previewThread线程收到信号,调用onNextFrameCB,回调framwork函数将数据返回上层;并调用onNextFramePreview将数据在窗口中进行预览,这就是打开摄像头看到的预览图像。
其他流程如takePicture,startRecording等和上述差不多,下面给出takePicture的流程图,其它不再重述。
最后看应用层调用takePicture拍照时候的数据回调过程。
应用层拍照的调用函数是 camera.takePicture(shutterCallback, rawCallback, jpegCallback);
shutterCallback类要实现Camera.ShutterCallback接口; rawCallback, jpegCallback类要实现Camera.PictureCallback接口,他们的一般形式如下:
//返回照片的JPEG格式的数据
private JpegCallback jpegCallback = new PictureCallback(){
public void onPictureTaken(byte[] data, Camera camera) {
Parameters ps = camera.getParameters();
if(ps.getPictureFormat() == PixelFormat.JPEG){
//存储拍照获得的图片
try {
String path = "/sdcard/"+System.currentTimeMillis()+".jpg";
File file = new File(path);
if(!file.exists())
file.createNewFile();
FileOutputStream fos = new FileOutputStream(file);
fos.write(data);
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
//将图片交给Image程序处理
Uri uri = Uri.fromFile(new File(path));
Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
intent.setDataAndType(uri, "image/jpeg");
startActivity(intent);
}
}
};
//快门按下的时候onShutter()被回调
private ShutterCallback shutterCallback = new ShutterCallback(){
public void onShutter() {
if(tone == null)
//发出提示用户的声音
tone = new ToneGenerator(AudioManager.STREAM_MUSIC, ToneGenerator.MAX_VOLUME);
tone.startTone(ToneGenerator.TONE_PROP_BEEP2);
}
};
而
rawCallback则为返回未压缩的数据,一般用不上。
其framework层的回调过程如下图:
前面已经分析,hal层取得数据后回调了cameraservice的dataCallback方法和notifyCallback方法;经过binder跨进程,回调Camera端的对应方法。
1. 在JNI中,包含了一个内部类JNICameraContext,其继承自CameraListener并实现了其notify,postData和postDataTimestamp方法。在camera初始化的时候android_hardware_Camera_native_setup方法中就已经为mListener赋值了一个JNICameraContext对象。Camera类就是通过listener->postData,listener->notify等方法调用JNICameraContext类的实现方法;JNICameraContext用env->SetByteArrayRegion(obj, 0, size, data)创建空间保存压缩过的JPEG格式图片,再通过CallStaticVoidMethod回调framework中Camera.java中的方法。
2. 在Camera.java中通过EventHandler类的handleMessage来处理JNI回调的方法,swith根据参数的不同,回调APP中相应的方法,而这些方法正是是APP当初在takePicture时候传进来的。
通过上述流程就实现了数据从HAL层到APP层的回调过程。
Android Camera调用过程分析的更多相关文章
- Android Camera 调用流程总结
1.总体介绍 Android Camera框架从整体上看是一个client/service架构.有两个进程,一个是client进程,可以看成AP端,主要包括Java代码和一些native层的c/c+ ...
- Android camera调用出现错误解决方法
开发时,先是使用三星的手机测试,发现一切正常: 但是到了小米的手机的时候,发现图片很模糊,发现是设置camera.setParameters(parameters);报错导致用的是默认的最小的分辨率, ...
- Android Camera开发系列(上)——Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片
Android Camera开发系列(上)--Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片 最近也是在搞个破相机,兼容性那叫一个不忍直视啊,于是自己翻阅了一些基本的资料,自己实现了一 ...
- Android Camera 使用小结。两种方法:一是调用系统camera app,二是自己写camera程序。
源文链接:http://www.cnblogs.com/franksunny/archive/2011/11/17/2252926.html Android Camera 使用小结 Android手机 ...
- android camera jni调用
http://www.mamicode.com/info-detail-1002139.html how to compile library of native camera for androi ...
- Android Camera解析(上) 调用系统相机拍摄照片
开发中我们常须要通过相机获取照片(拍照上传等).一般通过调用系统提供的相机应用就可以满足需求:有一些复杂需求还须要我们自己定义相机相关属性,下篇我们会涉及到. 首先我们来研究怎样简单调用系统相机应用来 ...
- qcom Android Camera【转】
本文转载自:http://blog.csdn.net/Wilsonboliu/article/details/54949196 1.总体架构 Android Camera 框架从整体上看是一个 cli ...
- 高通Android camera运行流程【转】
本文转载自:http://blog.csdn.net/unicornkylin/article/details/13293295 1.总体架构 Android Camera 框架从整体上看是一个 cl ...
- MTK Android Camera运行流程
Android Camera 运行流程 总体架构1.CameraService服务的注册2.Client端的应用层到JNI层Camera App-JNI3.Client到Service的连接4.HAL ...
随机推荐
- CVT电子集团--笔试部分试题
之前有在网上答了下CVT的网上笔试题,特别把它们都弄下来,答案参考,不一定是对的,有错希望大家能提出来. 1.有关系R和S,R∩S等价于(B) A.S-(R-S) B.R-(R-S) C.( ...
- 初探ListView
ListView可能是Android开发中最常用的一个控件,但要用的纯熟还需要不断的锻炼. 建立简单的ListView 1.在布局文件(.xml)中添加<ListView>标签 2.在Ma ...
- C#中窗体的一些简单运用(Sixteenth Day)
从今天开始,我们进入到学window form的知识,今天简单的学习了一些控件和事件的运用.没有什么很全面的理论,所以今天就总结下所写的程序.一个简单的注册页面程序 注册页面程序 要求: 1:修改所有 ...
- Random类短时间大量随机重复的问题
先声明一下,我是在那篇文章上看到的解决方法: http://dl.download.csdn.net/down10/20141103/4b173214e41ff3207305c2470524b0f3. ...
- Hibernate - cascade-and -session_state
cascade属性: 默认为none,代表不级联. 级联是指操作主对象时,对关联的对象也做相同的操作. 可设为:delete, save-update, all, none ...-- 一般是对象只归 ...
- 【LeetCode题意分析&解答】33. Search in Rotated Sorted Array
Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 migh ...
- poj 3273 Monthly Expence 简单二分
/** 大意: 有连续的n天,每一天有一定的花费,将其分成m份,每一份占一天或者连续的几天,求这m份中的最大值 思路: 二分其最大上限,看在此最大上线,能分成多少份,若大于m份,说明上限过小,需要扩大 ...
- CSS3 模拟笑脸
参考 http://www.html5tricks.com/demo/html5-css3-smile-face/index.html 它还做了舌头... 一开始我都是用JS实现的动画 当然了 眼 ...
- Lotus Sametime 服务器的安装和配置
IBM Lotus Sametime 是一款强大的实时协作软件,目前最新版本是 7.5.1.通过它,您不仅能够进行网络聊天,而且可以方便地召开网络会议.在网络社区中与其他人进行沟通.了解更多关于 Lo ...
- 求1+2+...+n
题目:求1+2+…+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字以及条件判断语句(A?B:C). 程序很简单,就看想到想不到了.悲剧,我属于后者... 算 ...