diff --git a/api/current.txt b/api/current.txt
index 26c90dff3c6b0..e3fde232f0741 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
The mute settings will be automatically removed when the CameraDevice is closed or - * the application is disconnected from the camera.
+ *The mute settings from this CameraDevice will be automatically removed when the + * CameraDevice is closed or the application is disconnected from the camera.
* * @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. + * + *Application can use this method to retrieve the system-wide camera audio restriction + * settings described in {@link #setCameraAudioRestriction}.
+ * + * @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 1f385dde95632..4494d27330b58 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 ff2819b25c00a..3660f29f68d1b 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 0fa17c1fb574b..5d1435ab4c8db 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 c0d8baab0ad1c..fbc9ac3229c34 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 a514ee139d9ce..32411fbdda2f8 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 f87163bb8379e..bc69735d74536 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