在清单中针对API级别18或更高级别调用AudioManager.startBluetoothSCO()时,文档指出建立了原始音频连接,并且如果针对API 17或更低级别的虚拟语音呼叫被使用。AudioManager.startBluetoothSco()在Android Lollipop上崩溃
直到API级别20(Android L预览版)为止,这个工作正常,目标是任何API。但是,如果使用最新的Android Lollipop版本LPX13D并且API等级为18或更高,我会遇到以下堆栈跟踪崩溃:
E/AndroidRuntime(31705):引起:java.lang.NullPointerException:尝试调用虚拟方法java.lang.String android.bluetooth.BluetoothDevice.getAddress()'null对象引用 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 $存根$ 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更好的解决方案吗?如果没有,你能不能请明星bug report我与谷歌申请增加的机会,这将在:-)
即使我没有得到崩溃,设备似乎也没有从蓝牙麦克风路由音频。 – 2015-02-25 23:39:16
我有同样的问题,麦克风不是路由,任何解决方案? – 2015-04-18 06:40:25