直到API级别20(Android L Preview)才能正常工作,针对任何API.但是,当使用最新的Android Lollipop构建LPX13D并定位到等级为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):at android.media.IAudioService $Stub $Proxy.startBluetoothSco(IAudioService.java:1587)
E / AndroidRuntime(31705):在android.media.AudioManager.startBluetoothSco(AudioManager.java:1468)
如果我在Android Lollipop上针对API级别17或以下,一切都可以按预期方式工作.
我相信问题的根源在于在AudioService.java行2392中的API级别21中发生的Android音频代码的更改:
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提交给Google,以增加它将被看到的机会:-)
解决方法
您可以先尝试检查蓝牙耳机连接:
mAudioManager.isWiredHeadsetOn()
正如doc所描述的那样,WiredHeadsetOn()(doc link)被删除,仅用于检查耳机是否连接.
之后可以使用startBluetoothSco()连接.至于我,我用这段代码:
这一个开始:
if(mAudioManager.isWiredHeadsetOn()) mAudioManager.startBluetoothSco();
这一个停止:
if(mAudioManager.isBluetoothScoOn()) mAudioManager.stopBluetoothSco();
希望它有帮助.