当在清单中针对API级别18或更高版本调用AudioManager.startBluetoothSCO()时,文档指出建立原始音频连接,而如果针对API 17或更低版本,则使用虚拟语音呼叫。在API级别20(Android L Preview)之前,无论目标API是什么,这都可以正常工作。然而,在使用最新的Android Lollipop版本LPX13D并针对API级别18或更高版本时,会出现以下堆栈跟踪的崩溃:
E/AndroidRuntime(31705): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.bluetooth.BluetoothDevice.getAddress()' on a null object reference E/AndroidRuntime(31705): at android.os.Parcel.readException(Parcel.java:1546) E/AndroidRuntime(31705): at android.os.Parcel.readException(Parcel.java:1493) E/AndroidRuntime(31705): at android.media.IAudioService$Stub$Proxy.startBluetoothSco(IAudioService.java:1587) E/AndroidRuntime(31705): at android.media.AudioManager.startBluetoothSco(AudioManager.java:1468)
如果在Android Lollipop上以API级别17或更低版本为目标,则一切正常。
似乎SCO_MODE_UNDEFINED应该改为SCO_MODE_RAW。如果您查看文件,可以看到在一些地方检查了SCO_MODE_RAW,但实际上没有传递任何内容。是否有其他人遇到此崩溃?有人知道比将目标SDK降级到17更好的解决方法吗?如果没有,请点亮我向Google提交的bug report,以增加它被关注的机会 :-)
E/AndroidRuntime(31705): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.bluetooth.BluetoothDevice.getAddress()' on a null object reference E/AndroidRuntime(31705): at android.os.Parcel.readException(Parcel.java:1546) E/AndroidRuntime(31705): at android.os.Parcel.readException(Parcel.java:1493) E/AndroidRuntime(31705): at android.media.IAudioService$Stub$Proxy.startBluetoothSco(IAudioService.java:1587) E/AndroidRuntime(31705): at android.media.AudioManager.startBluetoothSco(AudioManager.java:1468)
如果在Android Lollipop上以API级别17或更低版本为目标,则一切正常。
我认为问题的根源在于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提交的bug report,以增加它被关注的机会 :-)