From c455782ea2e53893988b0bffac67bf04fde1eb47 Mon Sep 17 00:00:00 2001 From: Jean-Michel Trivi Date: Mon, 23 Jan 2023 18:19:52 +0000 Subject: [PATCH] AudioService: device vol behavior can use additional permission Let the device volume behavior APIs also accept the system MODIFY_AUDIO_SYSTEM_SETTINGS permission, as MODIFY_AUDIO_ROUTING alone is too strong a permission to expect to use this feature. import Manifest class. Bug: 265774737 Test: atest AudioServiceHostTest#testAudioVolumeBehavior Change-Id: Ia3ea9b3a4e24bdcc64240875a7d1db33bc1b469b --- core/api/system-current.txt | 4 +- core/api/test-current.txt | 2 +- media/java/android/media/AudioManager.java | 198 +++++++++--------- media/java/android/media/IAudioService.aidl | 3 +- .../android/server/audio/AudioService.java | 14 +- 5 files changed, 116 insertions(+), 105 deletions(-) diff --git a/core/api/system-current.txt b/core/api/system-current.txt index d3775adfde47f..56d67bfd67e3b 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -6669,7 +6669,7 @@ package android.media { method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public static java.util.List getAudioVolumeGroups(); method @NonNull @RequiresPermission(android.Manifest.permission.CALL_AUDIO_INTERCEPTION) public android.media.AudioRecord getCallDownlinkExtractionAudioRecord(@NonNull android.media.AudioFormat); method @NonNull @RequiresPermission(android.Manifest.permission.CALL_AUDIO_INTERCEPTION) public android.media.AudioTrack getCallUplinkInjectionAudioTrack(@NonNull android.media.AudioFormat); - method @RequiresPermission(anyOf={android.Manifest.permission.MODIFY_AUDIO_ROUTING, "android.permission.QUERY_AUDIO_STATE"}) public int getDeviceVolumeBehavior(@NonNull android.media.AudioDeviceAttributes); + method @RequiresPermission(anyOf={android.Manifest.permission.MODIFY_AUDIO_ROUTING, "android.permission.QUERY_AUDIO_STATE", android.Manifest.permission.MODIFY_AUDIO_SYSTEM_SETTINGS}) public int getDeviceVolumeBehavior(@NonNull android.media.AudioDeviceAttributes); method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.MODIFY_AUDIO_ROUTING, "android.permission.QUERY_AUDIO_STATE"}) public java.util.List getDevicesForAttributes(@NonNull android.media.AudioAttributes); method @RequiresPermission("android.permission.QUERY_AUDIO_STATE") public int getLastAudibleStreamVolume(int); method @IntRange(from=0) public long getMaxAdditionalOutputDeviceDelay(@NonNull android.media.AudioDeviceInfo); @@ -6708,7 +6708,7 @@ package android.media { method public void setAudioServerStateCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioManager.AudioServerStateCallback); method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void setBluetoothVariableLatencyEnabled(boolean); method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public boolean setDeviceAsNonDefaultForStrategy(@NonNull android.media.audiopolicy.AudioProductStrategy, @NonNull android.media.AudioDeviceAttributes); - method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void setDeviceVolumeBehavior(@NonNull android.media.AudioDeviceAttributes, int); + method @RequiresPermission(anyOf={android.Manifest.permission.MODIFY_AUDIO_ROUTING, android.Manifest.permission.MODIFY_AUDIO_SYSTEM_SETTINGS}) public void setDeviceVolumeBehavior(@NonNull android.media.AudioDeviceAttributes, int); method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void setFocusRequestResult(@NonNull android.media.AudioFocusInfo, int, @NonNull android.media.audiopolicy.AudioPolicy); method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public boolean setPreferredDeviceForCapturePreset(int, @NonNull android.media.AudioDeviceAttributes); method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public boolean setPreferredDeviceForStrategy(@NonNull android.media.audiopolicy.AudioProductStrategy, @NonNull android.media.AudioDeviceAttributes); diff --git a/core/api/test-current.txt b/core/api/test-current.txt index 3a6173ca507d1..ddd7939767196 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -1644,7 +1644,7 @@ package android.media { method @NonNull public java.util.Map getSurroundFormats(); method public boolean hasRegisteredDynamicPolicy(); method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_SYSTEM_SETTINGS) public boolean isCsdEnabled(); - method @RequiresPermission(anyOf={android.Manifest.permission.MODIFY_AUDIO_ROUTING, android.Manifest.permission.QUERY_AUDIO_STATE}) public boolean isFullVolumeDevice(); + method @RequiresPermission(anyOf={android.Manifest.permission.MODIFY_AUDIO_ROUTING, android.Manifest.permission.QUERY_AUDIO_STATE, android.Manifest.permission.MODIFY_AUDIO_SYSTEM_SETTINGS}) public boolean isFullVolumeDevice(); method @RequiresPermission(android.Manifest.permission.CALL_AUDIO_INTERCEPTION) public boolean isPstnCallAudioInterceptable(); method @RequiresPermission("android.permission.QUERY_AUDIO_STATE") public int requestAudioFocusForTest(@NonNull android.media.AudioFocusRequest, @NonNull String, int, int); method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_SYSTEM_SETTINGS) public void setCsd(float); diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java index 813929e9d0e60..af515c265d5b0 100644 --- a/media/java/android/media/AudioManager.java +++ b/media/java/android/media/AudioManager.java @@ -20,6 +20,7 @@ import static android.companion.virtual.VirtualDeviceManager.DEVICE_ID_DEFAULT; import static android.companion.virtual.VirtualDeviceParams.DEVICE_POLICY_DEFAULT; import static android.companion.virtual.VirtualDeviceParams.POLICY_TYPE_AUDIO; +import android.Manifest; import android.annotation.CallbackExecutor; import android.annotation.IntDef; import android.annotation.IntRange; @@ -407,7 +408,7 @@ public class AudioManager { public static final int STREAM_ACCESSIBILITY = AudioSystem.STREAM_ACCESSIBILITY; /** @hide Used to identify the volume of audio streams for virtual assistant */ @SystemApi - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) public static final int STREAM_ASSISTANT = AudioSystem.STREAM_ASSISTANT; /** Number of audio streams */ @@ -1038,7 +1039,7 @@ public class AudioManager { /** @hide */ @UnsupportedAppUsage - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) public void setMasterMute(boolean mute, int flags) { final IAudioService service = getService(); try { @@ -1346,7 +1347,7 @@ public class AudioManager { * @hide */ @SystemApi - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) public void setVolumeIndexForAttributes(@NonNull AudioAttributes attr, int index, int flags) { Preconditions.checkNotNull(attr, "attr must not be null"); final IAudioService service = getService(); @@ -1370,7 +1371,7 @@ public class AudioManager { */ @SystemApi @IntRange(from = 0) - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) public int getVolumeIndexForAttributes(@NonNull AudioAttributes attr) { Preconditions.checkNotNull(attr, "attr must not be null"); final IAudioService service = getService(); @@ -1391,7 +1392,7 @@ public class AudioManager { */ @SystemApi @IntRange(from = 0) - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) public int getMaxVolumeIndexForAttributes(@NonNull AudioAttributes attr) { Preconditions.checkNotNull(attr, "attr must not be null"); final IAudioService service = getService(); @@ -1412,7 +1413,7 @@ public class AudioManager { */ @SystemApi @IntRange(from = 0) - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) public int getMinVolumeIndexForAttributes(@NonNull AudioAttributes attr) { Preconditions.checkNotNull(attr, "attr must not be null"); final IAudioService service = getService(); @@ -1429,7 +1430,7 @@ public class AudioManager { * @hide */ @SystemApi - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) public void setSupportedSystemUsages(@NonNull @AttributeSystemUsage int[] systemUsages) { Objects.requireNonNull(systemUsages, "systemUsages must not be null"); final IAudioService service = getService(); @@ -1446,7 +1447,7 @@ public class AudioManager { * @hide */ @SystemApi - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) public @NonNull @AttributeSystemUsage int[] getSupportedSystemUsages() { final IAudioService service = getService(); try { @@ -1555,7 +1556,7 @@ public class AudioManager { * * @hide */ - @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) + @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) @UnsupportedAppUsage public void forceVolumeControlStream(int streamType) { final IAudioService service = getService(); @@ -1752,7 +1753,7 @@ public class AudioManager { * @return true if the operation was successful, false otherwise */ @SystemApi - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) public boolean setPreferredDeviceForStrategy(@NonNull AudioProductStrategy strategy, @NonNull AudioDeviceAttributes device) { return setPreferredDevicesForStrategy(strategy, Arrays.asList(device)); @@ -1768,7 +1769,7 @@ public class AudioManager { * device set for example) */ @SystemApi - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) public boolean removePreferredDeviceForStrategy(@NonNull AudioProductStrategy strategy) { Objects.requireNonNull(strategy); try { @@ -1791,7 +1792,7 @@ public class AudioManager { * ever set or if the strategy is invalid */ @SystemApi - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) @Nullable public AudioDeviceAttributes getPreferredDeviceForStrategy( @NonNull AudioProductStrategy strategy) { @@ -1813,7 +1814,7 @@ public class AudioManager { * @return true if the operation was successful, false otherwise */ @SystemApi - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) public boolean setPreferredDevicesForStrategy(@NonNull AudioProductStrategy strategy, @NonNull List devices) { Objects.requireNonNull(strategy); @@ -1843,7 +1844,7 @@ public class AudioManager { * @return list of the preferred devices for that strategy */ @SystemApi - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) @NonNull public List getPreferredDevicesForStrategy( @NonNull AudioProductStrategy strategy) { @@ -1867,7 +1868,7 @@ public class AudioManager { * @return true if the operation was successful, false otherwise */ @SystemApi - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) public boolean setDeviceAsNonDefaultForStrategy(@NonNull AudioProductStrategy strategy, @NonNull AudioDeviceAttributes device) { Objects.requireNonNull(strategy); @@ -1891,7 +1892,7 @@ public class AudioManager { * device set for example) */ @SystemApi - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) public boolean removeDeviceAsNonDefaultForStrategy(@NonNull AudioProductStrategy strategy, @NonNull AudioDeviceAttributes device) { Objects.requireNonNull(strategy); @@ -1913,7 +1914,7 @@ public class AudioManager { * @return list of non-default devices for the strategy */ @SystemApi - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) @NonNull public List getNonDefaultDevicesForStrategy( @NonNull AudioProductStrategy strategy) { @@ -1996,7 +1997,7 @@ public class AudioManager { * Executor, AudioManager.OnPreferredDevicesForStrategyChangedListener)} instead */ @SystemApi - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) @Deprecated public void addOnPreferredDeviceForStrategyChangedListener( @NonNull @CallbackExecutor Executor executor, @@ -2013,7 +2014,7 @@ public class AudioManager { * AudioManager.OnPreferredDevicesForStrategyChangedListener)} instead */ @SystemApi - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) @Deprecated public void removeOnPreferredDeviceForStrategyChangedListener( @NonNull OnPreferredDeviceForStrategyChangedListener listener) { @@ -2028,7 +2029,7 @@ public class AudioManager { * @throws SecurityException if the caller doesn't hold the required permission */ @SystemApi - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) public void addOnPreferredDevicesForStrategyChangedListener( @NonNull @CallbackExecutor Executor executor, @NonNull OnPreferredDevicesForStrategyChangedListener listener) @@ -2046,7 +2047,7 @@ public class AudioManager { * @param listener */ @SystemApi - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) public void removeOnPreferredDevicesForStrategyChangedListener( @NonNull OnPreferredDevicesForStrategyChangedListener listener) { Objects.requireNonNull(listener); @@ -2092,7 +2093,7 @@ public class AudioManager { * @throws SecurityException if the caller doesn't hold the required permission */ @SystemApi - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) public void addOnNonDefaultDevicesForStrategyChangedListener( @NonNull @CallbackExecutor Executor executor, @NonNull OnNonDefaultDevicesForStrategyChangedListener listener) @@ -2112,7 +2113,7 @@ public class AudioManager { * @param listener */ @SystemApi - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) public void removeOnNonDefaultDevicesForStrategyChangedListener( @NonNull OnNonDefaultDevicesForStrategyChangedListener listener) { Objects.requireNonNull(listener); @@ -2206,7 +2207,7 @@ public class AudioManager { * @return true if the operation was successful, false otherwise */ @SystemApi - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) public boolean setPreferredDeviceForCapturePreset(@MediaRecorder.SystemSource int capturePreset, @NonNull AudioDeviceAttributes device) { return setPreferredDevicesForCapturePreset(capturePreset, Arrays.asList(device)); @@ -2220,7 +2221,7 @@ public class AudioManager { * device set for example) */ @SystemApi - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) public boolean clearPreferredDevicesForCapturePreset( @MediaRecorder.SystemSource int capturePreset) { if (!MediaRecorder.isValidAudioSource(capturePreset)) { @@ -2243,7 +2244,7 @@ public class AudioManager { */ @NonNull @SystemApi - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) public List getPreferredDevicesForCapturePreset( @MediaRecorder.SystemSource int capturePreset) { if (!MediaRecorder.isValidAudioSource(capturePreset)) { @@ -2315,7 +2316,7 @@ public class AudioManager { * @throws SecurityException if the caller doesn't hold the required permission */ @SystemApi - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) public void addOnPreferredDevicesForCapturePresetChangedListener( @NonNull @CallbackExecutor Executor executor, @NonNull OnPreferredDevicesForCapturePresetChangedListener listener) @@ -2341,7 +2342,7 @@ public class AudioManager { * @param listener */ @SystemApi - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) public void removeOnPreferredDevicesForCapturePresetChangedListener( @NonNull OnPreferredDevicesForCapturePresetChangedListener listener) { Objects.requireNonNull(listener); @@ -2785,7 +2786,7 @@ public class AudioManager { /** * Start bluetooth SCO audio connection. *

Requires Permission: - * {@link android.Manifest.permission#MODIFY_AUDIO_SETTINGS}. + * {@link Manifest.permission#MODIFY_AUDIO_SETTINGS}. *

This method can be used by applications wanting to send and received audio * to/from a bluetooth SCO headset while the phone is not in call. *

As the SCO connection establishment can take several seconds, @@ -2842,7 +2843,7 @@ public class AudioManager { * @hide * Start bluetooth SCO audio connection in virtual call mode. *

Requires Permission: - * {@link android.Manifest.permission#MODIFY_AUDIO_SETTINGS}. + * {@link Manifest.permission#MODIFY_AUDIO_SETTINGS}. *

Similar to {@link #startBluetoothSco()} with explicit selection of virtual call mode. * Telephony and communication applications (VoIP, Video Chat) should preferably select * virtual call mode. @@ -2866,7 +2867,7 @@ public class AudioManager { /** * Stop bluetooth SCO audio connection. *

Requires Permission: - * {@link android.Manifest.permission#MODIFY_AUDIO_SETTINGS}. + * {@link Manifest.permission#MODIFY_AUDIO_SETTINGS}. *

This method must be called by applications having requested the use of * bluetooth SCO audio with {@link #startBluetoothSco()} when finished with the SCO * connection or if connection fails. @@ -3454,7 +3455,7 @@ public class AudioManager { * @hide */ @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES) - @RequiresPermission(android.Manifest.permission.BLUETOOTH_STACK) + @RequiresPermission(Manifest.permission.BLUETOOTH_STACK) public void setHfpEnabled(boolean enable) { AudioSystem.setParameters("hfp_enable=" + enable); } @@ -3463,7 +3464,7 @@ public class AudioManager { * @hide */ @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES) - @RequiresPermission(android.Manifest.permission.BLUETOOTH_STACK) + @RequiresPermission(Manifest.permission.BLUETOOTH_STACK) public void setHfpVolume(int volume) { AudioSystem.setParameters("hfp_volume=" + volume); } @@ -3472,7 +3473,7 @@ public class AudioManager { * @hide */ @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES) - @RequiresPermission(android.Manifest.permission.BLUETOOTH_STACK) + @RequiresPermission(Manifest.permission.BLUETOOTH_STACK) public void setHfpSamplingRate(int rate) { AudioSystem.setParameters("hfp_set_sampling_rate=" + rate); } @@ -3481,7 +3482,7 @@ public class AudioManager { * @hide */ @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES) - @RequiresPermission(android.Manifest.permission.BLUETOOTH_STACK) + @RequiresPermission(Manifest.permission.BLUETOOTH_STACK) public void setBluetoothHeadsetProperties(@NonNull String name, boolean hasNrecEnabled, boolean hasWbsEnabled) { AudioSystem.setParameters("bt_headset_name=" + name @@ -3493,7 +3494,7 @@ public class AudioManager { * @hide */ @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES) - @RequiresPermission(android.Manifest.permission.BLUETOOTH_STACK) + @RequiresPermission(Manifest.permission.BLUETOOTH_STACK) public void setA2dpSuspended(boolean enable) { AudioSystem.setParameters("A2dpSuspended=" + enable); } @@ -3506,7 +3507,7 @@ public class AudioManager { * @hide */ @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES) - @RequiresPermission(android.Manifest.permission.BLUETOOTH_STACK) + @RequiresPermission(Manifest.permission.BLUETOOTH_STACK) public void setLeAudioSuspended(boolean enable) { AudioSystem.setParameters("LeAudioSuspended=" + enable); } @@ -4316,7 +4317,7 @@ public class AudioManager { * @throws IllegalArgumentException */ @SystemApi - @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) + @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) public int requestAudioFocus(OnAudioFocusChangeListener l, @NonNull AudioAttributes requestAttributes, int durationHint, @@ -4357,8 +4358,8 @@ public class AudioManager { */ @SystemApi @RequiresPermission(anyOf= { - android.Manifest.permission.MODIFY_PHONE_STATE, - android.Manifest.permission.MODIFY_AUDIO_ROUTING + Manifest.permission.MODIFY_PHONE_STATE, + Manifest.permission.MODIFY_AUDIO_ROUTING }) public int requestAudioFocus(OnAudioFocusChangeListener l, @NonNull AudioAttributes requestAttributes, @@ -4502,7 +4503,7 @@ public class AudioManager { * @throws IllegalArgumentException when trying to lock focus without an AudioPolicy */ @SystemApi - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) public int requestAudioFocus(@NonNull AudioFocusRequest afr, @Nullable AudioPolicy ap) { if (afr == null) { throw new NullPointerException("Illegal null AudioFocusRequest"); @@ -4689,7 +4690,7 @@ public class AudioManager { * @param ap a valid registered {@link AudioPolicy} configured as a focus policy. */ @SystemApi - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) public void setFocusRequestResult(@NonNull AudioFocusInfo afi, @FocusRequestResult int requestResult, @NonNull AudioPolicy ap) { if (afi == null) { @@ -4728,7 +4729,7 @@ public class AudioManager { * @throws NullPointerException if the {@link AudioFocusInfo} or {@link AudioPolicy} are null. */ @SystemApi - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) public int dispatchAudioFocusChange(@NonNull AudioFocusInfo afi, int focusChange, @NonNull AudioPolicy ap) { if (afi == null) { @@ -4988,11 +4989,11 @@ public class AudioManager { * @param policy the non-null {@link AudioPolicy} to register. * @return {@link #ERROR} if there was an error communicating with the registration service * or if the user doesn't have the required - * {@link android.Manifest.permission#MODIFY_AUDIO_ROUTING} permission, + * {@link Manifest.permission#MODIFY_AUDIO_ROUTING} permission, * {@link #SUCCESS} otherwise. */ @SystemApi - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) public int registerAudioPolicy(@NonNull AudioPolicy policy) { return registerAudioPolicyStatic(policy); } @@ -5026,7 +5027,7 @@ public class AudioManager { * @param policy the non-null {@link AudioPolicy} to unregister. */ @SystemApi - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) public void unregisterAudioPolicyAsync(@NonNull AudioPolicy policy) { unregisterAudioPolicyAsyncStatic(policy); } @@ -5052,7 +5053,7 @@ public class AudioManager { * @param policy the non-null {@link AudioPolicy} to unregister. */ @SystemApi - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) public void unregisterAudioPolicy(@NonNull AudioPolicy policy) { Preconditions.checkNotNull(policy, "Illegal null AudioPolicy argument"); final IAudioService service = getService(); @@ -5853,8 +5854,8 @@ public class AudioManager { */ @SystemApi @RequiresPermission(anyOf = { - android.Manifest.permission.MODIFY_AUDIO_ROUTING, - android.Manifest.permission.QUERY_AUDIO_STATE + Manifest.permission.MODIFY_AUDIO_ROUTING, + Manifest.permission.QUERY_AUDIO_STATE }) public @NonNull List getDevicesForAttributes( @NonNull AudioAttributes attributes) { @@ -5929,8 +5930,8 @@ public class AudioManager { */ @SystemApi @RequiresPermission(anyOf = { - android.Manifest.permission.MODIFY_AUDIO_ROUTING, - android.Manifest.permission.QUERY_AUDIO_STATE + Manifest.permission.MODIFY_AUDIO_ROUTING, + Manifest.permission.QUERY_AUDIO_STATE }) public void addOnDevicesForAttributesChangedListener(@NonNull AudioAttributes attributes, @NonNull @CallbackExecutor Executor executor, @@ -5960,8 +5961,8 @@ public class AudioManager { */ @SystemApi @RequiresPermission(anyOf = { - android.Manifest.permission.MODIFY_AUDIO_ROUTING, - android.Manifest.permission.QUERY_AUDIO_STATE + Manifest.permission.MODIFY_AUDIO_ROUTING, + Manifest.permission.QUERY_AUDIO_STATE }) public void removeOnDevicesForAttributesChangedListener( @NonNull OnDevicesForAttributesChangedListener listener) { @@ -6119,7 +6120,10 @@ public class AudioManager { * @param deviceVolumeBehavior one of the device behaviors */ @SystemApi - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(anyOf = { + Manifest.permission.MODIFY_AUDIO_ROUTING, + Manifest.permission.MODIFY_AUDIO_SYSTEM_SETTINGS + }) public void setDeviceVolumeBehavior(@NonNull AudioDeviceAttributes device, @DeviceVolumeBehavior int deviceVolumeBehavior) { // verify arguments (validity of device type is enforced in server) @@ -6143,8 +6147,9 @@ public class AudioManager { */ @SystemApi @RequiresPermission(anyOf = { - android.Manifest.permission.MODIFY_AUDIO_ROUTING, - android.Manifest.permission.QUERY_AUDIO_STATE + Manifest.permission.MODIFY_AUDIO_ROUTING, + Manifest.permission.QUERY_AUDIO_STATE, + Manifest.permission.MODIFY_AUDIO_SYSTEM_SETTINGS }) public @DeviceVolumeBehavior int getDeviceVolumeBehavior(@NonNull AudioDeviceAttributes device) { @@ -6165,8 +6170,9 @@ public class AudioManager { */ @TestApi @RequiresPermission(anyOf = { - android.Manifest.permission.MODIFY_AUDIO_ROUTING, - android.Manifest.permission.QUERY_AUDIO_STATE + Manifest.permission.MODIFY_AUDIO_ROUTING, + Manifest.permission.QUERY_AUDIO_STATE, + Manifest.permission.MODIFY_AUDIO_SYSTEM_SETTINGS }) public boolean isFullVolumeDevice() { final AudioAttributes attributes = new AudioAttributes.Builder() @@ -6189,7 +6195,7 @@ public class AudioManager { * {@hide} */ @UnsupportedAppUsage - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) public void setWiredDeviceConnectionState(int device, int state, String address, String name) { AudioDeviceAttributes attributes = new AudioDeviceAttributes(device, address, name); setWiredDeviceConnectionState(attributes, state); @@ -6202,7 +6208,7 @@ public class AudioManager { * {@hide} */ @UnsupportedAppUsage - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) public void setWiredDeviceConnectionState(AudioDeviceAttributes attributes, int state) { final IAudioService service = getService(); try { @@ -6220,7 +6226,7 @@ public class AudioManager { * {@hide} */ @TestApi - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) public void setTestDeviceConnectionState(@NonNull AudioDeviceAttributes device, boolean connected) { try { @@ -6243,7 +6249,7 @@ public class AudioManager { * {@hide} */ @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES) - @RequiresPermission(android.Manifest.permission.BLUETOOTH_STACK) + @RequiresPermission(Manifest.permission.BLUETOOTH_STACK) public void handleBluetoothActiveDeviceChanged(@Nullable BluetoothDevice newDevice, @Nullable BluetoothDevice previousDevice, @NonNull BluetoothProfileConnectionInfo info) { @@ -6363,7 +6369,7 @@ public class AudioManager { * or the delay is not in range of {@link #getMaxAdditionalOutputDeviceDelay()}. */ @SystemApi - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) public boolean setAdditionalOutputDeviceDelay( @NonNull AudioDeviceInfo device, @IntRange(from = 0) long delayMillis) { Objects.requireNonNull(device); @@ -6522,7 +6528,7 @@ public class AudioManager { * @return the RS2 value used for momentary exposure warnings */ @TestApi - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_SYSTEM_SETTINGS) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_SYSTEM_SETTINGS) public float getRs2Value() { try { return getService().getRs2Value(); @@ -6536,7 +6542,7 @@ public class AudioManager { * Sets the RS2 value used for momentary exposure warnings */ @TestApi - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_SYSTEM_SETTINGS) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_SYSTEM_SETTINGS) public void setRs2Value(float rs2Value) { try { getService().setRs2Value(rs2Value); @@ -6550,7 +6556,7 @@ public class AudioManager { * @return the current computed sound dose value */ @TestApi - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_SYSTEM_SETTINGS) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_SYSTEM_SETTINGS) public float getCsd() { try { return getService().getCsd(); @@ -6564,7 +6570,7 @@ public class AudioManager { * Sets the computed sound dose value to {@code csd} */ @TestApi - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_SYSTEM_SETTINGS) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_SYSTEM_SETTINGS) public void setCsd(float csd) { try { getService().setCsd(csd); @@ -6580,7 +6586,7 @@ public class AudioManager { * since this can affect the certification of a device with EN50332-3 regulation. */ @TestApi - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_SYSTEM_SETTINGS) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_SYSTEM_SETTINGS) public void forceUseFrameworkMel(boolean useFrameworkMel) { try { getService().forceUseFrameworkMel(useFrameworkMel); @@ -6594,7 +6600,7 @@ public class AudioManager { * Forces the computation of CSD on all output devices. */ @TestApi - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_SYSTEM_SETTINGS) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_SYSTEM_SETTINGS) public void forceComputeCsdOnAllDevices(boolean computeCsdOnAllDevices) { try { getService().forceComputeCsdOnAllDevices(computeCsdOnAllDevices); @@ -6608,7 +6614,7 @@ public class AudioManager { * Returns whether CSD is enabled on this device. */ @TestApi - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_SYSTEM_SETTINGS) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_SYSTEM_SETTINGS) public boolean isCsdEnabled() { try { return getService().isCsdEnabled(); @@ -7642,7 +7648,7 @@ public class AudioManager { * * @return true if successful, otherwise false */ - @RequiresPermission(android.Manifest.permission.WRITE_SETTINGS) + @RequiresPermission(Manifest.permission.WRITE_SETTINGS) public boolean setEncodedSurroundMode(@EncodedSurroundOutputMode int mode) { try { return getService().setEncodedSurroundMode(mode); @@ -7694,7 +7700,7 @@ public class AudioManager { * @param enabled the required surround format state, true for enabled, false for disabled * @return true if successful, otherwise false */ - @RequiresPermission(android.Manifest.permission.WRITE_SETTINGS) + @RequiresPermission(Manifest.permission.WRITE_SETTINGS) public boolean setSurroundFormatEnabled( @AudioFormat.SurroundSoundEncoding int audioFormat, boolean enabled) { try { @@ -7758,7 +7764,7 @@ public class AudioManager { * Ultrasound playback and capture, false otherwise. */ @SystemApi - @RequiresPermission(android.Manifest.permission.ACCESS_ULTRASOUND) + @RequiresPermission(Manifest.permission.ACCESS_ULTRASOUND) public boolean isUltrasoundSupported() { try { return getService().isUltrasoundSupported(); @@ -7779,7 +7785,7 @@ public class AudioManager { * open. False otherwise. */ @SystemApi - @RequiresPermission(android.Manifest.permission.CAPTURE_AUDIO_HOTWORD) + @RequiresPermission(Manifest.permission.CAPTURE_AUDIO_HOTWORD) public boolean isHotwordStreamSupported(boolean lookbackAudio) { try { return getService().isHotwordStreamSupported(lookbackAudio); @@ -7803,7 +7809,7 @@ public class AudioManager { */ @SystemApi @NonNull - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) public static List getAudioProductStrategies() { final IAudioService service = getService(); try { @@ -7823,7 +7829,7 @@ public class AudioManager { */ @SystemApi @NonNull - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) public static List getAudioVolumeGroups() { final IAudioService service = getService(); try { @@ -8075,7 +8081,7 @@ public class AudioManager { /** @hide * TODO: make this a @SystemApi */ - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) public void setMultiAudioFocusEnabled(boolean enabled) { try { getService().setMultiAudioFocusEnabled(enabled); @@ -8119,7 +8125,7 @@ public class AudioManager { * latest application having selected mode {@link #MODE_IN_COMMUNICATION} or mode * {@link #MODE_IN_CALL}. Note that MODE_IN_CALL can only be selected by the main * telephony application with permission - * {@link android.Manifest.permission#MODIFY_PHONE_STATE}. + * {@link Manifest.permission#MODIFY_PHONE_STATE}. *

If the requested devices is not currently available, the request will be rejected and * the method will return false. *

This API replaces the following deprecated APIs: @@ -8386,7 +8392,7 @@ public class AudioManager { */ @TestApi @SystemApi - @RequiresPermission(android.Manifest.permission.CALL_AUDIO_INTERCEPTION) + @RequiresPermission(Manifest.permission.CALL_AUDIO_INTERCEPTION) public boolean isPstnCallAudioInterceptable() { final IAudioService service = getService(); try { @@ -8487,7 +8493,7 @@ public class AudioManager { */ @TestApi @SystemApi - @RequiresPermission(android.Manifest.permission.CALL_AUDIO_INTERCEPTION) + @RequiresPermission(Manifest.permission.CALL_AUDIO_INTERCEPTION) public @NonNull AudioTrack getCallUplinkInjectionAudioTrack(@NonNull AudioFormat format) { Objects.requireNonNull(format); checkCallRedirectionFormat(format, true /* isOutput */); @@ -8559,7 +8565,7 @@ public class AudioManager { */ @TestApi @SystemApi - @RequiresPermission(android.Manifest.permission.CALL_AUDIO_INTERCEPTION) + @RequiresPermission(Manifest.permission.CALL_AUDIO_INTERCEPTION) public @NonNull AudioRecord getCallDownlinkExtractionAudioRecord(@NonNull AudioFormat format) { Objects.requireNonNull(format); checkCallRedirectionFormat(format, false /* isOutput */); @@ -8668,7 +8674,7 @@ public class AudioManager { * @see #registerMuteAwaitConnectionCallback(Executor, AudioManager.MuteAwaitConnectionCallback) */ @SystemApi - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) public void muteAwaitConnection(@NonNull int[] usagesToMute, @NonNull AudioDeviceAttributes device, long timeout, @NonNull TimeUnit timeUnit) throws IllegalStateException { @@ -8698,7 +8704,7 @@ public class AudioManager { * or because it timed out) */ @SystemApi - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) public @Nullable AudioDeviceAttributes getMutingExpectedDevice() { try { return getService().getMutingExpectedDevice(); @@ -8718,7 +8724,7 @@ public class AudioManager { * {@link #muteAwaitConnection(int[], AudioDeviceAttributes, long, TimeUnit)} */ @SystemApi - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) public void cancelMuteAwaitConnection(@NonNull AudioDeviceAttributes device) throws IllegalStateException { Objects.requireNonNull(device); @@ -8797,7 +8803,7 @@ public class AudioManager { * @param callback the callback to register */ @SystemApi - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) public void registerMuteAwaitConnectionCallback( @NonNull @CallbackExecutor Executor executor, @NonNull MuteAwaitConnectionCallback callback) { @@ -8821,7 +8827,7 @@ public class AudioManager { * @param callback the callback to unregister */ @SystemApi - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) public void unregisterMuteAwaitConnectionCallback( @NonNull MuteAwaitConnectionCallback callback) { synchronized (mMuteAwaitConnectionListenerLock) { @@ -8843,7 +8849,7 @@ public class AudioManager { * @hide */ @SystemApi - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) public void addAssistantServicesUids(@NonNull int[] assistantUids) { try { getService().addAssistantServicesUids(assistantUids); @@ -8860,7 +8866,7 @@ public class AudioManager { * @hide */ @SystemApi - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) public void removeAssistantServicesUids(@NonNull int[] assistantUids) { try { getService().removeAssistantServicesUids(assistantUids); @@ -8885,7 +8891,7 @@ public class AudioManager { * @hide */ @SystemApi - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) public @NonNull int[] getAssistantServicesUids() { try { int[] uids = getService().getAssistantServicesUids(); @@ -8910,7 +8916,7 @@ public class AudioManager { * @hide */ @SystemApi - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) public void setActiveAssistantServiceUids(@NonNull int[] assistantUids) { try { getService().setActiveAssistantServiceUids(assistantUids); @@ -8928,7 +8934,7 @@ public class AudioManager { * @hide */ @SystemApi - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) public @NonNull int[] getActiveAssistantServicesUids() { try { int[] uids = getService().getActiveAssistantServiceUids(); @@ -9002,7 +9008,7 @@ public class AudioManager { * @see #getPreferredMixerAttributes(AudioAttributes, AudioDeviceInfo) * @see #clearPreferredMixerAttributes(AudioAttributes, AudioDeviceInfo) */ - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_SETTINGS) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_SETTINGS) public boolean setPreferredMixerAttributes(@NonNull AudioAttributes attributes, @NonNull AudioDeviceInfo device, @NonNull AudioMixerAttributes mixerAttributes) { @@ -9056,7 +9062,7 @@ public class AudioManager { * @see #setPreferredMixerAttributes(AudioAttributes, AudioDeviceInfo, AudioMixerAttributes) * @see #getPreferredMixerAttributes(AudioAttributes, AudioDeviceInfo) */ - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_SETTINGS) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_SETTINGS) public boolean clearPreferredMixerAttributes( @NonNull AudioAttributes attributes, @NonNull AudioDeviceInfo device) { @@ -9176,7 +9182,7 @@ public class AudioManager { * @hide */ @SystemApi - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) public boolean supportsBluetoothVariableLatency() { try { return getService().supportsBluetoothVariableLatency(); @@ -9193,7 +9199,7 @@ public class AudioManager { * @hide */ @SystemApi - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) public void setBluetoothVariableLatencyEnabled(boolean enabled) { try { getService().setBluetoothVariableLatencyEnabled(enabled); @@ -9207,7 +9213,7 @@ public class AudioManager { * @hide */ @SystemApi - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING) public boolean isBluetoothVariableLatencyEnabled() { try { return getService().isBluetoothVariableLatencyEnabled(); diff --git a/media/java/android/media/IAudioService.aidl b/media/java/android/media/IAudioService.aidl index 5ba7891065ab6..498378977e4b7 100644 --- a/media/java/android/media/IAudioService.aidl +++ b/media/java/android/media/IAudioService.aidl @@ -405,10 +405,11 @@ interface IAudioService { oneway void setRttEnabled(in boolean rttEnabled); - @EnforcePermission("MODIFY_AUDIO_ROUTING") + @EnforcePermission(anyOf = {"MODIFY_AUDIO_ROUTING", "MODIFY_AUDIO_SYSTEM_SETTINGS"}) void setDeviceVolumeBehavior(in AudioDeviceAttributes device, in int deviceVolumeBehavior, in String pkgName); + @EnforcePermission(anyOf = {"MODIFY_AUDIO_ROUTING", "QUERY_AUDIO_STATE", "MODIFY_AUDIO_SYSTEM_SETTINGS"}) int getDeviceVolumeBehavior(in AudioDeviceAttributes device); // WARNING: read warning at top of file, new methods that need to be used by native diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 92a9f464de811..9a07bb9a498f5 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -7006,20 +7006,21 @@ public class AudioService extends IAudioService.Stub } } - @android.annotation.EnforcePermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) /** * @see AudioManager#setDeviceVolumeBehavior(AudioDeviceAttributes, int) * @param device the audio device to be affected * @param deviceVolumeBehavior one of the device behaviors */ + @android.annotation.EnforcePermission(anyOf = + {"MODIFY_AUDIO_ROUTING", "MODIFY_AUDIO_SYSTEM_SETTINGS"}) public void setDeviceVolumeBehavior(@NonNull AudioDeviceAttributes device, @AudioManager.DeviceVolumeBehavior int deviceVolumeBehavior, @Nullable String pkgName) { // verify permissions - // verify arguments super.setDeviceVolumeBehavior_enforcePermission(); - + // verify arguments Objects.requireNonNull(device); AudioManager.enforceValidVolumeBehavior(deviceVolumeBehavior); + sVolumeLogger.enqueue(new EventLogger.StringEvent("setDeviceVolumeBehavior: dev:" + AudioSystem.getOutputDeviceName(device.getInternalType()) + " addr:" + device.getAddress() + " behavior:" @@ -7090,11 +7091,14 @@ public class AudioService extends IAudioService.Stub * @param device the audio output device type * @return the volume behavior for the device */ + @android.annotation.EnforcePermission(anyOf = + {"MODIFY_AUDIO_ROUTING", "QUERY_AUDIO_STATE", "MODIFY_AUDIO_SYSTEM_SETTINGS"}) public @AudioManager.DeviceVolumeBehavior int getDeviceVolumeBehavior(@NonNull AudioDeviceAttributes device) { - Objects.requireNonNull(device); // verify permissions - enforceQueryStateOrModifyRoutingPermission(); + super.getDeviceVolumeBehavior_enforcePermission(); + // verify parameters + Objects.requireNonNull(device); return getDeviceVolumeBehaviorInt(device); }