diff options
author | Eric Laurent <elaurent@google.com> | 2024-03-15 15:53:10 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2024-03-15 21:28:00 +0000 |
commit | dc0ca0658731d0b2e59e5667ae4d0d6cb69c4230 (patch) | |
tree | 91ef6dd7ccb8aa878fd5cf21f70e95ebe3b5ac85 | |
parent | 6bb2a930d76b55a2d3ca26a88724f6d30c016396 (diff) | |
download | base-dc0ca0658731d0b2e59e5667ae4d0d6cb69c4230.tar.gz |
Revert "AudioService: anonymize Bluetooth MAC addresses"
Revert submission 25286114-anon_bt_address_sc_dev
Reason for revert: b/329515274
Reverted changes: /q/submissionid:25286114-anon_bt_address_sc_dev
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:9915df580bb82aab22529905fdfa29ebf075bf1f)
Merged-In: Icd29d064dda03923637b362bb62eeaf2eeebcec2
Change-Id: Icd29d064dda03923637b362bb62eeaf2eeebcec2
5 files changed, 37 insertions, 244 deletions
diff --git a/media/java/android/media/AudioDeviceAttributes.java b/media/java/android/media/AudioDeviceAttributes.java index 5341e7e5adc0..7caac899a603 100644 --- a/media/java/android/media/AudioDeviceAttributes.java +++ b/media/java/android/media/AudioDeviceAttributes.java @@ -64,7 +64,8 @@ public final class AudioDeviceAttributes implements Parcelable { /** * The unique address of the device. Some devices don't have addresses, only an empty string. */ - private @NonNull String mAddress; + private final @NonNull String mAddress; + /** * Is input or output device */ @@ -134,18 +135,6 @@ public final class AudioDeviceAttributes implements Parcelable { /** * @hide - * Copy Constructor. - * @param ada the copied AudioDeviceAttributes - */ - public AudioDeviceAttributes(AudioDeviceAttributes ada) { - mRole = ada.getRole(); - mType = ada.getType(); - mAddress = ada.getAddress(); - mNativeType = ada.getInternalType(); - } - - /** - * @hide * Returns the role of a device * @return the role */ @@ -176,15 +165,6 @@ public final class AudioDeviceAttributes implements Parcelable { /** * @hide - * Sets the device address. Only used by audio service. - */ - public void setAddress(@NonNull String address) { - Objects.requireNonNull(address); - mAddress = address; - } - - /** - * @hide * Returns the internal device type of a device * @return the internal device type */ diff --git a/services/core/java/com/android/server/audio/AdiDeviceState.java b/services/core/java/com/android/server/audio/AdiDeviceState.java index eab1eca90f6c..a27daf65b9f9 100644 --- a/services/core/java/com/android/server/audio/AdiDeviceState.java +++ b/services/core/java/com/android/server/audio/AdiDeviceState.java @@ -25,7 +25,6 @@ import android.media.AudioDeviceAttributes; import android.media.AudioDeviceInfo; import android.text.TextUtils; import android.util.Log; -import android.util.Pair; import java.util.Objects; @@ -44,8 +43,6 @@ import java.util.Objects; private final int mInternalDeviceType; @NonNull private final String mDeviceAddress; - /** Unique device id from internal device type and address. */ - private final Pair<Integer, String> mDeviceId; private boolean mSAEnabled; private boolean mHasHeadTracker = false; private boolean mHeadTrackerEnabled; @@ -71,11 +68,6 @@ import java.util.Objects; } mDeviceAddress = isBluetoothDevice(mInternalDeviceType) ? Objects.requireNonNull( address) : ""; - mDeviceId = new Pair<>(mInternalDeviceType, mDeviceAddress); - } - - public Pair<Integer, String> getDeviceId() { - return mDeviceId; } @@ -148,8 +140,7 @@ import java.util.Objects; @Override public String toString() { - return "type: " + mDeviceType - + " internal type: 0x" + Integer.toHexString(mInternalDeviceType) + return "type: " + mDeviceType + "internal type: " + mInternalDeviceType + " addr: " + mDeviceAddress + " enabled: " + mSAEnabled + " HT: " + mHasHeadTracker + " HTenabled: " + mHeadTrackerEnabled; } diff --git a/services/core/java/com/android/server/audio/AudioDeviceBroker.java b/services/core/java/com/android/server/audio/AudioDeviceBroker.java index 12b4914a3a13..ec439a85b186 100644 --- a/services/core/java/com/android/server/audio/AudioDeviceBroker.java +++ b/services/core/java/com/android/server/audio/AudioDeviceBroker.java @@ -746,8 +746,8 @@ public class AudioDeviceBroker { } /*package*/ void registerStrategyPreferredDevicesDispatcher( - @NonNull IStrategyPreferredDevicesDispatcher dispatcher, boolean isPrivileged) { - mDeviceInventory.registerStrategyPreferredDevicesDispatcher(dispatcher, isPrivileged); + @NonNull IStrategyPreferredDevicesDispatcher dispatcher) { + mDeviceInventory.registerStrategyPreferredDevicesDispatcher(dispatcher); } /*package*/ void unregisterStrategyPreferredDevicesDispatcher( @@ -765,8 +765,8 @@ public class AudioDeviceBroker { } /*package*/ void registerCapturePresetDevicesRoleDispatcher( - @NonNull ICapturePresetDevicesRoleDispatcher dispatcher, boolean isPrivileged) { - mDeviceInventory.registerCapturePresetDevicesRoleDispatcher(dispatcher, isPrivileged); + @NonNull ICapturePresetDevicesRoleDispatcher dispatcher) { + mDeviceInventory.registerCapturePresetDevicesRoleDispatcher(dispatcher); } /*package*/ void unregisterCapturePresetDevicesRoleDispatcher( @@ -774,11 +774,6 @@ public class AudioDeviceBroker { mDeviceInventory.unregisterCapturePresetDevicesRoleDispatcher(dispatcher); } - /* package */ List<AudioDeviceAttributes> anonymizeAudioDeviceAttributesListUnchecked( - List<AudioDeviceAttributes> devices) { - return mAudioService.anonymizeAudioDeviceAttributesListUnchecked(devices); - } - /*package*/ void registerCommunicationDeviceDispatcher( @NonNull ICommunicationDeviceDispatcher dispatcher) { mCommDevDispatchers.register(dispatcher); diff --git a/services/core/java/com/android/server/audio/AudioDeviceInventory.java b/services/core/java/com/android/server/audio/AudioDeviceInventory.java index 1c20b5d91b32..0e4c4c6ccb6f 100644 --- a/services/core/java/com/android/server/audio/AudioDeviceInventory.java +++ b/services/core/java/com/android/server/audio/AudioDeviceInventory.java @@ -42,7 +42,6 @@ import android.text.TextUtils; import android.util.ArrayMap; import android.util.ArraySet; import android.util.Log; -import android.util.Pair; import android.util.Slog; import com.android.internal.annotations.GuardedBy; @@ -50,9 +49,7 @@ import com.android.internal.annotations.VisibleForTesting; import java.io.PrintWriter; import java.util.ArrayList; -import java.util.HashMap; import java.util.HashSet; -import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Set; @@ -77,49 +74,31 @@ public class AudioDeviceInventory { private final Object mDeviceInventoryLock = new Object(); @GuardedBy("mDeviceInventoryLock") - private final HashMap<Pair<Integer, String>, AdiDeviceState> mDeviceInventory = new HashMap<>(); + private final ArrayList<AdiDeviceState> mDeviceInventory = new ArrayList<>(0); + List<AdiDeviceState> getImmutableDeviceInventory() { synchronized (mDeviceInventoryLock) { - return new ArrayList<AdiDeviceState>(mDeviceInventory.values()); + return List.copyOf(mDeviceInventory); } } void addDeviceStateToInventory(AdiDeviceState deviceState) { synchronized (mDeviceInventoryLock) { - mDeviceInventory.put(deviceState.getDeviceId(), deviceState); - } - } - - /** - * Adds a new entry in mDeviceInventory if the AudioDeviceAttributes passed is an sink - * Bluetooth device and no corresponding entry already exists. - * @param ada the device to add if needed - */ - void addAudioDeviceInInventoryIfNeeded(AudioDeviceAttributes ada) { - if (!AudioSystem.isBluetoothOutDevice(ada.getInternalType())) { - return; - } - synchronized (mDeviceInventoryLock) { - if (findDeviceStateForAudioDeviceAttributes(ada, ada.getType()) != null) { - return; - } - AdiDeviceState ads = new AdiDeviceState( - ada.getType(), ada.getInternalType(), ada.getAddress()); - mDeviceInventory.put(ads.getDeviceId(), ads); + mDeviceInventory.add(deviceState); } - mDeviceBroker.persistAudioDeviceSettings(); } AdiDeviceState findDeviceStateForAudioDeviceAttributes(AudioDeviceAttributes ada, int canonicalDeviceType) { final boolean isWireless = isBluetoothDevice(ada.getInternalType()); + synchronized (mDeviceInventoryLock) { - for (AdiDeviceState deviceState : mDeviceInventory.values()) { - if (deviceState.getDeviceType() == canonicalDeviceType + for (AdiDeviceState deviceSetting : mDeviceInventory) { + if (deviceSetting.getDeviceType() == canonicalDeviceType && (!isWireless || ada.getAddress().equals( - deviceState.getDeviceAddress()))) { - return deviceState; + deviceSetting.getDeviceAddress()))) { + return deviceSetting; } } } @@ -320,7 +299,7 @@ public class AudioDeviceInventory { + " devices:" + devices); }); pw.println("\ndevices:\n"); synchronized (mDeviceInventoryLock) { - for (AdiDeviceState device : mDeviceInventory.values()) { + for (AdiDeviceState device : mDeviceInventory) { pw.println("\t" + device + "\n"); } } @@ -749,8 +728,8 @@ public class AudioDeviceInventory { } /*package*/ void registerStrategyPreferredDevicesDispatcher( - @NonNull IStrategyPreferredDevicesDispatcher dispatcher, boolean isPrivileged) { - mPrefDevDispatchers.register(dispatcher, isPrivileged); + @NonNull IStrategyPreferredDevicesDispatcher dispatcher) { + mPrefDevDispatchers.register(dispatcher); } /*package*/ void unregisterStrategyPreferredDevicesDispatcher( @@ -784,8 +763,8 @@ public class AudioDeviceInventory { } /*package*/ void registerCapturePresetDevicesRoleDispatcher( - @NonNull ICapturePresetDevicesRoleDispatcher dispatcher, boolean isPrivileged) { - mDevRoleCapturePresetDispatchers.register(dispatcher, isPrivileged); + @NonNull ICapturePresetDevicesRoleDispatcher dispatcher) { + mDevRoleCapturePresetDispatchers.register(dispatcher); } /*package*/ void unregisterCapturePresetDevicesRoleDispatcher( @@ -840,7 +819,6 @@ public class AudioDeviceInventory { mConnectedDevices.put(deviceKey, new DeviceInfo( device, deviceName, address, AudioSystem.AUDIO_FORMAT_DEFAULT)); mDeviceBroker.postAccessoryPlugMediaUnmute(device); - addAudioDeviceInInventoryIfNeeded(new AudioDeviceAttributes(device, address)); mmi.set(MediaMetrics.Property.STATE, MediaMetrics.Value.CONNECTED).record(); return true; } else if (!connect && isConnected) { @@ -1059,11 +1037,8 @@ public class AudioDeviceInventory { mDeviceBroker.postAccessoryPlugMediaUnmute(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP); setCurrentAudioRouteNameIfPossible(name, true /*fromA2dp*/); - addAudioDeviceInInventoryIfNeeded(new AudioDeviceAttributes( - AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, address)); } - @GuardedBy("mDevicesLock") private void makeA2dpDeviceUnavailableNow(String address, int a2dpCodec) { MediaMetrics.Item mmi = new MediaMetrics.Item(mMetricsId + "a2dp." + address) @@ -1166,8 +1141,6 @@ public class AudioDeviceInventory { mDeviceBroker.postApplyVolumeOnDevice(streamType, AudioSystem.DEVICE_OUT_HEARING_AID, "makeHearingAidDeviceAvailable"); setCurrentAudioRouteNameIfPossible(name, false /*fromA2dp*/); - addAudioDeviceInInventoryIfNeeded(new AudioDeviceAttributes( - AudioSystem.DEVICE_OUT_HEARING_AID, address)); new MediaMetrics.Item(mMetricsId + "makeHearingAidDeviceAvailable") .set(MediaMetrics.Property.ADDRESS, address != null ? address : "") .set(MediaMetrics.Property.DEVICE, @@ -1449,9 +1422,6 @@ public class AudioDeviceInventory { final int nbDispatchers = mPrefDevDispatchers.beginBroadcast(); for (int i = 0; i < nbDispatchers; i++) { try { - if (!((Boolean) mPrefDevDispatchers.getBroadcastCookie(i))) { - devices = mDeviceBroker.anonymizeAudioDeviceAttributesListUnchecked(devices); - } mPrefDevDispatchers.getBroadcastItem(i).dispatchPrefDevicesChanged( strategy, devices); } catch (RemoteException e) { @@ -1465,9 +1435,6 @@ public class AudioDeviceInventory { final int nbDispatchers = mDevRoleCapturePresetDispatchers.beginBroadcast(); for (int i = 0; i < nbDispatchers; ++i) { try { - if (!((Boolean) mDevRoleCapturePresetDispatchers.getBroadcastCookie(i))) { - devices = mDeviceBroker.anonymizeAudioDeviceAttributesListUnchecked(devices); - } mDevRoleCapturePresetDispatchers.getBroadcastItem(i).dispatchDevicesRoleChanged( capturePreset, role, devices); } catch (RemoteException e) { @@ -1480,20 +1447,19 @@ public class AudioDeviceInventory { int deviceCatalogSize = 0; synchronized (mDeviceInventoryLock) { deviceCatalogSize = mDeviceInventory.size(); - - final StringBuilder settingsBuilder = new StringBuilder( + } + final StringBuilder settingsBuilder = new StringBuilder( deviceCatalogSize * AdiDeviceState.getPeristedMaxSize()); - Iterator<AdiDeviceState> iterator = mDeviceInventory.values().iterator(); - if (iterator.hasNext()) { - settingsBuilder.append(iterator.next().toPersistableString()); - } - while (iterator.hasNext()) { - settingsBuilder.append(SETTING_DEVICE_SEPARATOR_CHAR); - settingsBuilder.append(iterator.next().toPersistableString()); + synchronized (mDeviceInventoryLock) { + for (int i = 0; i < mDeviceInventory.size(); i++) { + settingsBuilder.append(mDeviceInventory.get(i).toPersistableString()); + if (i != mDeviceInventory.size() - 1) { + settingsBuilder.append(SETTING_DEVICE_SEPARATOR_CHAR); + } } - return settingsBuilder.toString(); } + return settingsBuilder.toString(); } /*package*/ void setDeviceSettings(String settings) { diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index f737a572051d..34e2578f7855 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -2368,11 +2368,8 @@ public class AudioService extends IAudioService.Stub return AudioSystem.ERROR; } enforceModifyAudioRoutingPermission(); - - devices = retrieveBluetoothAddresses(devices); - final String logString = String.format( - "setPreferredDevicesForStrategy u/pid:%d/%d strat:%d dev:%s", + "setPreferredDeviceForStrategy u/pid:%d/%d strat:%d dev:%s", Binder.getCallingUid(), Binder.getCallingPid(), strategy, devices.stream().map(e -> e.toString()).collect(Collectors.joining(","))); sDeviceLogger.log(new AudioEventLogger.StringEvent(logString).printLog(TAG)); @@ -2420,7 +2417,7 @@ public class AudioService extends IAudioService.Stub status, strategy)); return new ArrayList<AudioDeviceAttributes>(); } else { - return anonymizeAudioDeviceAttributesList(devices); + return devices; } } @@ -2433,8 +2430,7 @@ public class AudioService extends IAudioService.Stub return; } enforceModifyAudioRoutingPermission(); - mDeviceBroker.registerStrategyPreferredDevicesDispatcher( - dispatcher, isBluetoothPrividged()); + mDeviceBroker.registerStrategyPreferredDevicesDispatcher(dispatcher); } /** @see AudioManager#removeOnPreferredDevicesForStrategyChangedListener( @@ -2450,7 +2446,7 @@ public class AudioService extends IAudioService.Stub } /** - * @see AudioManager#setPreferredDevicesForCapturePreset(int, AudioDeviceAttributes) + * @see AudioManager#setPreferredDeviceForCapturePreset(int, AudioDeviceAttributes) */ public int setPreferredDevicesForCapturePreset( int capturePreset, List<AudioDeviceAttributes> devices) { @@ -2469,8 +2465,6 @@ public class AudioService extends IAudioService.Stub return AudioSystem.ERROR; } - devices = retrieveBluetoothAddresses(devices); - final int status = mDeviceBroker.setPreferredDevicesForCapturePresetSync( capturePreset, devices); if (status != AudioSystem.SUCCESS) { @@ -2509,7 +2503,7 @@ public class AudioService extends IAudioService.Stub status, capturePreset)); return new ArrayList<AudioDeviceAttributes>(); } else { - return anonymizeAudioDeviceAttributesList(devices); + return devices; } } @@ -2523,8 +2517,7 @@ public class AudioService extends IAudioService.Stub return; } enforceModifyAudioRoutingPermission(); - mDeviceBroker.registerCapturePresetDevicesRoleDispatcher( - dispatcher, isBluetoothPrividged()); + mDeviceBroker.registerCapturePresetDevicesRoleDispatcher(dispatcher); } /** @@ -2544,8 +2537,7 @@ public class AudioService extends IAudioService.Stub public @NonNull ArrayList<AudioDeviceAttributes> getDevicesForAttributes( @NonNull AudioAttributes attributes) { enforceQueryStateOrModifyRoutingPermission(); - return new ArrayList<AudioDeviceAttributes>(anonymizeAudioDeviceAttributesList( - getDevicesForAttributesInt(attributes))); + return getDevicesForAttributesInt(attributes); } /** @@ -6117,9 +6109,6 @@ public class AudioService extends IAudioService.Stub // verify arguments Objects.requireNonNull(device); AudioManager.enforceValidVolumeBehavior(deviceVolumeBehavior); - - device = retrieveBluetoothAddress(device); - if (pkgName == null) { pkgName = ""; } @@ -6172,8 +6161,6 @@ public class AudioService extends IAudioService.Stub // verify permissions enforceQueryStateOrModifyRoutingPermission(); - device = retrieveBluetoothAddress(device); - // translate Java device type to native device type (for the devices masks for full / fixed) final int audioSystemDeviceOut = AudioDeviceInfo.convertDeviceTypeToInternalDevice( device.getType()); @@ -6222,9 +6209,6 @@ public class AudioService extends IAudioService.Stub @ConnectionState int state, String address, String name, String caller) { enforceModifyAudioRoutingPermission(); - - address = retrieveBluetoothAddress(type, address); - if (state != CONNECTION_STATE_CONNECTED && state != CONNECTION_STATE_DISCONNECTED) { throw new IllegalArgumentException("Invalid state " + state); @@ -8244,120 +8228,6 @@ public class AudioService extends IAudioService.Stub } //========================================================================================== - - private boolean isBluetoothPrividged() { - return PackageManager.PERMISSION_GRANTED == mContext.checkCallingOrSelfPermission( - android.Manifest.permission.BLUETOOTH_CONNECT) - || Binder.getCallingUid() == Process.SYSTEM_UID; - } - - List<AudioDeviceAttributes> retrieveBluetoothAddresses(List<AudioDeviceAttributes> devices) { - if (isBluetoothPrividged()) { - return devices; - } - - List<AudioDeviceAttributes> checkedDevices = new ArrayList<AudioDeviceAttributes>(); - for (AudioDeviceAttributes ada : devices) { - if (ada == null) { - continue; - } - checkedDevices.add(retrieveBluetoothAddressUncheked(ada)); - } - return checkedDevices; - } - - AudioDeviceAttributes retrieveBluetoothAddress(@NonNull AudioDeviceAttributes ada) { - if (isBluetoothPrividged()) { - return ada; - } - return retrieveBluetoothAddressUncheked(ada); - } - - AudioDeviceAttributes retrieveBluetoothAddressUncheked(@NonNull AudioDeviceAttributes ada) { - Objects.requireNonNull(ada); - if (AudioSystem.isBluetoothDevice(ada.getInternalType())) { - String anonymizedAddress = anonymizeBluetoothAddress(ada.getAddress()); - for (AdiDeviceState ads : mDeviceBroker.getImmutableDeviceInventory()) { - if (!(AudioSystem.isBluetoothDevice(ads.getInternalDeviceType()) - && (ada.getInternalType() == ads.getInternalDeviceType()) - && anonymizedAddress.equals(anonymizeBluetoothAddress( - ads.getDeviceAddress())))) { - continue; - } - ada.setAddress(ads.getDeviceAddress()); - break; - } - } - return ada; - } - - private String retrieveBluetoothAddress(int type, String address) { - if (isBluetoothPrividged() || !AudioSystem.isBluetoothDevice(type) - || address == null) { - return address; - } - String anonymizedAddress = anonymizeBluetoothAddress(address); - for (AdiDeviceState ads : mDeviceBroker.getImmutableDeviceInventory()) { - if (!(AudioSystem.isBluetoothDevice(ads.getInternalDeviceType()) - && anonymizedAddress.equals(anonymizeBluetoothAddress( - ads.getDeviceAddress())))) { - continue; - } - return ads.getDeviceAddress(); - } - return address; - } - - /** - * Convert a Bluetooth MAC address to an anonymized one when exposed to a non privileged app - * Must match the implementation of BluetoothUtils.toAnonymizedAddress() - * @param address Mac address to be anonymized - * @return anonymized mac address - */ - static String anonymizeBluetoothAddress(String address) { - if (address == null || address.length() != "AA:BB:CC:DD:EE:FF".length()) { - return null; - } - return "XX:XX:XX:XX" + address.substring("XX:XX:XX:XX".length()); - } - - private List<AudioDeviceAttributes> anonymizeAudioDeviceAttributesList( - List<AudioDeviceAttributes> devices) { - if (isBluetoothPrividged()) { - return devices; - } - return anonymizeAudioDeviceAttributesListUnchecked(devices); - } - - /* package */ List<AudioDeviceAttributes> anonymizeAudioDeviceAttributesListUnchecked( - List<AudioDeviceAttributes> devices) { - List<AudioDeviceAttributes> anonymizedDevices = new ArrayList<AudioDeviceAttributes>(); - for (AudioDeviceAttributes ada : devices) { - anonymizedDevices.add(anonymizeAudioDeviceAttributesUnchecked(ada)); - } - return anonymizedDevices; - } - - private AudioDeviceAttributes anonymizeAudioDeviceAttributesUnchecked( - AudioDeviceAttributes ada) { - if (!AudioSystem.isBluetoothDevice(ada.getInternalType())) { - return ada; - } - AudioDeviceAttributes res = new AudioDeviceAttributes(ada); - res.setAddress(anonymizeBluetoothAddress(ada.getAddress())); - return res; - } - - private AudioDeviceAttributes anonymizeAudioDeviceAttributes(AudioDeviceAttributes ada) { - if (isBluetoothPrividged()) { - return ada; - } - - return anonymizeAudioDeviceAttributesUnchecked(ada); - } - - //========================================================================================== - private boolean readCameraSoundForced() { return SystemProperties.getBoolean("audio.camerasound.force", false) || mContext.getResources().getBoolean( @@ -10475,9 +10345,6 @@ public class AudioService extends IAudioService.Stub @NonNull AudioDeviceAttributes device, @IntRange(from = 0) long delayMillis) { Objects.requireNonNull(device, "device must not be null"); enforceModifyAudioRoutingPermission(); - - device = retrieveBluetoothAddress(device); - final String getterKey = "additional_output_device_delay=" + device.getInternalType() + "," + device.getAddress(); // "getter" key as an id. final String setterKey = getterKey + "," + delayMillis; // append the delay for setter @@ -10498,9 +10365,6 @@ public class AudioService extends IAudioService.Stub @IntRange(from = 0) public long getAdditionalOutputDeviceDelay(@NonNull AudioDeviceAttributes device) { Objects.requireNonNull(device, "device must not be null"); - - device = retrieveBluetoothAddress(device); - final String key = "additional_output_device_delay"; final String reply = AudioSystem.getParameters( key + "=" + device.getInternalType() + "," + device.getAddress()); @@ -10528,9 +10392,6 @@ public class AudioService extends IAudioService.Stub @IntRange(from = 0) public long getMaxAdditionalOutputDeviceDelay(@NonNull AudioDeviceAttributes device) { Objects.requireNonNull(device, "device must not be null"); - - device = retrieveBluetoothAddress(device); - final String key = "max_additional_output_device_delay"; final String reply = AudioSystem.getParameters( key + "=" + device.getInternalType() + "," + device.getAddress()); |