现在的位置: 首页 > 综合 > 正文

Camera

2013年10月09日 ⁄ 综合 ⁄ 共 4291字 ⁄ 字号 评论关闭


public class

Camera

extends Object


    本类主要用于和

camera
service

建立及断开连接、设置拍照功能

、开启及关闭

预览

、拍照、检索

frames

编码成

video

。本类没有默认的构造函数,你可以通过

open()

函数获得一个

Camera

对象。

      

首先要使用硬件

camera

,必须要在

manifest

文件中声明使用权限,例如应用中要使用

camera

及自动对焦功能,那么

manifest

文件中包含下列几行声明:

<uses-permission android:name="android.permission.CAMERA" />

<uses-feature android:name="android.hardware.camera" />

<uses-feature android:name="android.hardware.camera.autofocus" />


   通过该类实现照相功能,一般需要下列几个步骤

:

1

通过函数

open(int)

获得一个

camera

对象

2

通过函数

getParameters()

得到一个已有的

(

默认的

)

设置

3

如果有需要,可以通过函数

setParameters(Camera.Parameters)

,修改第二步返回的

Camera.Parameters

对象

.

4

通过函数

setDisplayOrientation(int)

来设置屏幕的水平或垂直


5

重要:传递一个已经初始化好了的

SurfaceHolder

对象给函数

setPreviewDisplay(SurfaceHolder)

如果没有

surface

carema

是无法打开预览功能。

6

重要

:

调用函数

startPreview()

更新预览的

surface

,开始照相之前必须开启预览功能

7

通过函数

l

takePicture(Camera.ShutterCallback,
Camera.PictureCallback, Camera.PictureCallback, Camera.PictureCallback)

实现照相功能

.

在回调函数中可以得到实际的相片数据

.

8        

每完成一次照相,预览功能会停止。如果要照更多像,需要再次调用

startPreview()

.

9

调用

stopPreview()

 

停止预览

.

10

重要

:

调用

release()

以便其他应用可以方便使用

camera.

使用

camera

的应用程序应该在

onPause()

(

并且在

onResume()

中重新

re-

open()


),

立即释放

camera.


 

按照以下步骤快速切换

video recording

模式

:

1        

如上所述得到一个初始化的

Camera

,并开启预览功能

.

2        

调用

unlock()

使得

media

进程可以访问

camera.

3        

camera

传递给函数

setCamera(Camera)

.

查看关于

video recording

MediaRecorder

信息

.

4        

完成了

recording

,调用

reconnect()

re-acquire and re-lock the camera.

5        

如果有需要,可以重新开启预览,照更多的相、录更多视频

.

6        

最后如上所述调用函数

stopPreview()


and

release()

来停止预览

.

     这个类不是线程安全的,这意味着是通过event thread使用该类。在绝大多数需要长时间运行的操作(预览、聚焦、照相等)都是非同步的,只要有需求就会立刻唤醒相关回调函数。而这些回调函数是由调用 open(int)的event thread来调用的。故这些类方法一定不能同时在多个线程中运行。

      注意:不同性能的android设备有不同的硬件规格,如兆像素等级和自动对焦性能,为了使你的应用和更多设备兼容,最好不要限制camera规格。

 

P

ublic Methods

public final void addCallbackBuffer (byte[] callbackBuffer)

Since: API Level 8

    
给callback buffer queue添加一个已分配好内存的buffer。应用程序可以添加一个或多个buffers到该队列中. 当一个preview frame产生并且该队列还有至少一个可用的buffer,那么该buffer将被移除队列使用。这时会唤醒preview callback。如果preview frame产生但是该队列中没有可用的buffer,那么这个frame就会被丢弃。应用程序应该在处理完buffer中数据后,再将buffer重新添加进队列。

    
Buffer的大小是由该preview image的宽,高,及每个像素的bytes三者的乘积来决定的. 通过函数getPreviewSize()来得到该preview image的 width and height.通过函数getBitsPerPixel(int) / 8可以得到每个像素包含的 Bytes ,通过函数getPreviewFormat() 可以得到该image采用的格式.

    
只有通过函数setPreviewCallbackWithBuffer(PreviewCallback)设置预览回调的时候,才会用到本函数。当通过函数setPreviewCallback(PreviewCallback) 或setOneShotPreviewCallback(PreviewCallback)设置预览回调时,所需的buffer由系统自动分配。

Parameters

callbackBuffer,添加到队列中的buffer。该buffer的大小应该是width * height * bits_per_pixel / 8.

 

public final void

autoFocus

(Camera.AutoFocusCallback

cb)

Since: API Level 1

打开

camera

的自动对焦功能并且注册一个当

camera

对焦时的回调函数。这个函数只在

preview

激活的时候有效

(

即在

startPreview()


and before

stopPreview()

之间。

调用者应该通过函数

getFocusMode()

 

来查看是否可以使用

autoFocus()

函数,如果

camera

并不支持

auto-focus,

那么该函数不做任何处理,立即调用

onAutoFocus(Boolean ,Camera)

函数。如果你的应用不能安装在没有自动对焦的设备上,你需要在你的应用程序中通过

<uses-feature>manifest

元素声明需要使用自动对焦功能。

如果当前的

flash mode

不是

FLASH_MODE_OFF

flash

将在自动对焦过程中启动,具体依赖于驱动及

camera

硬件。

public final void
cancelAutoFocus



()

Since: API Level 5

取消任何当前正在运行的
auto-focus.
该方法将
focus position
重置为默认的值。如果
camera
不支持
auto-focus
,该方法不做任何操作。

See
Also

autoFocus(Camera.AutoFocusCallback)


public static void
getCameraInfo



(int cameraId, Camera.CameraInfo

cameraInfo)


Since: API Level 9

返回某一特定
camera
的信息

如果

getNumberOfCameras()


返回
N
,有效
id

0

N-1


public static int
getNumberOfCameras



()

Since: API Level 9

返回本设备上的所有可用的物理
camera
个数


public Camera.Parameters


getParameters



()

Since: API Level 1

返回当前
Camera service
的设置,如果要修改参数,必须将返回的
Parameters
对象传递给函数
setParameters(Camera.Parameters)



实现
.

See
Also

setParameters(Camera.Parameters)


public final void
lock



()

Since: API Level 5

Re-locks
the camera to prevent other processes from accessing it. Camera objects are
locked by default unless

unlock()



is called. Normally

reconnect()



is used instead.

If
you are not recording video, you probably do not need this method.


camera
加锁以防止其他进程的访问,默认情况下
camera
是被锁的,除非调用
unlock()
函数解锁。通常可以通过函数

reconnect()


代替。如果你不需要
recording viedo
功能,你不需要使用该方法。

Throws

RuntimeException


if the camera cannot be
re-locked (for example, if the camera is still in use by another process).


public static Camera


open



(int cameraId)

Since: API Level 9

创建一个新的
camera
对象以使用
camera
硬件

当你使用了
camera
后,一定要调用
release(),
否则
camera
将被一直锁住,无法被其他应用程序使用。

应用程序同时只能存在一个激活的
camera

其他方法的
callback
函数会传递给调用
open()
函数的线程的
event loop
。如果该线程没有
event loop
,那么回调函数就会被传递给
main application event loop
,如果没有
main application event loop

callback
函数不会传递

注意

:


在一些设备上,该方法会运行很长一段时间,最好是在一个
worker
线程上调用该函数(
(possibly using
AsyncTask


)以避免阻塞
main application UI thread.

Parameters

cameraId

the hardware camera to
access, between 0 and

getNumberOfCameras()


-1.

Returns

返回一个
connected
locked


ready for use

抱歉!评论已关闭.