camera 订阅
camera,英语单词,名词,意为“照相机;摄影机”。 展开全文
camera,英语单词,名词,意为“照相机;摄影机”。
信息
外文名
camera
词    性
名词
camera单词发音
英[ˈkæmrə]美[ˈkæmrə] [1] 
收起全文
精华内容
下载资源
问答
  • camera

    千次阅读 2012-01-30 17:48:04
    本类主要用于和 camera service 建立及断开连接、设置拍照功能 、开启及关闭 预览 、拍照、检索 frames 编码成 video 。本类没有默认的构造函数,你可以通过 open() 函数获得一个 Camera 对象。  首先要使用硬件 ...
     本类主要用于和 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 的 Camera objecte.

    Throws

    RuntimeException

    if connection to the camera service fails (for example, if the camera is in use by another process).

    public static Camera open ()

    Since: API Level 1

    创建一个新的访问设备上第一个 back-facing camera 的 Camera 类对象,如果设备没有 back-facing camera ,则该函数返回 null 。

    See Also

    open(int)

    public final void reconnect ()

    Since: API Level 8

    在另一个进程使用之后,重新与 camera 建立连接。进程 unlock() 之后,该进程可能仍在使用 camera( 这里理解不知是否恰当 ) ,当其使用完毕后,你一定要与 camera 重新建立连接,这样可重新获得锁以继续使用 camera 。

    如果调用了 setCamera(Camera) ,该接口一定要在 MediaRecorder 之后调用。

    当然如果你不需要使用 recording video ,你不用使用该函数

     

    Throws

    IOException

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

    public final void release ()

    Since: API Level 1

    断开和释放 Camera 对象资源,当使用完了 camera ,你要尽快调用该函数。

    public final void setDisplayOrientation (int degrees)

    Since: API Level 8

    设置 preview 的顺时针旋转角度。这将影响 preview frames 和拍照之后的相片显示。该方法主要用于垂直模式的应用。注意在旋转之前, front-facing cameras 的 preview 显示是水平 flip 的,这就是说, image 是沿着 camera sensor 的垂直中心轴来反射的 (无法理解其意思)。所以用户可以像照镜子一样看到他们自己。这不会影响传入函数 onPreviewFrame(byte[], Camera) 的、 JPEG 相片的、或记录的 video 的 byte array 的顺序。在 preview 期间是不允许调用该方法的。如果你想要是你的照片和显示出来的角度一致,你可以参考下列代码:

     

      public static void setCameraDisplayOrientation ( Activity activity ,
              int cameraId , android . hardware . Camera camera ) {
         android . hardware . Camera . CameraInfo info =
                  new android . hardware . Camera . CameraInfo ();
         android . hardware . Camera . getCameraInfo ( cameraId , info );
          int rotation = activity . getWindowManager (). getDefaultDisplay ()
                  . getRotation ();
          int degrees = 0 ;
          switch ( rotation ) {
              case Surface . ROTATION_0 : degrees = 0 ; break ;
              case Surface . ROTATION_90 : degrees = 90 ; break ;
              case Surface . ROTATION_180 : degrees = 180 ; break ;
              case Surface . ROTATION_270 : degrees = 270 ; break ;
          }

          int result ;
          if ( info . facing == Camera . CameraInfo . CAMERA_FACING_FRONT ) {
             result = ( info . orientation + degrees ) % 360 ;
             result = ( 360 - result ) % 360 ;   // compensate the mirror
          } else {   // back-facing
             result = ( info . orientation - degrees + 360 ) % 360 ;
          }
         camera . setDisplayOrientation ( result );
      }
     

    Parameters

    degrees

    the angle that the picture will be rotated clockwise. Valid values are 0, 90, 180, and 270. The starting position is 0 (landscape).

    See Also

    ·     setPreviewDisplay(SurfaceHolder)

    public final void setErrorCallback (Camera.ErrorCallback cb)

    Since: API Level 1

    Registers a callback to be invoked when an error occurs.

    Parameters

    cb

    The callback to run

    public final void setOneShotPreviewCallback (Camera.PreviewCallback cb)

    Since: API Level 3

    Installs a callback to be invoked for the next preview frame in addition to displaying it on the screen. 一次调用后,该回调函数就会被清除,该函数可在任何时候调用,即使是正在预览,调用该函数将覆盖以前的回调。

    Parameters

    cb

    a callback object that receives a copy of the next preview frame, or null to stop receiving callbacks.

    public void setParameters (Camera.Parameters params)

    Since: API Level 1

    Changes the settings for this Camera service.

    Parameters

    params

    the Parameters to use for this Camera service

    Throws

    RuntimeException

    if any parameter is invalid or not supported.

    See Also

    ·     getParameters()

    public final void setPreviewCallback (Camera.PreviewCallback cb)

    Since: API Level 1

    该函数为每个 preview frame 安装一个 callback ,并将每个 preview frame 显示到屏幕上,只要 preview 处在激活状态,这些回调函数就会被重复调用 . 该方法可以在任何时候调用,即使 preview is live. 调用该函数将覆盖一起设置的其他的回调 .

    Parameters

    cb

    a callback object that receives a copy of each preview frame, or null to stop receiving callbacks.

    public final void setPreviewCallbackWithBuffer (Camera.PreviewCallback cb)

    Since: API Level 8

    安装一个会被每个 preview frame 激活的回调函数,这些回调函数使用由 addCallbackBuffer(byte[]) 提供的 buffer ,并将每个 preview frame 显示到屏幕上。只要 preview 是激活的 buffer 是足够的,这些回调就会不断重复被调用 , 并覆盖其他的回调。

    该方法目的是要通过复用 preview frame memory 来提高 preview 的性能和帧率。在调用该方法前后或没有回调注册时,需要调用函数 addCallbackBuffer(byte[]) . 如果传一个空的 callback 给该函数,那么 buffer queue 将被清除 . 将调用 setPreviewCallback(Camera.PreviewCallback) setOneShotPreviewCallback(Camera.PreviewCallback) .

    Parameters

    cb

    获得了 preview frame 数据拷贝的回调对象,如果 cb 为空,该函数将停止接受 callbacks 并清空 buffer queue.

    See Also

    ·     addCallbackBuffer(byte[])

    public final void setPreviewDisplay (SurfaceHolder holder)

    Since: API Level 1

    为 live preview 设置 surface ,对于 preview , surface 是必要 ; 对于拍照 preview 是必要的。相同的 surface 可以被无损重置。

    在调用该方法时 SurfaceHolder 必须已经包含了一个 surface. 如果使用 SurfaceView ,必须通过函数 addCallback(SurfaceHolder.Callback) 注册一个 SurfaceHolder.Callback 并且在调用 setPreviewDisplay() 或开启 preview. 之前,等待 surfaceCreated(SurfaceHolder)  

    在调用 startPreview() 函数之前,必须调用该函数。不过有一个例外,那就是如果调用 startPreview() 之前,没有设置 preview surface 或者设为 null ,该函数可能被传入一个非空 parameter ,调用一次已设置的 preview surface ( 这就是得 camera 的启动和 surface 的创建可以并行,节省了时间 ) ,在 preview 运行的时候,这个 preview surface 不可更改。 .

    Parameters

    holder

    包含放置 preview 的 surface ,可能为空以移除原来的 preview surface

    Throws

    IOException

    if the method fails (for example, if the surface is unavailable or unsuitable).

    public final void setZoomChangeListener (Camera.OnZoomChangeListener listener)

    Since: API Level 8

    Registers a listener to be notified when the zoom value is updated by the camera driver during smooth zoom.

    设置监听器监听 smooth zoom 期间, camera 驱动对 zoom value 的值的更改

    Parameters

    listener

    the listener to notify

    See Also

    ·     startSmoothZoom(int)

    public final void startPreview ()

    Since: API Level 1

    开始捕捉和绘制 preview frames 到屏幕上。当然 preveiw 并没有真正开启,直到通过函数 setPreviewDisplay(SurfaceHolder) 得到 a surface.

    如果调用了 setPreviewCallback(Camera.PreviewCallback) , setOneShotPreviewCallback(Camera.PreviewCallback) , 或 setPreviewCallbackWithBuffer(Camera.PreviewCallback) , 当框架发现 preview data 可用时会自动调用回调函数 onPreviewFrame(byte[], Camera)

    public final void startSmoothZoom (int value)

    Since: API Level 8

    该函数使相机平滑变焦到 value 值 . 驱动会时时通知 Camera.OnZoomChangeListener zoom 值及是否已经停止变焦了 . 例如当前的 zoom 是 0 ,设置 value 为 3 然后调用 startSmoothZoom. 那么函数 onZoomChange(int, boolean, Camera)   会被调用三次,分别传入 zoom 值为 1, 2, and 3. 应用程序也可以提前调用函数 stopSmoothZoom() 来停止变焦 . 在停止变焦之前,不能再次调用 startSmoothZoom 函数或更改 zoom 值 . 如果提供的目标 zoom 值和当前 zoom 值一致了,就不会在调用回调函数。通过函数 isSmoothZoomSupported() 测试硬件是否支持变焦,如果返回值为 true ,说明支持,则可以使用本函数实现变焦 .

    Parameters

    value

    zoom value. The valid range is 0 to getMaxZoom() .

    Throws

    IllegalArgumentException

    if the zoom value is invalid.

    RuntimeException

    if the method fails.

    See Also

    ·     setZoomChangeListener(OnZoomChangeListener)

    public final void stopPreview ()

    Since: API Level 1

    停止拍照,停止将预览帧绘制到 surface 上,并且重置 camera ,以备下次 startPreview() .

    public final void stopSmoothZoom ()

    Since: API Level 8

    停止平稳变焦。应用程序可以设置 Camera.OnZoomChangeListener 监听器来监听 zoom 的停止 . 同样如果函数 isSmoothZoomSupported() 返回 true ,表示硬件支持变焦,可以调用本函数。 .

    Throws

    RuntimeException

    if the method fails.

    public final void takePicture (Camera.ShutterCallback shutter, Camera.PictureCallback raw, Camera.PictureCallback jpeg)

    Since: API Level 1

    与 takePicture(shutter, raw, null, jpeg) 等效 .

    See Also

    ·     takePicture(ShutterCallback, PictureCallback, PictureCallback, PictureCallback)

    public final void takePicture (Camera.ShutterCallback shutter, Camera.PictureCallback raw, Camera.PictureCallback postview, Camera.PictureCallback jpeg)

    Since: API Level 5

    触发一次非同步拍照, camera service 将按照拍照的流程为应用完成一系列的回调初始化。 shutter callback ,拍照之后会调用该回调 . 该函数中可以触发一个声音,提示用户拍照完成。 The raw callback occurs ,当 raw image data 有效的时候,会触发该回调 ( 注意 : 如果没有足够的 memory 用来放置拷贝,该值可能为 ). The postview callback , 当生成了经过缩放、简单处理的图片的时候,调用 postview callback 回调 ( 注意:并不是所有的硬件都支持该功能 ) 。 The jpeg callback ,当压缩的图片数据有效的时候,会调用该回到接口。对于这些参数,如果没有需要,可以直接传递 null 即可 .

    当然这些回调方法,都必须在 preview 是激活的 ( 即在函数 startPreview() 调用之后 ). 完成拍照之后, preview 会停止,这个时候如果你想要再次开开 preview ,拍摄更多的照片,你需要重新调用 startPreview() .

    .

    Parameters

    shutter

    the callback for image capture moment, or null

    raw

    the callback for raw (uncompressed) image data, or null

    postview

    callback with postview image data, may be null

    jpeg

    the callback for JPEG image data, or null

    public final void unlock ()

    Since: API Level 5

    为 camera 解锁,使得其他进程可以访问 camera. 一般地 , 直到调用函数 release() , camera 都是被包含激活的 camera 对象的进程锁住的 . 如果要在进程间快速还手 , 你可以调用该函数快速释放 camera 对象给其他进程使用 ; 同样如果别的进程释放了 camera ,你可以调用函数 reconnect() 重新获取 camera.

    在调用 setCamera(Camera) . 之前,你必须调用该函数。

    如果你不使用 recording video ,可能你不需要用到该函数。

    Throws

    RuntimeException

    if the camera cannot be unlocked.

    展开全文
  • Camera

    万次阅读 2011-02-24 14:41:00
    <br />public class Camera extends Object <br /> 本类主要用于和camera service建立及断开连接、设置拍照功能、开启及关闭预览、拍照、检索frames编码成video。本类没有默认的构造函数,...

    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 Camera objecte.

    Throws

    RuntimeException

    if connection to the camera service fails (for example, if the camera is in use by another process).

    public static Camera open ()

    Since: API Level 1

    创建一个新的访问设备上第一个 back-facing camera Camera 类对象,如果设备没有 back-facing camera ,则该函数返回 null

    See Also

    open(int)

    public final void reconnect ()

    Since: API Level 8

    在另一个进程使用之后,重新与 camera 建立连接。进程 unlock() 之后,该进程可能仍在使用 camera( 这里理解不知是否恰当 ) ,当其使用完毕后,你一定要与 camera 重新建立连接,这样可重新获得锁以继续使用 camera

    如果调用了 setCamera(Camera) ,该接口一定要在 MediaRecorder 之后调用。

    当然如果你不需要使用 recording video ,你不用使用该函数

     

    Throws

    IOException

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

    public final void release ()

    Since: API Level 1

    断开和释放 Camera 对象资源,当使用完了 camera ,你要尽快调用该函数。

    public final void setDisplayOrientation (int degrees)

    Since: API Level 8

    设置 preview 的顺时针旋转角度。这将影响 preview frames 和拍照之后的相片显示。该方法主要用于垂直模式的应用。注意在旋转之前, front-facing cameras preview 显示是水平 flip 的,这就是说, image 是沿着 camera sensor 的垂直中心轴来反射的 (无法理解其意思)。所以用户可以像照镜子一样看到他们自己。这不会影响传入函数 onPreviewFrame(byte[], Camera) 的、 JPEG 相片的、或记录的 video byte array 的顺序。在 preview 期间是不允许调用该方法的。如果你想要是你的照片和显示出来的角度一致,你可以参考下列代码:

     

      public static void setCameraDisplayOrientation ( Activity activity ,
             
    int cameraId , android . hardware . Camera camera ) {
         android
    . hardware . Camera . CameraInfo info =
                 
    new android . hardware . Camera . CameraInfo ();
         android
    . hardware . Camera . getCameraInfo ( cameraId , info );
         
    int rotation = activity . getWindowManager (). getDefaultDisplay ()
                 
    . getRotation ();
         
    int degrees = 0 ;
         
    switch ( rotation ) {
             
    case Surface . ROTATION_0 : degrees = 0 ; break ;
             
    case Surface . ROTATION_90 : degrees = 90 ; break ;
             
    case Surface . ROTATION_180 : degrees = 180 ; break ;
             
    case Surface . ROTATION_270 : degrees = 270 ; break ;
         
    }

         
    int result ;
         
    if ( info . facing == Camera . CameraInfo . CAMERA_FACING_FRONT ) {
             result
    = ( info . orientation + degrees ) % 360 ;
             result
    = ( 360 - result ) % 360 ;   // compensate the mirror
         
    } else {   // back-facing
             result
    = ( info . orientation - degrees + 360 ) % 360 ;
         
    }
         camera
    . setDisplayOrientation ( result );
     
    }
     

    Parameters

    degrees

    the angle that the picture will be rotated clockwise. Valid values are 0, 90, 180, and 270. The starting position is 0 (landscape).

    See Also

    ·     setPreviewDisplay(SurfaceHolder)

    public final void setErrorCallback (Camera.ErrorCallback cb)

    Since: API Level 1

    Registers a callback to be invoked when an error occurs.

    Parameters

    cb

    The callback to run

    public final void setOneShotPreviewCallback (Camera.PreviewCallback cb)

    Since: API Level 3

    Installs a callback to be invoked for the next preview frame in addition to displaying it on the screen. 一次调用后,该回调函数就会被清除,该函数可在任何时候调用,即使是正在预览,调用该函数将覆盖以前的回调。

    Parameters

    cb

    a callback object that receives a copy of the next preview frame, or null to stop receiving callbacks.

    public void setParameters (Camera.Parameters params)

    Since: API Level 1

    Changes the settings for this Camera service.

    Parameters

    params

    the Parameters to use for this Camera service

    Throws

    RuntimeException

    if any parameter is invalid or not supported.

    See Also

    ·     getParameters()

    public final void setPreviewCallback (Camera.PreviewCallback cb)

    Since: API Level 1

    该函数为每个 preview frame 安装一个 callback ,并将每个 preview frame 显示到屏幕上,只要 preview 处在激活状态,这些回调函数就会被重复调用 . 该方法可以在任何时候调用,即使 preview is live. 调用该函数将覆盖一起设置的其他的回调 .

    Parameters

    cb

    a callback object that receives a copy of each preview frame, or null to stop receiving callbacks.

    public final void setPreviewCallbackWithBuffer (Camera.PreviewCallback cb)

    Since: API Level 8

    安装一个会被每个 preview frame 激活的回调函数,这些回调函数使用由 addCallbackBuffer(byte[]) 提供的 buffer ,并将每个 preview frame 显示到屏幕上。只要 preview 是激活的 buffer 是足够的,这些回调就会不断重复被调用 , 并覆盖其他的回调。

    该方法目的是要通过复用 preview frame memory 来提高 preview 的性能和帧率。在调用该方法前后或没有回调注册时,需要调用函数 addCallbackBuffer(byte[]) . 如果传一个空的 callback 给该函数,那么 buffer queue 将被清除 . 将调用 setPreviewCallback(Camera.PreviewCallback) setOneShotPreviewCallback(Camera.PreviewCallback) .

    Parameters

    cb

    获得了 preview frame 数据拷贝的回调对象,如果 cb 为空,该函数将停止接受 callbacks 并清空 buffer queue.

    See Also

    ·     addCallbackBuffer(byte[])

    public final void setPreviewDisplay (SurfaceHolder holder)

    Since: API Level 1

    live preview 设置 surface ,对于 preview surface 是必要 ; 对于拍照 preview 是必要的。相同的 surface 可以被无损重置。

    在调用该方法时 SurfaceHolder 必须已经包含了一个 surface. 如果使用 SurfaceView ,必须通过函数 addCallback(SurfaceHolder.Callback) 注册一个 SurfaceHolder.Callback 并且在调用 setPreviewDisplay() 或开启 preview. 之前,等待 surfaceCreated(SurfaceHolder)  

    在调用 startPreview() 函数之前,必须调用该函数。不过有一个例外,那就是如果调用 startPreview() 之前,没有设置 preview surface 或者设为 null ,该函数可能被传入一个非空 parameter ,调用一次已设置的 preview surface ( 这就是得 camera 的启动和 surface 的创建可以并行,节省了时间 ) ,在 preview 运行的时候,这个 preview surface 不可更改。 .

    Parameters

    holder

    包含放置 preview surface ,可能为空以移除原来的 preview surface

    Throws

    IOException

    if the method fails (for example, if the surface is unavailable or unsuitable).

    public final void setZoomChangeListener (Camera.OnZoomChangeListener listener)

    Since: API Level 8

    Registers a listener to be notified when the zoom value is updated by the camera driver during smooth zoom.

    设置监听器监听 smooth zoom 期间, camera 驱动对 zoom value 的值的更改

    Parameters

    listener

    the listener to notify

    See Also

    ·     startSmoothZoom(int)

    public final void startPreview ()

    Since: API Level 1

    开始捕捉和绘制 preview frames 到屏幕上。当然 preveiw 并没有真正开启,直到通过函数 setPreviewDisplay(SurfaceHolder) 得到 a surface.

    如果调用了 setPreviewCallback(Camera.PreviewCallback) , setOneShotPreviewCallback(Camera.PreviewCallback) , setPreviewCallbackWithBuffer(Camera.PreviewCallback) , 当框架发现 preview data 可用时会自动调用回调函数 onPreviewFrame(byte[], Camera)

    public final void startSmoothZoom (int value)

    Since: API Level 8

    该函数使相机平滑变焦到 value . 驱动会时时通知 Camera.OnZoomChangeListener zoom 值及是否已经停止变焦了 . 例如当前的 zoom 0 ,设置 value 3 然后调用 startSmoothZoom. 那么函数 onZoomChange(int, boolean, Camera)   会被调用三次,分别传入 zoom 值为 1, 2, and 3. 应用程序也可以提前调用函数 stopSmoothZoom() 来停止变焦 . 在停止变焦之前,不能再次调用 startSmoothZoom 函数或更改 zoom . 如果提供的目标 zoom 值和当前 zoom 值一致了,就不会在调用回调函数。通过函数 isSmoothZoomSupported() 测试硬件是否支持变焦,如果返回值为 true ,说明支持,则可以使用本函数实现变焦 .

    Parameters

    value

    zoom value. The valid range is 0 to getMaxZoom() .

    Throws

    IllegalArgumentException

    if the zoom value is invalid.

    RuntimeException

    if the method fails.

    See Also

    ·     setZoomChangeListener(OnZoomChangeListener)

    public final void stopPreview ()

    Since: API Level 1

    停止拍照,停止将预览帧绘制到 surface 上,并且重置 camera ,以备下次 startPreview() .

    public final void stopSmoothZoom ()

    Since: API Level 8

    停止平稳变焦。应用程序可以设置 Camera.OnZoomChangeListener 监听器来监听 zoom 的停止 . 同样如果函数 isSmoothZoomSupported() 返回 true ,表示硬件支持变焦,可以调用本函数。 .

    Throws

    RuntimeException

    if the method fails.

    public final void takePicture (Camera.ShutterCallback shutter, Camera.PictureCallback raw, Camera.PictureCallback jpeg)

    Since: API Level 1

    takePicture(shutter, raw, null, jpeg) 等效 .

    See Also

    ·     takePicture(ShutterCallback, PictureCallback, PictureCallback, PictureCallback)

    public final void takePicture (Camera.ShutterCallback shutter, Camera.PictureCallback raw, Camera.PictureCallback postview, Camera.PictureCallback jpeg)

    Since: API Level 5

    触发一次非同步拍照, camera service 将按照拍照的流程为应用完成一系列的回调初始化。 shutter callback ,拍照之后会调用该回调 . 该函数中可以触发一个声音,提示用户拍照完成。 The raw callback occurs ,当 raw image data 有效的时候,会触发该回调 ( 注意 : 如果没有足够的 memory 用来放置拷贝,该值可能为 ). The postview callback , 当生成了经过缩放、简单处理的图片的时候,调用 postview callback 回调 ( 注意:并不是所有的硬件都支持该功能 ) The jpeg callback ,当压缩的图片数据有效的时候,会调用该回到接口。对于这些参数,如果没有需要,可以直接传递 null 即可 .

    当然这些回调方法,都必须在 preview 是激活的 ( 即在函数 startPreview() 调用之后 ). 完成拍照之后, preview 会停止,这个时候如果你想要再次开开 preview ,拍摄更多的照片,你需要重新调用 startPreview() .

    .

    Parameters

    shutter

    the callback for image capture moment, or null

    raw

    the callback for raw (uncompressed) image data, or null

    postview

    callback with postview image data, may be null

    jpeg

    the callback for JPEG image data, or null

    public final void unlock ()

    Since: API Level 5

    camera 解锁,使得其他进程可以访问 camera. 一般地 , 直到调用函数 release() camera 都是被包含激活的 camera 对象的进程锁住的 . 如果要在进程间快速还手 , 你可以调用该函数快速释放 camera 对象给其他进程使用 ; 同样如果别的进程释放了 camera ,你可以调用函数 reconnect() 重新获取 camera.

    在调用 setCamera(Camera) . 之前,你必须调用该函数。

    如果你不使用 recording video ,可能你不需要用到该函数。

    Throws

    RuntimeException

    if the camera cannot be unlocked.



     

    展开全文
  • AndroidUSBCamera基于[saki4510t/UVCCamera](https://github.com/saki4510t/UVCCamera)开发,该项目对USB Camera(UVC设备)的使用和视频数据采集进行了高度封装,能够帮助开发者通过几个简单的API实现USB Camera设备...

        AndroidUSBCamera基于[saki4510t/UVCCamera](https://github.com/saki4510t/UVCCamera)开发,该项目对USB Camera(UVC设备)的使用和视频数据采集进行了高度封装,能够帮助开发者通过几个简单的API实现USB Camera设备的检测、连接、预览和音视频数据采集,最重要的是手机无需root,只需支持otg功能即可驱动。主要功能包括:  

    (1)支持USB Camera设备检测,画面实时预览;  
    (2)支持本地录制mp4格式视频,支持实时获取音视频数据流;  
    (3)支持jpg格式图片抓拍;  
    (4)支持获取camera支持的分辨率,和分辨率切换;  
    (5)支持屏蔽声音,重启Camera; 
    (6)支持相机自动对焦;  

    (7)支持调整对比度和亮度

    (8) 支持480P、720P、1080P and higher

    (9) 支持Android5.0,6.0,7.0,8.0,9.0


    如何使用AndroidUSBCamera项目 


    1. 添加依赖到本地工程
      
    第一步 添加JitPack仓库到工程gradle  
    Step 1. Add the JitPack repository to your build file
    Add it in your root build.gradle at the end of repositories:

     

    allprojects {
    repositories {
    ...
    maven { url 'http://raw.github.com/saki4510t/libcommon/master/repository/' }
    maven { url 'https://jitpack.io' }
    }
    }


    第二步 添加依赖到app Module的gradle   
    Step 2. Add the dependency  

     

     

     

    dependencies {
    compile 'com.github.jiangdongguo:AndroidUSBCamera:1.3.8'
    } 
    

     

    注:最新版为2,3,0

     

     2. 初始化引擎,注册USB设备事件监听器  
      Init AndroidUSBCamera engine,register the USB device event listener  
      

       private USBCameraManager.OnMyDevConnectListener listener = new USBCameraManager.OnMyDevConnectListener() {
            // 插入USB设备
            @Override
            public void onAttachDev(UsbDevice device) {
                if(mUSBManager == null || mUSBManager.getUsbDeviceCount() == 0){
                    showShortMsg("未检测到USB摄像头设备");
                    return;
                }
                // 请求打开摄像头
                if(! isRequest){
                    isRequest = true;
                    if(mUSBManager != null){
                        mUSBManager.requestPermission(0);
                    }
                }
            }
    
    
            // 拔出USB设备
            @Override
            public void onDettachDev(UsbDevice device) {
                if(isRequest){
                    // 关闭摄像头
                    isRequest = false;
                    mUSBManager.closeCamera();
                    showShortMsg(device.getDeviceName()+"已拨出");
                }
            }
    
    
            // 连接USB设备成功
            @Override
            public void onConnectDev(UsbDevice device,boolean isConnected) {
                if(! isConnected) {
                    showShortMsg("连接失败,请检查分辨率参数是否正确");
                    isPreview = false;
                }else{
                    isPreview = true;
                }
            }
    
    
            // 与USB设备断开连接
            @Override
            public void onDisConnectDev(UsbDevice device) {
                showShortMsg("连接失败");
            }
        };
        
        mUVCCameraView = (CameraViewInterface) mTextureView;
        mUVCCameraView.setCallback(new CameraViewInterface.Callback() {
            @Override
            public void onSurfaceCreated(CameraViewInterface view, Surface surface) {
                if(!isPreview && mUSBManager.isCameraOpened()) {
                     mUSBManager.startPreview(mUVCCameraView, new AbstractUVCCameraHandler.OnPreViewResultListener() {
                     @Override
                     public void onPreviewResult(boolean result) {
    
    
                     }
                  });
                  isPreview = true;
                  }
             }
                @Override
                public void onSurfaceChanged(CameraViewInterface view, Surface surface, int width, int height) {
    
    
                }
    
    
                @Override
                public void onSurfaceDestroy(CameraViewInterface view, Surface surface) {
                    if(isPreview && mUSBManager.isCameraOpened()) {
                        mUSBManager.stopPreview();
                        isPreview = false;
                    }
                }
            });
            // 初始化引擎
            mUSBManager = USBCameraManager.getInstance();
            mUSBManager.initUSBMonitor(this,listener);
            mUSBManager.createUVCCamera(mUVCCameraView);


    3. 注册USB设备广播事件监听器,开始Camera预览  
      Register the USB device broadcast event listener and start the Camera Preview

     

     

     

    // 注册USB事件广播监听器
    if(mUSBManager != null){
          mUSBManager.registerUSB();
    }
    // 恢复Camera预览
     if(mUVCCameraView != null){
          mUVCCameraView.onResume();
     }

     


    4. 注销USB设备广播事件监听器,停止Camera预览  
      Unregister the USB device broadcast event listener and stop the Camera Preview

     

     

     

     

    // 注销USB事件广播监听器
     if(mUSBManager != null){
             mUSBManager.unregisterUSB();
      }
     // 暂停Camera预览
     if(mUVCCameraView != null){
             mUVCCameraView.onPause();
     }

     


     5. 图片抓拍
      Picture capturing

     

     

     

     

    if(mUSBManager == null || ! mUSBManager.isCameraOpened()){
              showShortMsg("抓拍异常,摄像头未开启");
              return;
     }
     mUSBManager.capturePicture(picPath, new AbstractUVCCameraHandler.OnCaptureListener() {
              @Override
              public void onCaptureResult(String path) {
                   showShortMsg("保存路径:"+path);
              }
     });

     


    6. 本地录制(可实时获取音视频数据流)
       recoring mp4,and get media real-stream  
       

     

     

     

    if(mUSBManager == null || ! mUSBManager.isCameraOpened()){
               showShortMsg("录制异常,摄像头未开启");
               return;
     }
    if(! mUSBManager.isRecording()){
                        String videoPath = USBCameraManager.ROOT_PATH+System.currentTimeMillis();
                        FileUtils.createfile(FileUtils.ROOT_PATH+"test666.h264");
                        RecordParams params = new RecordParams();
                        params.setRecordPath(videoPath);
                        params.setRecordDuration(0);    // 设置为0,不分割保存
                        params.setVoiceClose(false);    // 不屏蔽声音
                        mUSBManager.startRecording(params, new AbstractUVCCameraHandler.OnEncodeResultListener() {
                            @Override
                            public void onEncodeResult(byte[] data, int offset, int length, long timestamp, int type) {
                                // type = 0,aac格式音频流
                                // type = 1,h264格式视频流
                                if(type == 1){
                                    FileUtils.putFileStream(data,offset,length);
                                }
                            }
    
    
                            @Override
                            public void onRecordResult(String videoPath) {
                                showShortMsg(videoPath);
                            }
                        });
    // 停止录制
    mUSBManager.stopRecording();


    7. 切换分辨率
      update Resulotion  
        

     

    mUSBManager.updateResolution(this, mUVCCameraView, 320, 240, new USBCameraManager.OnPreviewListener() {
                 @Override
                 public void onPreviewResult(boolean isSuccess) {
                        if(! isSuccess) {
                                showShortMsg("预览失败,不支持该分辨率");
                            }else {
                                showShortMsg("以切换到分辨率为320x240");
                            }
                        }
          });  
     // 获取Camera支持得分辨率  
     List<Size> list = mUSBManager.getSupportedPreviewSizes();
     // Camera自动对焦  
     mUSBManager.startCameraFoucs();


    8. 释放引擎资源
      release resource  

     

    // 释放资源
    if(mUSBManager != null){
           mUSBManager.release();
     }

    9. 添加权限
      add permissions  
       

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


    USBCameraManager  API (Other)

     

    (1) void requestPermission(int index):请求授予开启USB摄像头权限;
    (2) int getUsbDeviceCount():返回查询到的可用USB Camera数目;
    (3) boolean isRecording():判断是否正在录制视频;
    (4) boolean isCameraOpened():判断USB摄像头是否正常打开;
    (5) void release():释放资源
    (6) USBMonitor getUSBMonitor():返回USBMonitor实例;
    (7) mUSBManager.setModelValue(USBCameraManager.MODE_CONTRAST,contrast++); 调整对比度
    (8) mUSBManager.setModelValue(USBCameraManager.MODE_BRIGHTNESS,brightness++);调整亮度

     

     

     

     

     

    注:在使用Android Studio移植UVCCamera时,很多朋友可能会遇到"open(“/dev/bus/usb/001/002”, O_RDWR, 0),报错,Permission denied"问题,这是由于Android Studio使用的ndk版本所致,建议使用ndk-r14即可。解决方法:local.properties-->指定ndk.dir版本。(注:这里使用的是离线方式)

     

    最新版为2.3.0,更新时间为2019年6月17日,使用方法请移步Github项目

     

     

    GitHub源码地址:https://github.com/jiangdongguo/AndroidUSBCamera(如果对您有用,欢迎star&fork以表支持~谢谢^_^!)

     

    Download APK

     In order to display the functions, I develop a simple released apk,which is based on version 2.3.1,and the build version is 28.0.3.Here is my configs and if you have any questions please issues to me ,I will follow it do my best.

    ext {
        javaSourceCompatibility = JavaVersion.VERSION_1_8
        javaTargetCompatibility = JavaVersion.VERSION_1_8
        compileSdkVersion = 28
        buildToolsVersion = '28.0.3'
        minSdkVersion = 21
        targetSdkVersion = 28
        commonLibVersion= '2.12.4'
    }
    

    下载APP:  安装密码 12345678

    displaying:

     

     

    展开全文
  • Camera2 openCamera

    千次阅读 2017-01-14 23:42:29
    Camera2 中,CameraManager.java管理所有camera设备, 获取cameraManager: mCameraManager = (CameraManager) this.getSystemService(Context.CAMERA_SERVICE); 打开camera: mCameraManager.openCamera...

    Camera2 中,CameraManager.java管理所有camera设备,

    获取cameraManager:

    mCameraManager = (CameraManager) this.getSystemService(Context.CAMERA_SERVICE);

    打开camera:

    mCameraManager.openCamera(mCameraId, DeviceStateCallback, mHandler);

    打开camera过程:

        public void openCamera(@NonNull String cameraId,
                @NonNull final CameraDevice.StateCallback callback, @Nullable Handler handler)
                throws CameraAccessException {
    
            if (cameraId == null) {
                throw new IllegalArgumentException("cameraId was null");
            } else if (callback == null) {
                throw new IllegalArgumentException("callback was null");
            } else if (handler == null) {
                if (Looper.myLooper() != null) {
                    handler = new Handler();
                } else {
                    throw new IllegalArgumentException(
                            "Handler argument is null, but no looper exists in the calling thread");
                }
            }
    
            openCameraDeviceUserAsync(cameraId, callback, handler);

    openCameraDeviceUserAsync:

       private CameraDevice openCameraDeviceUserAsync(String cameraId,
                CameraDevice.StateCallback callback, Handler handler)
                throws CameraAccessException {
            CameraCharacteristics characteristics = getCameraCharacteristics(cameraId);
            CameraDevice device = null;
            try {
    
                synchronized (mLock) {
    
                    ICameraDeviceUser cameraUser = null;
    
                    android.hardware.camera2.impl.CameraDeviceImpl deviceImpl =
                            new android.hardware.camera2.impl.CameraDeviceImpl(
                                    cameraId,
                                    callback,
                                    handler,
                                    characteristics);
    
                    BinderHolder holder = new BinderHolder();
    
                    ICameraDeviceCallbacks callbacks = deviceImpl.getCallbacks();
                    int id = Integer.parseInt(cameraId);
                    try {
                        if (supportsCamera2ApiLocked(cameraId)) {    //到CameraService.cpp中查询是否支持API2 ,需要HAL支持ModuleApiVersion >= CAMERA_MODULE_API_VERSION_2_0
                            // Use cameraservice's cameradeviceclient implementation for HAL3.2+ devices
                            ICameraService cameraService = CameraManagerGlobal.get().getCameraService();
                            if (cameraService == null) {
                                throw new CameraRuntimeException(
                                    CameraAccessException.CAMERA_DISCONNECTED,
                                    "Camera service is currently unavailable");
                            }
                            cameraService.connectDevice(callbacks, id,
                                    mContext.getOpPackageName(), USE_CALLING_UID, holder);
                            cameraUser = ICameraDeviceUser.Stub.asInterface(holder.getBinder());//API2.0,获取native层Client
                        } else {  //CameraDeviceUserShim 兼容API1.0, 在java层使用camera.java通过JNI与native层通信。
    
                            // Use legacy camera implementation for HAL1 devices
                            Log.i(TAG, "Using legacy camera HAL.");
                            cameraUser = CameraDeviceUserShim.connectBinderShim(callbacks, id); 
                        }
                    } catch (CameraRuntimeException e) {
                        if (e.getReason() == CameraAccessException.CAMERA_DEPRECATED_HAL) {
                            throw new AssertionError("Should've gone down the shim path");
                        } else if (e.getReason() == CameraAccessException.CAMERA_IN_USE ||
                                e.getReason() == CameraAccessException.MAX_CAMERAS_IN_USE ||
                                e.getReason() == CameraAccessException.CAMERA_DISABLED ||
                                e.getReason() == CameraAccessException.CAMERA_DISCONNECTED ||
                                e.getReason() == CameraAccessException.CAMERA_ERROR) {
                            // Received one of the known connection errors
                            // The remote camera device cannot be connected to, so
                            // set the local camera to the startup error state
                            deviceImpl.setRemoteFailure(e);
    
                            if (e.getReason() == CameraAccessException.CAMERA_DISABLED ||
                                    e.getReason() == CameraAccessException.CAMERA_DISCONNECTED ||
                                    e.getReason() == CameraAccessException.CAMERA_IN_USE) {
                                // Per API docs, these failures call onError and throw
                                throw e.asChecked();
                            }
                        } else {
                            // Unexpected failure - rethrow
                            throw e;
                        }
                    } catch (RemoteException e) {
                        // Camera service died - act as if it's a CAMERA_DISCONNECTED case
                        CameraRuntimeException ce = new CameraRuntimeException(
                            CameraAccessException.CAMERA_DISCONNECTED,
                            "Camera service is currently unavailable", e);
                        deviceImpl.setRemoteFailure(ce);
                        throw ce.asChecked();
                    }
    
                    // TODO: factor out callback to be non-nested, then move setter to constructor
                    // For now, calling setRemoteDevice will fire initial
                    // onOpened/onUnconfigured callbacks.
                    deviceImpl.setRemoteDevice(cameraUser);
                    device = deviceImpl;
                }
    
            } catch (NumberFormatException e) {
                throw new IllegalArgumentException("Expected cameraId to be numeric, but it was: "
                        + cameraId);
            } catch (CameraRuntimeException e) {
                throw e.asChecked();
            }
            return device;
        }
    

    API1.0通过camera.java---->JNI----->cameraclient。

    API2.0通过java层获取到底层CameraClient,使用binder与service通信。


    展开全文
  • Camera1与Camera2区别

    千次阅读 2019-06-13 11:29:13
    Camera1.0 Camera2.0 权限 android.permission.CAMERA android.permission.CAMERA 布局 SurfaceView TextureView 实现接口 SurfaceHolder.Callback 1.surfaceCreated 2.surfaceChanged 3.surfaceDestroyed ...
  • Android Camera基本用法一

    万次阅读 2019-01-17 18:59:49
    1 Camera 简介 讲解编解码之前先对Camera进行简单的介绍,本篇介绍完之后只能保证小白会用Camera预览画面,其他的Camera知识会后续讲解。 考虑兼容性依然介绍Camera,目录为android.hardware.Camera,可以看到从...
  • Android CameraCamera HAL 分析

    千次阅读 2019-03-27 19:10:54
    Android Camera 一 源码路径 Android Camera 二 JNI JAVA和C/CPP图像数据传输流程分析 Android CameraCameraService 和 Client 链接到 HAL Android CameraCamera HAL 分析 Android CameraCamera HAL...
  • Android CameraCamera HAL v1

    千次阅读 2019-04-24 20:01:39
    Android Camera 一 源码路径 Android Camera 二 JNI JAVA和C/CPP图像数据传输流程分析 Android CameraCameraService 和 Client 链接到 HAL Android CameraCamera HAL 分析 Android CameraCamera HAL...
  • Android CameraCameraMetadata分析

    万次阅读 2016-07-25 20:03:50
    Camera_metadata数据结构在Camera流程中起到了很大重要,可以说所有的自顶层下发给hal层的参数都是通过camera_metadata传递的。今天我们就来好好看看它到底如何保存的,以及它的数据组织形式如何表现。和Camera_...
  • Android Camera 系列(二)控制Camera

    千次阅读 2018-10-14 23:33:37
    Camera系列文章首发于 我的慕课网,欢迎关注。 概述 Camera 可能是接下来个人想深入学习的课题,准备新起一个系列,从个人的角度总结阐述自己对于 Android Camera 的研究过程,希望也能够对其他想学习 Camera 的...
  • Camera AA工艺

    万次阅读 2019-06-11 20:14:55
    借用oppo某型号camera的结构,就可以发现camera是一个光机电复杂的微型系统,很多零部件在结合的过程中如果存在一些误差最后累计起来会对产品造成一定的影响。在自下往上的组装过程中,各零件容易出现Tilt、Shitf、...
  • 自定义Camera系列之:TextureView + Camera

    千次阅读 2018-12-26 22:11:13
    上一篇介绍了 自定义Camera系列之:SurfaceView + Camera,接着我们介绍使用 TextureView + Camera 的组合。 为什么选择 TextureView ? 由于 SurfaceView 是拥有一个独立的 Surface,不在 View hierachy 体系中,...
  • 自定义Camera系列之:SurfaceView + Camera

    千次阅读 2018-12-25 23:34:16
    之前一直想把 Camera 系列的写一下,拖了很久,现在慢慢填坑吧。 首先介绍 SurfaceView + Camera 的组合。虽然从 Android 5.0 后推荐使用 Camera2 了,不过某些旧工程或者需要适配低版本的场景还是用得着旧的 Camer...
  • camera浅析

    千次阅读 2019-04-28 17:10:37
    一、 Camera模组的工作原理以及组成部分 二、 Camera的常见技术指标 三、 基于Qualcomm平台的Camera相关代码 一、Camera模组的工作原理以及组成部分 Camera模组是影响捕捉至关重要的电子器件。其工作原理:物体...
  • 之前已经介绍过过时的旧 Camera 的使用了,毕竟在从 Android 5.0 后推荐使用 Camera2 了,所以现在开始介绍 Camera2 相关使用。老规矩还是从 SurfaceView 说起。 如果你对 Camera2 的相关类和接口还不熟悉,可以先...
  • Android Camera 系列(三)Camera API 详解

    千次阅读 2018-10-15 19:39:08
    Camera 可能是接下来个人想深入学习的课题,准备新起一个系列,从个人的角度总结阐述自己对于 Android Camera 的研究过程,希望也能够对其他想学习 Camera 的同学一些帮助。 本小节内容为 Android Camera 官方文档 ...
  • 之前已经介绍过过时的旧 Camera 的使用了,毕竟在从 Android 5.0 后推荐使用 Camera2 了,所以现在开始介绍 Camera2 相关使用。该篇介绍 TextureView ,这也是谷歌示例中使用的组合。 如果你对 Camera2 的相关类和...
  • Camera Tuning

    千次阅读 2019-09-12 12:36:46
    刚入职的时候我是很懵逼的,Camera Tuning是什么鬼,调参工程师?以前在学校会经常调侃同学们做深度学习实际上就是调参工程师,但是这个工作听起来貌似更符合这个职位名称。 大概的说,做Camera Tuning是由于camera...
  • Camera1、Camera2 API的使用

    千次阅读 2019-09-05 15:28:22
    Camera1 使用流程: 检查相机权限(android.permission.CAMERACamera.getNumberOfCameras():获取相机硬件数量; Camera.getCameraInfo():获取指定相机信息; Camera.open():打开指定相机; camera.get...
  • PlayCamera_V1.0.0(SurfaceView预览Camera,拍照demo)

    千次下载 热门讨论 2014-06-23 19:26:18
    SurfaceView预览Camera,拍照demo),详见博客:http://blog.csdn.net/yanzi1225627/article/details/33028041
  • Camera HAL(Camera Preview)

    千次阅读 2017-02-22 23:00:05
    看看Android系统,高通camera hal(camera3)当中camera preview数据是怎么从kernel一层一层传递,最终发给SurfaceView的。 高通的Camera HAL的module在QualcommCamera.cpp[android/hardware/qcom/camera/qcamera2/...
  • 高通camera驱动 mm-camera部分 (一)

    千次阅读 2019-05-18 18:18:05
    想写一份关于qualcomm 平台 的camera driver 的文档 ,想讲清楚 camera 各个 module 和 camera sensor的各个sub module。 无论是 camx 还是 mm-camera 结构, 无论是android O 还是 N 东西就那么多,就不同的写法...
  • IROS2018 Event Camera

    万次阅读 2019-12-14 16:16:00
    Event Camera AsynchronousCornerDetectionandTrackingforEventCamerasinReal-Time, Ignacio Alzugaray and Margarita Chli [pdf] [video]
  • CameraCamera2的应用

    千次阅读 2017-06-28 09:38:52
    android.hardware.camera2是在android5.0引入的用去取代android.hardware.Camera的APIcamera2的好处在于: 支持30fps(帧/秒)的全高清连拍 支持帧之间的手动设置 支持RAW格式的图片拍摄 支持零快门延迟和电影快照 ...
  • Android CameraCamera2详解

    千次阅读 2017-02-21 18:02:57
    Android5.0之前使用android.hardware包下的Camera类进行拍照、录视频等功能。5.0以后,新增了android.hardware.camera2包,利用新的机制、新的类进行拍照、录视频。 使用Camera 一、拍照 由于手机摄像头配置...
  • 本篇文章将围绕自定义控件——CameraSurfaceView来阐述Android Camera(非Camera2,因为Camera2只适应5.0+的安卓系统,而目前5.0以下还是大部分,所以当前的主流还是Camera)的使用详解,首先先介绍下Camera...
  • Camera流程分析之CameraOpen流程图

    千次阅读 2019-04-28 14:03:36
    Camera打开相机流程分析图,从应用->framework->hal:(调用的是Camera api1) 之后开始调用vendor/qcom/proprietary/mm-camera/mm-camera2/media-controller/mct_shim_layer/Mct_shim_layer.c的mct_...
  • camera基础知识——1、camera模组简介

    千次阅读 2019-01-26 18:41:42
     博主作为一个camera驱动码农,在刚接触camera知识的时候难免有点转变不过来,难以接受,博主也深有体会。看着厚厚的camera datasheet,不知道如何下手编写驱动代码。但是在编写代码之前,必须还是先要理解camera的...
  • Camera viewport

    千次阅读 2016-07-18 13:15:12
    camera里面存在一个叫做viewport的变量 Camera.rect var rect : Rect Description Where on the screen is the camera rendered in normalized coordinates. The values in rect range f
  • Camera 源代码 分析

    千次阅读 2014-02-22 20:21:02
    camera

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 73,718
精华内容 29,487
关键字:

camera