page.title=Camera Version 1 @jd:body
Android's camera HAL connects the higher level camera framework APIs in android.hardware to your underlying camera driver and hardware. The following figure and list describe the components involved and where to find the source for each:
frameworks/base/core/jni/android_hardware_Camera.cpp
. This code calls the lower level
native code to obtain access to the physical camera and returns data that is used to create the
android.hardware.Camera object at the framework level.frameworks/av/camera/Camera.cpp
provides a native equivalent
to the android.hardware.Camera class.
This class calls the IPC binder proxies to obtain access to the camera service.frameworks/av/camera
directory that calls into
camera service. ICameraService is the interface to the camera service, ICamera is the interface
to a specific opened camera device, and ICameraClient is the device's interface back to the application framework.frameworks/av/services/camera/libcameraservice/CameraService.cpp
, is the actual code that interacts with the HAL.
The HAL sits between the camera driver and the higher level Android framework
and defines an interface that you must implement so that apps can
correctly operate the camera hardware. The HAL interface is defined in the
hardware/libhardware/include/hardware/camera.h
and
hardware/libhardware/include/hardware/camera_common.h
header files.
camera_common.h
defines an important struct, camera_module
, which defines a standard
structure to obtain general information about the camera, such as its ID and properties
that are common to all cameras such as whether or not it is a front or back-facing camera.
camera.h
contains the code that corresponds mainly with
android.hardware.Camera. This header file declares a camera_device
struct that contains a camera_device_ops
struct with function pointers
that point to functions that implement the HAL interface. For documentation on the
different types of camera parameters that a developer can set,
see the frameworks/av/include/camera/CameraParameters.h
file.
These parameters are set with the function pointed to by
int (*set_parameters)(struct camera_device *, const char *parms)
in the HAL.
For an example of a HAL implementation, see the implementation for the Galaxy Nexus HAL in
hardware/ti/omap4xxx/camera
.
You need to set up the Android build system to
correctly package the HAL implementation into a shared library and copy it to the
appropriate location by creating an Android.mk
file:
device/<company_name>/<device_name>/camera
directory to contain your
library's source files.Android.mk
file to build the shared library. Ensure that the Makefile contains the following lines:
LOCAL_MODULE := camera.<device_name> LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw
Notice that your library must be named camera.<device_name>
(.so
is appended automatically),
so that Android can correctly load the library. For an example, see the Makefile
for the Galaxy Nexus camera located in hardware/ti/omap4xxx/Android.mk
.
frameworks/native/data/etc
directory with your
device's Makefile. For example, to specify that your device has a camera flash and can autofocus,
add the following lines in your device's
<device>/<company_name>/<device_name>/device.mk
Makefile:
PRODUCT_COPY_FILES := \ ... PRODUCT_COPY_FILES += \ frameworks/native/data/etc/android.hardware.camera.flash-autofocus.xml:system/etc/permissions/android.hardware.camera.flash-autofocus.xml \
For an example of a device Makefile, see device/samsung/tuna/device.mk
.
device/<company_name>/<device_name>/media_profiles.xml
and
device/<company_name>/<device_name>/media_codecs.xml
XML files.
For more information, see Exposing
Codecs and Profiles to the Framework for information on how to do this.
device/<company_name>/<device_name>/device.mk
Makefile to copy the media_profiles.xml
and media_codecs.xml
files to the appropriate location:
# media config xml file PRODUCT_COPY_FILES += \ <device>/<company_name>/<device_name>/media_profiles.xml:system/etc/media_profiles.xml # media codec config xml file PRODUCT_COPY_FILES += \ <device>/<company_name>/<device_name>/media_codecs.xml:system/etc/media_codecs.xml
Declare that you want to include the Camera app in your device's system image by
specifying it in the PRODUCT_PACKAGES
variable in your device's
device/<company_name>/<device_name>/device.mk
Makefile:
PRODUCT_PACKAGES := \ Gallery2 \ ...