При вызове AudioManager.startBluetoothSCO() во время при таргетинге на уровень API 18 или выше в манифесте в документации указано, что устанавливается необработанное аудиосоединение, а при таргетинге на API 17 или ниже используется виртуальный голосовой вызов.
До уровня API 20 (предварительная версия Android L) это работало нормально, ориентируясь на любой API. Однако при использовании последней сборки Android Lollipop LPX13D и нацеливании на уровень API 18 или выше я получаю сбой со следующей трассировкой стека:
E/AndroidRuntime(31705): причина: java.lang.NullPointerException: попытка вызвать виртуальный метод java.lang.String android.bluetooth.BluetoothDevice.getAddress() для нулевой ссылки на объект E/AndroidRuntime(31705): at android.os.Parcel.readException(Parcel.java:1546) E/AndroidRuntime(31705): в android.os.Parcel.readException(Parcel.java:1493) E/AndroidRuntime(31705): в android.media.IAudioService$ Stub$Proxy.startBluetoothSco(IAudioService.java:1587) E/AndroidRuntime(31705): в android.media.AudioManager.startBluetoothSco(AudioManager.java:1468)
Если я нацеливаюсь на уровень API 17 или ниже на Android Lollipop, все работает, как и ожидалось.
Я считаю, что источник проблемы заключается в изменении аудиокода Android, которое произошло на уровне API 21 в строке 2392 файла AudioService.java:
public void startBluetoothSco(IBinder cb, int targetSdkVersion) {
int scoAudioMode =
(targetSdkVersion < Build.VERSION_CODES.JELLY_BEAN_MR2) ?
SCO_MODE_VIRTUAL_CALL : SCO_MODE_UNDEFINED;
startBluetoothScoInt(cb, scoAudioMode);
}
Похоже, что SCO_MODE_UNDEFINED вместо этого должен быть SCO_MODE_RAW. Если вы просмотрите файл, вы увидите, что SCO_MODE_RAW проверяется в нескольких местах, но фактически нигде не передается.
Кто-нибудь еще испытывает этот сбой? Кто-нибудь знает лучшее решение, чем понижение целевого SDK до 17? Если нет, не могли бы вы пометить отчет об ошибке, который я отправил Google, чтобы увеличить вероятность того, что это будет просмотрено :-)