一种Android中支持双摄像头的方法
【技术领域】
本发明涉及移动终端操作系统,具体是指一种Android中支持双摄像头的方法。
【背景技术】
来自中国互联网络信息中心发布的统计数据显示,截至目前,我国通过手机上网的人数已经达到2.77亿,使用手机上网的网民比例已经攀升至网民总数的65.9%,这些数字都预示了移动互联时代的全面到来。
2010年上半年,随着苹果公司推出具有划时代意义的iPad,平板电脑成为市场上备受瞩目的移动终端,与智能手机共同成为移动互联网时代的重要的助推力量。
随着3G时代的到来,网络传输速度相比之前的2G(GSM)时代得到了大幅提升。智能移动终端的功能也变得更加丰富,应用更加多元化,由原来单一的语音通话和简单的音视频功能,发展成为集语音通话、网络接入、影视娱乐、数据服务为一体的综合性个人手持终端设备。拍照功能在移动终端中已经得到了广泛普及,几乎成为了“标配”。而在3G时代,视频通话功能成为最令人期待的应用之一。因此,在终端设备上实现对双摄像头的支持也是迫切的需求,后置较大像素摄像头用于改分辨率拍照和录制,前置较小分辨率摄像头用于视频通话的视频采集。
智能手机操作系统市场中,作为早期发展起来的Symbian和WindowMobile操作系统,已现下滑趋势。而新兴的Android凭借出色的用户体验和自身的优势,表现出巨大的发展潜力。随着Google不断更新Android操作系统以适应平板电脑设备需要,三星P1000和联想乐pad等基于Android系统的平板电脑也不断在市场上受到追捧。
在Google发布的Android 2.1版本(eclair)的原生系统里,默认只支持一个摄像头,并没有加入对双摄像头的支持。因此针对使用此版本系统的移动终端设备,需要在原生系统中用简洁高效的方法来满足这种需求。
Android 2.3版本在2010年年底发布,其中已经在框架层已经支持双摄像头。但是Android 2.1版本在2010年年初发布,对于追随Android系统的硬件厂商直接升级到2.3版本时间有限,开发成本也很高。另外,在移植2.3版本的双摄像头框架部分到2.1版本上,修改框架部分较多,工作量较大。
【发明内容】
本发明所要解决的技术问题在于提供一种简单高效的Android 2.1版本中支持双摄像头的方法,可以应用于使用该系统并需要双摄像头支持的智能手机、平板电脑等电子产品。
本发明采用以下技术方案解决上述技术问题:
一种Android2.1版本中支持双摄像头的方法,包括如下步骤:
步骤一:增加偏好设置资源:
$CAM_PACK/res/xml/camera_preferences.xml中记录了需要记录的一些配置参数的字符串和数组资源,实现双摄像头只要在原基础上增加一个新参数-当前正在使用的摄像头的朝向,来表明当前正在使用的是双摄像头中的哪一个,为当前使用摄像头的朝向信息添加新的ListPreference作为其中一个配置;其中,数组资源需要在$CAM_PACK/res/values/arrays.xml中定义,字符串资源需要在$CAM_PACK/res/values/strings.xml中定义,需要其他语言支持的话,还要在其他语言的values文件夹中定义对应的字符串;
步骤二:应用获取系统权限:
对于camera模块的应用层client端和硬件抽象层service端所运行的进程可以通过ps命令进行查看,通过ps-w命令可以看到进程的UID号,将应用中的AndroidManifest.xml文件中默认的sharedUserId改为″android.uid.system″使得Camera应用运行在system进程下,UID固定为1000;然后,在property_service.c中的鉴权数组property_perms[]中增加成员:{″app_camera.″,AID_SYSTEM,0},后在Camera应用进程中设置app_camera.为前缀的属性;
步骤三:增加配置文件键值对:
Camera应用中开始时初始化一个SharedPreferences实例,将在应用私用数据存储路径的shared_prefs目录下创建默认的com.android.camera_preferences的xml文件,用于存储camera_preferences.xml中定义的配置参数,对于新增加的双摄像头朝向配置参数,需要在该xml文件中利用SharedPreferences的API增加相应的键值对;这个操作只要在检测到配置参数未设置的情况下去添加,否则的话,就保留上一次的设置;
步骤四:硬件抽象层获取设置:
在camera硬件抽象层中,首先都要打开Linux中对应的设备节点,即/dev/videoX,通过property_get函数来读取当前的摄像头朝向属性,根据读取到的值来判断是为前置或是后置摄像头,并打开相应设备;
步骤五:应用监听并改变设置:
在Camera应用中实现了SharedPreferences的监听接口,这个接口对应的实现函数负责监听preference中参数设置与用户交互后的改动,在这个函数里判断如果摄像头的朝向设置有改变时,就设置对应的属性;在设置改变后,需要发送Intent重新启动Camera应用,此时在硬件抽象层打开设备之前,读取到的摄像头朝向就是在应用层设置过的属性值。
本发明的优点在于:通过利用Android系统现有的数据存储机制和属性系统,既能实现对Android 2.1版本的双摄像头的支持,也无需改动原有的框架代码,实现起来非常方便和高效。而且这种实现方法的原理机制在Android的主流版本都是支持的,因此不受目前的Android版本的限制,乃至在后续的版本中仍然可以继续得到使用。
【附图说明
下面参照附图结合实施例对本发明作进一步的描述。
图1是本发明实现双摄像头支持后的应用运行流程图。
【具体实施方式】
根据Android 2.1系统现有架构,实现双摄像头支持后的应用运行流程图如图1所示。
按照图1所示的流程,实现双摄像头支持主要有以下几个步骤:
步骤一:增加偏好设置资源
SharedPreferences是Android中存储简单数据的一个工具类。它提供一种轻量级的数据存储方式,通过用键值对(key-value)的方式把简单数据类型存储在应用程序的私有目录下(/data/data/$PACKAGE_NAME/shared_prefs/)定义的xml文件中。
Android 2.1 Camera应用(package/apps/Camera目录,以下标示为$CAM_PACK)中已经采用了这种方法来记录camera的一些配置参数,实现双摄像头只要在原基础上增加一个新参数——当前正在使用的摄像头。双摄像头分后置和前置,据此可以使用摄像头的朝向(facing)来表明当前正在使用的是双摄像头中的哪一个。
$CAM_PACK/res/xml/camera_preferences.xml中记录了需要记录的一些配置参数的字符串和数组资源,可以参考已有的设置,为当前使用摄像头的朝向信息添加新的ListPreference作为其中一个配置。
其中,数组资源需要在$CAM_PACK/res/values/arrays.xml中定义,字符串资源需要在$CAM_PACK/res/values/strings.xml中定义,需要其他语言支持的话,还要在其他语言的values文件夹中定义对应的字符串,如中文需要在$CAM_PACK/res/values-zh-rCN/strings.xml中定义。
步骤二:应用获取系统权限
Android属性系统中的每个属性都有一个名称和值,他们都是字符串格式,用来记录系统设置或进程之间的信息交换。属性是在整个系统中全局可见的。每个进程都可以get属性。而set属性需要相应的权限。
获取和设置属性的API为在system/core/init/property_service.c中定义的property_get和property_get在system/core/init/property_service.c。其中property_set中在check_perms函数中需要进行鉴权,即设置属性的进程需要相应的权限。
对于camera模块的应用层(client端)和硬件抽象层(service端)所运行的进程可以通过ps命令进行查看,例如:
app_6 1389 692 318928 18584 ffffffff afe0da04 S com.android.camera
通过ps-w命令可以看到进程的UID号,app_6为10006。Android系统中某些系统进程的UID是固定的,而每个应用默认是运行在自己独立的一个进程,而且进程UID是不固定的。但是Android提供了定义共享进程sharedUserId的方法以使应用进程可以共享同一个进程,而且可以与system进程共享。而system进程的UID在Android中是固定为1000的。因此,可以将应用中的AndroidManifest.xml文件中默认的sharedUserId改为″androiduid.system″使得Camera应用运行在system进程下,UID固定为1000。
然后,在property_service.c中的鉴权数组property_perms[]中增加成员:{″app_camera.″,AID_SYSTEM,0}就可以在Camera应用进程中设置app_camera.为前缀的属性。
步骤三:增加配置文件键值对
Camera应用中开始时初始化一个SharedPreferences实例,将在应用私用数据存储路径的shared_prefs目录下创建默认的com.android.camera_preferences的xml文件,用于存储camera_preferences.xml中定义的配置参数,对于新增加的双摄像头朝向配置参数,需要在该xml文件中利用SharedPreferences的API增加相应的键值对。这个操作只要在检测到配置参数未设置的情况下去添加,否则的话,就保留上一次的设置。
步骤四:硬件抽象层获取设置
在camera硬件抽象层中,尽管这部分代码不尽相同,但是首先都要打开Linux中对应的设备节点,即/dev/videoX。通过property_get函数来读取当前的摄像头朝向属性,根据读取到的值来判断是为前置或是后置摄像头,并打开相应设备。
另外需要说明的是,在做上述摄像头切换选择之前需要确保系统中有两个摄像头可以使用(即两个对应设备节点),这可以通过探测/dev/videoX设备节点的方法来实现。
步骤五:应用监听并改变设置
在Camera应用中实现了SharedPreferences的监听接口,这个接口对应的实现函数负责监听preference中参数设置与用户交互后的改动。在这个函数里判断如果摄像头的朝向设置有改变时,就设置对应的属性。
在设置改变后,需要发送Intent重新启动Camera应用,此时在硬件抽象层打开设备之前,读取到的摄像头朝向就是在应用层设置过的属性值。通过Android的这种属性系统设置来实现应用层和硬件抽象层的关联,便于用户界面和底层硬件的交互。
本发明利用Android 2.1原生系统中已有的特性,用一种简单高效的方式实现了Android 2.1系统上对双摄像头的支持。该方法避免了对原有框架代码的改变,采用的机制原理是Android主流版本所支持的,有较强的适应性。