Jul*_*ino 11 android bluetooth android-5.0-lollipop
当在Manifest中针对API级别18或更高级别调用AudioManager.startBluetoothSCO()时,文档指出已建立原始音频连接,并且如果使用目标API 17或以下虚拟语音呼叫.
直到API级别20(Android L预览版),这个工作正常,针对任何API.但是,当使用最新的Android Lollipop构建LPX13D并且目标API级别为18或更高时,我会遇到以下堆栈跟踪崩溃:
E/AndroidRuntime(31705):引起:java.lang.NullPointerException:尝试在空对象引用E/AndroidRuntime(31705)上调用虚方法'java.lang.String android.bluetooth.BluetoothDevice.getAddress()':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):at android.media.AudioManager.startBluetoothSco(AudioManager.java:1468)
如果我在Android Lollipop上以API级别17或更低级别为目标,一切都按预期工作.
我相信问题的根源在于改变Android的音频代码,该代码发生在文件AudioService.java第2392行的API级别21中:
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);
}
Run Code Online (Sandbox Code Playgroud)
看起来SCO_MODE_UNDEFINED应该是SCO_MODE_RAW.如果查看该文件,您可以看到在几个地方检查了SCO_MODE_RAW,但实际上从未在任何地方传递过.
还有其他人遇到这次崩溃吗?有没有人知道比将目标SDK降级到17更好的解决方案?如果没有,你能不能把我向谷歌提交的错误报告加注,以增加它被查看的可能性:-)
经过几天的绝望,我找到了一个简单的解决方法:
startBluetoothSco()仅当没有连接蓝牙设备时才会抛出 NPE,因此可以捕获并忽略它,因为“没有人可以交谈”。如果连接了 BT 耳机,则 SCO 启动成功并且可以播放!