diff --git a/core/api/system-current.txt b/core/api/system-current.txt index 273f59ce4dca3..0893f71248b92 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -6075,7 +6075,7 @@ package android.media { method public boolean isAudioServerRunning(); method public boolean isHdmiSystemAudioSupported(); method @RequiresPermission(android.Manifest.permission.CALL_AUDIO_INTERCEPTION) public boolean isPstnCallAudioInterceptable(); - method public static boolean isUltrasoundSupported(); + method @RequiresPermission(android.Manifest.permission.ACCESS_ULTRASOUND) public boolean isUltrasoundSupported(); method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void muteAwaitConnection(@NonNull int[], @NonNull android.media.AudioDeviceAttributes, long, @NonNull java.util.concurrent.TimeUnit) throws java.lang.IllegalStateException; method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int registerAudioPolicy(@NonNull android.media.audiopolicy.AudioPolicy); method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void registerMuteAwaitConnectionCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioManager.MuteAwaitConnectionCallback); diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java index 3887372d00b5c..6e695e68fbf20 100644 --- a/media/java/android/media/AudioManager.java +++ b/media/java/android/media/AudioManager.java @@ -7294,8 +7294,13 @@ public class AudioManager { * Ultrasound playback and capture, false otherwise. */ @SystemApi - public static boolean isUltrasoundSupported() { - return AudioSystem.isUltrasoundSupported(); + @RequiresPermission(android.Manifest.permission.ACCESS_ULTRASOUND) + public boolean isUltrasoundSupported() { + try { + return getService().isUltrasoundSupported(); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } } /** diff --git a/media/java/android/media/IAudioService.aidl b/media/java/android/media/IAudioService.aidl index 2c9f015cf4ce6..d702eb9aef576 100755 --- a/media/java/android/media/IAudioService.aidl +++ b/media/java/android/media/IAudioService.aidl @@ -138,6 +138,8 @@ interface IAudioService { boolean isMicrophoneMuted(); + boolean isUltrasoundSupported(); + void setMicrophoneMute(boolean on, String callingPackage, int userId, in String attributionTag); oneway void setMicrophoneMuteFromSwitch(boolean on); diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 807293fdae500..0b9fb1a72f8d0 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -3330,6 +3330,13 @@ public class AudioService extends IAudioService.Stub } } + private void enforceAccessUltrasoundPermission() { + if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.ACCESS_ULTRASOUND) + != PackageManager.PERMISSION_GRANTED) { + throw new SecurityException("Missing ACCESS_ULTRASOUND permission"); + } + } + private void enforceQueryStatePermission() { if (mContext.checkCallingOrSelfPermission(Manifest.permission.QUERY_AUDIO_STATE) != PackageManager.PERMISSION_GRANTED) { @@ -3462,6 +3469,12 @@ public class AudioService extends IAudioService.Stub attributionTag, Binder.getCallingUid(), callingOrSelfHasAudioSettingsPermission()); } + /** @see AudioManager#isUltrasoundSupported() */ + public boolean isUltrasoundSupported() { + enforceAccessUltrasoundPermission(); + return AudioSystem.isUltrasoundSupported(); + } + private boolean canChangeAccessibilityVolume() { synchronized (mAccessibilityServiceUidsLock) { if (PackageManager.PERMISSION_GRANTED == mContext.checkCallingOrSelfPermission(