diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index d3775ad..56d67bf 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -6669,7 +6669,7 @@
     method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public static java.util.List<android.media.audiopolicy.AudioVolumeGroup> 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<android.media.AudioDeviceAttributes> 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 @@
     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 3a6173c..ddd7939 100644
--- a/core/api/test-current.txt
+++ b/core/api/test-current.txt
@@ -1644,7 +1644,7 @@
     method @NonNull public java.util.Map<java.lang.Integer,java.lang.Boolean> 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 813929e..af515c2 100644
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -20,6 +20,7 @@
 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 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 @@
 
     /** @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 @@
      * @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 @@
      */
     @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 @@
      */
     @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 @@
      */
     @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 @@
      * @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 @@
      * @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 @@
      *
      * @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 @@
      * @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 @@
      *     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 @@
      *    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 @@
      * @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<AudioDeviceAttributes> devices) {
         Objects.requireNonNull(strategy);
@@ -1843,7 +1844,7 @@
      * @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<AudioDeviceAttributes> getPreferredDevicesForStrategy(
             @NonNull AudioProductStrategy strategy) {
@@ -1867,7 +1868,7 @@
      * @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 @@
      *     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 @@
      * @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<AudioDeviceAttributes> getNonDefaultDevicesForStrategy(
             @NonNull AudioProductStrategy strategy) {
@@ -1996,7 +1997,7 @@
      *             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 @@
      *             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 @@
      * @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 @@
      * @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 @@
      * @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 @@
      * @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 @@
      * @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 @@
      *     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 @@
      */
     @NonNull
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     public List<AudioDeviceAttributes> getPreferredDevicesForCapturePreset(
             @MediaRecorder.SystemSource int capturePreset) {
         if (!MediaRecorder.isValidAudioSource(capturePreset)) {
@@ -2315,7 +2316,7 @@
      * @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 @@
      * @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 @@
     /**
      * Start bluetooth SCO audio connection.
      * <p>Requires Permission:
-     *   {@link android.Manifest.permission#MODIFY_AUDIO_SETTINGS}.
+     *   {@link Manifest.permission#MODIFY_AUDIO_SETTINGS}.
      * <p>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.
      * <p>As the SCO connection establishment can take several seconds,
@@ -2842,7 +2843,7 @@
      * @hide
      * Start bluetooth SCO audio connection in virtual call mode.
      * <p>Requires Permission:
-     *   {@link android.Manifest.permission#MODIFY_AUDIO_SETTINGS}.
+     *   {@link Manifest.permission#MODIFY_AUDIO_SETTINGS}.
      * <p>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 @@
     /**
      * Stop bluetooth SCO audio connection.
      * <p>Requires Permission:
-     *   {@link android.Manifest.permission#MODIFY_AUDIO_SETTINGS}.
+     *   {@link Manifest.permission#MODIFY_AUDIO_SETTINGS}.
      * <p>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 @@
      * @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 @@
      * @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 @@
      * @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 @@
      * @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 @@
      * @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 @@
      * @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 @@
      * @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 @@
      */
     @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 @@
      * @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 @@
      * @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 @@
      * @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 @@
      * @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 @@
      * @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 @@
      * @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 @@
      */
     @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<AudioDeviceAttributes> getDevicesForAttributes(
             @NonNull AudioAttributes attributes) {
@@ -5929,8 +5930,8 @@
      */
     @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 @@
      */
     @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 @@
      * @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 @@
      */
     @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 @@
      */
     @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 @@
      * {@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 @@
      * {@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 @@
      * {@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 @@
      * {@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 @@
      *     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 @@
      * @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 @@
      * 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 @@
      * @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 @@
      * 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 @@
      * 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 @@
      * 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 @@
      * 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 @@
      *
      * @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 @@
      * @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 @@
      * 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 @@
      * 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 @@
      */
     @SystemApi
     @NonNull
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     public static List<AudioProductStrategy> getAudioProductStrategies() {
         final IAudioService service = getService();
         try {
@@ -7823,7 +7829,7 @@
      */
     @SystemApi
     @NonNull
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     public static List<AudioVolumeGroup> getAudioVolumeGroups() {
         final IAudioService service = getService();
         try {
@@ -8075,7 +8081,7 @@
 
     /** @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 @@
      * latest application having selected mode {@link #MODE_IN_COMMUNICATION} or mode
      * {@link #MODE_IN_CALL}. Note that <code>MODE_IN_CALL</code> can only be selected by the main
      * telephony application with permission
-     * {@link android.Manifest.permission#MODIFY_PHONE_STATE}.
+     * {@link Manifest.permission#MODIFY_PHONE_STATE}.
      * <p> If the requested devices is not currently available, the request will be rejected and
      * the method will return false.
      * <p>This API replaces the following deprecated APIs:
@@ -8386,7 +8392,7 @@
      */
     @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 @@
      */
     @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 @@
      */
     @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 @@
      * @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 @@
      *        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 @@
      *         {@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 @@
      * @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 @@
      * @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 @@
      * @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 @@
      * @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 @@
      * @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 @@
      * @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 @@
      * @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 @@
      * @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 @@
      * @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 @@
      * @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 @@
      * @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 @@
      * @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 5ba7891..4983789 100644
--- a/media/java/android/media/IAudioService.aidl
+++ b/media/java/android/media/IAudioService.aidl
@@ -405,10 +405,11 @@
 
     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 92a9f46..9a07bb9 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 @@
         }
     }
 
-    @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 @@
      * @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);
     }
