diff options
9 files changed, 105 insertions, 21 deletions
diff --git a/api/current.txt b/api/current.txt index 26c90dff3c6b..e3fde232f074 100644 --- a/api/current.txt +++ b/api/current.txt @@ -16906,9 +16906,10 @@ package android.hardware.camera2 { method @NonNull public abstract android.hardware.camera2.CaptureRequest.Builder createReprocessCaptureRequest(@NonNull android.hardware.camera2.TotalCaptureResult) throws android.hardware.camera2.CameraAccessException; method public abstract void createReprocessableCaptureSession(@NonNull android.hardware.camera2.params.InputConfiguration, @NonNull java.util.List<android.view.Surface>, @NonNull android.hardware.camera2.CameraCaptureSession.StateCallback, @Nullable android.os.Handler) throws android.hardware.camera2.CameraAccessException; method public abstract void createReprocessableCaptureSessionByConfigurations(@NonNull android.hardware.camera2.params.InputConfiguration, @NonNull java.util.List<android.hardware.camera2.params.OutputConfiguration>, @NonNull android.hardware.camera2.CameraCaptureSession.StateCallback, @Nullable android.os.Handler) throws android.hardware.camera2.CameraAccessException; + method public int getCameraAudioRestriction() throws android.hardware.camera2.CameraAccessException; method @NonNull public abstract String getId(); method public boolean isSessionConfigurationSupported(@NonNull android.hardware.camera2.params.SessionConfiguration) throws android.hardware.camera2.CameraAccessException; - method public int setCameraAudioRestriction(int) throws android.hardware.camera2.CameraAccessException; + method public void setCameraAudioRestriction(int) throws android.hardware.camera2.CameraAccessException; field public static final int AUDIO_RESTRICTION_NONE = 0; // 0x0 field public static final int AUDIO_RESTRICTION_VIBRATION = 1; // 0x1 field public static final int AUDIO_RESTRICTION_VIBRATION_SOUND = 3; // 0x3 diff --git a/core/java/android/hardware/Camera.java b/core/java/android/hardware/Camera.java index b8ab1142e534..8e8a81d6cee6 100644 --- a/core/java/android/hardware/Camera.java +++ b/core/java/android/hardware/Camera.java @@ -2169,11 +2169,18 @@ public class Camera { } /** - * Setting camera audio restriction mode. + * Set camera audio restriction mode. * * @hide */ - public native final int setAudioRestriction(int mode); + public native final void setAudioRestriction(int mode); + + /** + * Get currently applied camera audio restriction mode. + * + * @hide + */ + public native final int getAudioRestriction(); /** * Image size (width and height dimensions). diff --git a/core/java/android/hardware/camera2/CameraDevice.java b/core/java/android/hardware/camera2/CameraDevice.java index ed2d0c9344c6..0714884e347c 100644 --- a/core/java/android/hardware/camera2/CameraDevice.java +++ b/core/java/android/hardware/camera2/CameraDevice.java @@ -1251,25 +1251,43 @@ public abstract class CameraDevice implements AutoCloseable { * are setting different modes, the system will pick a the mode that's union of * all modes set by CameraDevice.</p> * - * <p>The mute settings will be automatically removed when the CameraDevice is closed or - * the application is disconnected from the camera.</p> + * <p>The mute settings from this CameraDevice will be automatically removed when the + * CameraDevice is closed or the application is disconnected from the camera.</p> * * @param mode An enumeration selecting the audio restriction mode for this camera device. * - * @return The system-wide mute mode setting resulting from this call - * * @throws IllegalArgumentException if the mode is not supported * * @throws CameraAccessException if the camera device is no longer connected or has * encountered a fatal error * @throws IllegalStateException if the camera device has been closed + * + * @see #getCameraAudioRestriction */ - public @CAMERA_AUDIO_RESTRICTION int setCameraAudioRestriction( + public void setCameraAudioRestriction( @CAMERA_AUDIO_RESTRICTION int mode) throws CameraAccessException { throw new UnsupportedOperationException("Subclasses must override this method"); } /** + * Get currently applied global camera audio restriction mode. + * + * <p>Application can use this method to retrieve the system-wide camera audio restriction + * settings described in {@link #setCameraAudioRestriction}.</p> + * + * @return The system-wide mute mode setting resulting from this call + * + * @throws CameraAccessException if the camera device is no longer connected or has + * encountered a fatal error + * @throws IllegalStateException if the camera device has been closed + * + * @see #setCameraAudioRestriction + */ + public @CAMERA_AUDIO_RESTRICTION int getCameraAudioRestriction() throws CameraAccessException { + throw new UnsupportedOperationException("Subclasses must override this method"); + } + + /** * To be inherited by android.hardware.camera2.* code only. * @hide */ diff --git a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java index 1f385dde9563..4494d27330b5 100644 --- a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java +++ b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java @@ -2570,11 +2570,19 @@ public class CameraDeviceImpl extends CameraDevice } @Override - public @CAMERA_AUDIO_RESTRICTION int setCameraAudioRestriction( + public void setCameraAudioRestriction( @CAMERA_AUDIO_RESTRICTION int mode) throws CameraAccessException { synchronized(mInterfaceLock) { checkIfCameraClosedOrInError(); - return mRemoteDevice.setCameraAudioRestriction(mode); + mRemoteDevice.setCameraAudioRestriction(mode); + } + } + + @Override + public @CAMERA_AUDIO_RESTRICTION int getCameraAudioRestriction() throws CameraAccessException { + synchronized(mInterfaceLock) { + checkIfCameraClosedOrInError(); + return mRemoteDevice.getGlobalAudioRestriction(); } } } diff --git a/core/java/android/hardware/camera2/impl/ICameraDeviceUserWrapper.java b/core/java/android/hardware/camera2/impl/ICameraDeviceUserWrapper.java index ff2819b25c00..3660f29f68d1 100644 --- a/core/java/android/hardware/camera2/impl/ICameraDeviceUserWrapper.java +++ b/core/java/android/hardware/camera2/impl/ICameraDeviceUserWrapper.java @@ -258,9 +258,18 @@ public class ICameraDeviceUserWrapper { } } - public int setCameraAudioRestriction(int mode) throws CameraAccessException { + public void setCameraAudioRestriction(int mode) throws CameraAccessException { try { - return mRemoteDevice.setCameraAudioRestriction(mode); + mRemoteDevice.setCameraAudioRestriction(mode); + } catch (Throwable t) { + CameraManager.throwAsPublicException(t); + throw new UnsupportedOperationException("Unexpected exception", t); + } + } + + public int getGlobalAudioRestriction() throws CameraAccessException { + try { + return mRemoteDevice.getGlobalAudioRestriction(); } catch (Throwable t) { CameraManager.throwAsPublicException(t); throw new UnsupportedOperationException("Unexpected exception", t); diff --git a/core/java/android/hardware/camera2/legacy/CameraDeviceUserShim.java b/core/java/android/hardware/camera2/legacy/CameraDeviceUserShim.java index 0fa17c1fb574..5d1435ab4c8d 100644 --- a/core/java/android/hardware/camera2/legacy/CameraDeviceUserShim.java +++ b/core/java/android/hardware/camera2/legacy/CameraDeviceUserShim.java @@ -767,14 +767,25 @@ public class CameraDeviceUserShim implements ICameraDeviceUser { } @Override - public int setCameraAudioRestriction(int mode) { + public void setCameraAudioRestriction(int mode) { if (mLegacyDevice.isClosed()) { String err = "Cannot set camera audio restriction, device has been closed."; Log.e(TAG, err); throw new ServiceSpecificException(ICameraService.ERROR_DISCONNECTED, err); } - return mLegacyDevice.setAudioRestriction(mode); + mLegacyDevice.setAudioRestriction(mode); + } + + @Override + public int getGlobalAudioRestriction() { + if (mLegacyDevice.isClosed()) { + String err = "Cannot set camera audio restriction, device has been closed."; + Log.e(TAG, err); + throw new ServiceSpecificException(ICameraService.ERROR_DISCONNECTED, err); + } + + return mLegacyDevice.getAudioRestriction(); } @Override diff --git a/core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java b/core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java index c0d8baab0ad1..fbc9ac3229c3 100644 --- a/core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java +++ b/core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java @@ -550,8 +550,12 @@ public class LegacyCameraDevice implements AutoCloseable { return lastFrame; } - public int setAudioRestriction(int mode) { - return mRequestThreadManager.setAudioRestriction(mode); + public void setAudioRestriction(int mode) { + mRequestThreadManager.setAudioRestriction(mode); + } + + public int getAudioRestriction() { + return mRequestThreadManager.getAudioRestriction(); } /** diff --git a/core/java/android/hardware/camera2/legacy/RequestThreadManager.java b/core/java/android/hardware/camera2/legacy/RequestThreadManager.java index a514ee139d9c..32411fbdda2f 100644 --- a/core/java/android/hardware/camera2/legacy/RequestThreadManager.java +++ b/core/java/android/hardware/camera2/legacy/RequestThreadManager.java @@ -1105,9 +1105,16 @@ public class RequestThreadManager { condition.block(); } - public int setAudioRestriction(int mode) { + public void setAudioRestriction(int mode) { if (mCamera != null) { - return mCamera.setAudioRestriction(mode); + mCamera.setAudioRestriction(mode); + } + throw new IllegalStateException("Camera has been released!"); + } + + public int getAudioRestriction() { + if (mCamera != null) { + return mCamera.getAudioRestriction(); } throw new IllegalStateException("Camera has been released!"); } diff --git a/core/jni/android_hardware_Camera.cpp b/core/jni/android_hardware_Camera.cpp index f87163bb8379..bc69735d7453 100644 --- a/core/jni/android_hardware_Camera.cpp +++ b/core/jni/android_hardware_Camera.cpp @@ -1023,22 +1023,38 @@ static void android_hardware_Camera_enableFocusMoveCallback(JNIEnv *env, jobject } } -static int32_t android_hardware_Camera_setAudioRestriction( +static void android_hardware_Camera_setAudioRestriction( JNIEnv *env, jobject thiz, jint mode) { ALOGV("setAudioRestriction"); sp<Camera> camera = get_native_camera(env, thiz, NULL); if (camera == 0) { jniThrowRuntimeException(env, "camera has been disconnected"); - return -1; + return; } int32_t ret = camera->setAudioRestriction(mode); if (ret < 0) { jniThrowRuntimeException(env, "Illegal argument or low-level eror"); + return; + } +} + +static int32_t android_hardware_Camera_getAudioRestriction( + JNIEnv *env, jobject thiz) +{ + ALOGV("getAudioRestriction"); + sp<Camera> camera = get_native_camera(env, thiz, NULL); + if (camera == 0) { + jniThrowRuntimeException(env, "camera has been disconnected"); return -1; } + int32_t ret = camera->getGlobalAudioRestriction(); + if (ret < 0) { + jniThrowRuntimeException(env, "Illegal argument or low-level eror"); + return -1; + } return ret; } @@ -1127,8 +1143,11 @@ static const JNINativeMethod camMethods[] = { "(I)V", (void *)android_hardware_Camera_enableFocusMoveCallback}, { "setAudioRestriction", - "(I)I", + "(I)V", (void *)android_hardware_Camera_setAudioRestriction}, + { "getAudioRestriction", + "()I", + (void *)android_hardware_Camera_getAudioRestriction}, }; struct field { |