CameraManager: add torch mode APIs for flashlight

Add torch mode APIs to support flashlight without opening any
camera devices.

Bug: 2682206
Change-Id: Ifb66c309f23fd7e9f124016e0d9c6b364d19acdd
This commit is contained in:
Chien-Yu Chen
2015-01-09 15:52:37 -08:00
parent b9307823dd
commit c8c109b403
4 changed files with 172 additions and 8 deletions

View File

@ -12612,6 +12612,8 @@ package android.hardware.camera2 {
field public static final int CAMERA_DISABLED = 1; // 0x1
field public static final int CAMERA_DISCONNECTED = 2; // 0x2
field public static final int CAMERA_ERROR = 3; // 0x3
field public static final int CAMERA_IN_USE = 4; // 0x4
field public static final int MAX_CAMERAS_IN_USE = 5; // 0x5
}
public abstract class CameraCaptureSession implements java.lang.AutoCloseable {
@ -12752,7 +12754,10 @@ package android.hardware.camera2 {
method public java.lang.String[] getCameraIdList() throws android.hardware.camera2.CameraAccessException;
method public void openCamera(java.lang.String, android.hardware.camera2.CameraDevice.StateCallback, android.os.Handler) throws android.hardware.camera2.CameraAccessException;
method public void registerAvailabilityCallback(android.hardware.camera2.CameraManager.AvailabilityCallback, android.os.Handler);
method public void registerTorchCallback(android.hardware.camera2.CameraManager.TorchCallback, android.os.Handler);
method public void setTorchMode(java.lang.String, boolean) throws android.hardware.camera2.CameraAccessException;
method public void unregisterAvailabilityCallback(android.hardware.camera2.CameraManager.AvailabilityCallback);
method public void unregisterTorchCallback(android.hardware.camera2.CameraManager.TorchCallback);
}
public static abstract class CameraManager.AvailabilityCallback {
@ -12761,6 +12766,13 @@ package android.hardware.camera2 {
method public void onCameraUnavailable(java.lang.String);
}
public static abstract class CameraManager.TorchCallback {
ctor public CameraManager.TorchCallback();
method public void onTorchModeAvailable(java.lang.String);
method public void onTorchModeChanged(java.lang.String, boolean);
method public void onTorchModeUnavailable(java.lang.String);
}
public abstract class CameraMetadata {
method public java.util.List<TKey> getKeys();
field public static final int COLOR_CORRECTION_ABERRATION_MODE_FAST = 1; // 0x1

View File

@ -12880,6 +12880,8 @@ package android.hardware.camera2 {
field public static final int CAMERA_DISABLED = 1; // 0x1
field public static final int CAMERA_DISCONNECTED = 2; // 0x2
field public static final int CAMERA_ERROR = 3; // 0x3
field public static final int CAMERA_IN_USE = 4; // 0x4
field public static final int MAX_CAMERAS_IN_USE = 5; // 0x5
}
public abstract class CameraCaptureSession implements java.lang.AutoCloseable {
@ -13020,7 +13022,10 @@ package android.hardware.camera2 {
method public java.lang.String[] getCameraIdList() throws android.hardware.camera2.CameraAccessException;
method public void openCamera(java.lang.String, android.hardware.camera2.CameraDevice.StateCallback, android.os.Handler) throws android.hardware.camera2.CameraAccessException;
method public void registerAvailabilityCallback(android.hardware.camera2.CameraManager.AvailabilityCallback, android.os.Handler);
method public void registerTorchCallback(android.hardware.camera2.CameraManager.TorchCallback, android.os.Handler);
method public void setTorchMode(java.lang.String, boolean) throws android.hardware.camera2.CameraAccessException;
method public void unregisterAvailabilityCallback(android.hardware.camera2.CameraManager.AvailabilityCallback);
method public void unregisterTorchCallback(android.hardware.camera2.CameraManager.TorchCallback);
}
public static abstract class CameraManager.AvailabilityCallback {
@ -13029,6 +13034,13 @@ package android.hardware.camera2 {
method public void onCameraUnavailable(java.lang.String);
}
public static abstract class CameraManager.TorchCallback {
ctor public CameraManager.TorchCallback();
method public void onTorchModeAvailable(java.lang.String);
method public void onTorchModeChanged(java.lang.String, boolean);
method public void onTorchModeUnavailable(java.lang.String);
}
public abstract class CameraMetadata {
method public java.util.List<TKey> getKeys();
field public static final int COLOR_CORRECTION_ABERRATION_MODE_FAST = 1; // 0x1

View File

@ -28,16 +28,14 @@ import android.util.AndroidException;
*/
public class CameraAccessException extends AndroidException {
/**
* The camera device is in use already
* @hide
* The camera device is in use already.
*/
public static final int CAMERA_IN_USE = 4;
/**
* The system-wide limit for number of open cameras has been reached,
* and more camera devices cannot be opened until previous instances are
* closed.
* @hide
* The system-wide limit for number of open cameras or camera resources has
* been reached, and more camera devices cannot be opened or torch mode
* cannot be turned on until previous instances are closed.
*/
public static final int MAX_CAMERAS_IN_USE = 5;

View File

@ -109,8 +109,11 @@ public final class CameraManager {
* of the state of individual CameraManager instances.</p>
*
* @param callback the new callback to send camera availability notices to
* @param handler The handler on which the callback should be invoked, or
* {@code null} to use the current thread's {@link android.os.Looper looper}.
* @param handler The handler on which the callback should be invoked, or {@code null} to use
* the current thread's {@link android.os.Looper looper}.
*
* @throws IllegalArgumentException if the handler is {@code null} but the current thread has
* no looper.
*/
public void registerAvailabilityCallback(AvailabilityCallback callback, Handler handler) {
if (handler == null) {
@ -137,6 +140,42 @@ public final class CameraManager {
CameraManagerGlobal.get().unregisterAvailabilityCallback(callback);
}
/**
* Register a callback to be notified about torch mode status.
*
* <p>Registering the same callback again will replace the handler with the
* new one provided.</p>
*
* <p>The first time a callback is registered, it is immediately called
* with the torch mode status of all currently known camera devices.</p>
*
* <p>Since this callback will be registered with the camera service, remember to unregister it
* once it is no longer needed; otherwise the callback will continue to receive events
* indefinitely and it may prevent other resources from being released. Specifically, the
* callbacks will be invoked independently of the general activity lifecycle and independently
* of the state of individual CameraManager instances.</p>
*
* @param callback The new callback to send torch mode status to
* @param handler The handler on which the callback should be invoked, or {@code null} to use
* the current thread's {@link android.os.Looper looper}.
*
* @throws IllegalArgumentException if the handler is {@code null} but the current thread has
* no looper.
*/
public void registerTorchCallback(TorchCallback callback, Handler handler) {
}
/**
* Remove a previously-added callback; the callback will no longer receive torch mode status
* callbacks.
*
* <p>Removing a callback that isn't registered has no effect.</p>
*
* @param callback The callback to remove from the notification list
*/
public void unregisterTorchCallback(TorchCallback callback) {
}
/**
* <p>Query the capabilities of a camera device. These capabilities are
* immutable for a given camera.</p>
@ -383,6 +422,47 @@ public final class CameraManager {
openCameraDeviceUserAsync(cameraId, callback, handler);
}
/**
* Set the flash unit's torch mode of the camera of the given ID without opening the camera
* device.
*
* <p>Use {@link #getCameraIdList} to get the list of available camera devices and use
* {@link #getCameraCharacteristics} to check whether the camera device has a flash unit.
* Note that even if a camera device has a flash unit, turning on the torch mode may fail
* if the camera device or other camera resources needed to turn on the torch mode are in use.
* </p>
*
* <p> If {@link #setTorchMode} is called to turn on or off the torch mode successfully,
* {@link CameraManager.TorchCallback#onTorchModeChanged} will be invoked.
* However, even if turning on the torch mode is successful, the application does not have the
* exclusive ownership of the flash unit or the camera device. The torch mode will be turned
* off and becomes unavailable when the camera device that the flash unit belongs to becomes
* unavailable ({@link CameraManager.TorchCallback#onTorchModeAvailable} will be
* invoked) or when other camera resources to keep the torch on become unavailable (
* {@link CameraManager.TorchCallback#onTorchModeUnavailable} will be invoked). Also,
* other applications are free to call {@link #setTorchMode} to turn off the torch mode (
* {@link CameraManager.TorchCallback#onTorchModeChanged} will be invoked).
*
* @param cameraId
* The unique identifier of the camera device that the flash unit belongs to.
* @param enabled
* The desired state of the torch mode for the target camera device. Set to
* {@code true} to turn on the torch mode. Set to {@code false} to turn off the
* torch mode.
*
* @throws CameraAccessException if it failed to access the flash unit.
* {@link CameraAccessException#CAMERA_IN_USE} will be thrown if the camera device
* is in use. {@link CameraAccessException#MAX_CAMERAS_IN_USE} will be thrown if
* other camera resources needed to turn on the torch mode are in use.
*
* @throws IllegalArgumentException if cameraId was null, cameraId doesn't match any currently
* or previously available camera device, or the camera device doesn't have a
* flash unit.
*/
public void setTorchMode(String cameraId, boolean enabled) throws CameraAccessException {
}
/**
* A callback for camera devices becoming available or
* unavailable to open.
@ -427,6 +507,68 @@ public final class CameraManager {
}
}
/**
* A callback for camera flash torch modes becoming available, unavailable, enabled, or
* disabled.
*
* <p>The torch mode becomes available when the camera device it belongs to is no longer in use
* and other camera resources it needs are no longer busy. It becomes unavailable when the
* camera device it belongs to becomes unavailable or other camera resouces it needs become
* busy due to other higher priority camera activities. The torch mode changes when an
* application calls {@link #setTorchMode} successfully.
*
* <p>Extend this callback and pass an instance of the subclass to
* {@link CameraManager#registerTorchCallback} to be notified of such status changes.
* </p>
*
* @see registerTorchCallback
*/
public static abstract class TorchCallback {
/**
* The torch mode of a camera has become available to use.
*
* <p>The default implementation of this method does nothing.</p>
*
* @param cameraId The unique identifier of the camera whose torch mode has become
* available.
*/
public void onTorchModeAvailable(String cameraId) {
// default empty implementation
}
/**
* A previously-available torch mode of a camera has become unavailable.
*
* <p>If torch mode was previously turned on by calling {@link #setTorchMode}, it will be
* turned off before {@link CameraManager.TorchCallback#onTorchModeUnavailable} is
* invoked. {@link #setTorchMode} will fail until the flash unit becomes available again.
* </p>
*
* <p>The default implementation of this method does nothing.</p>
*
* @param cameraId The unique identifier of the camera whose torch mode has become
* unavailable.
*/
public void onTorchModeUnavailable(String cameraId) {
// default empty implementation
}
/**
* Torch mode of a camera has been turned on or off through {@link #setTorchMode}.
*
* <p>The default implementation of this method does nothing.</p>
*
* @param cameraId The unique identifier of the camera whose torch mode has been changed.
*
* @param enabled The state that the torch mode of the camera has been changed to.
* {@code true} when the torch mode has been turned on. {@code false} when
* the torch mode has been turned off.
*/
public void onTorchModeChanged(String cameraId, boolean enabled) {
// default empty implementation
}
}
/**
* Return or create the list of currently connected camera devices.
*