Когато правите повикване към AudioManager.startBluetoothSCO(), докато насочен към API ниво 18 или по-високо в манифеста, в документацията се посочва, че се установява необработена аудио връзка и ако се насочва към API 17 или по-ниско, се използва виртуално гласово повикване.
До API ниво 20 (Android L Preview) това работи добре, насочено към всеки API. Въпреки това, когато използвам най-новата компилация на Android Lollipop LPX13D и насочвам API ниво 18 или по-високо, получавам срив със следното трасиране на стека:
E/AndroidRuntime(31705): Причинено от: java.lang.NullPointerException: Опит за извикване на виртуален метод „java.lang.String android.bluetooth.BluetoothDevice.getAddress()“ на препратка към нулев обект E/AndroidRuntime(31705): при 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 във файла AudioService.java ред 2392:
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, за да увеличи шанса да бъде разгледан :-)