AudioManager.startBluetoothSco()在Android Lollipop上崩溃

前端之家收集整理的这篇文章主要介绍了AudioManager.startBluetoothSco()在Android Lollipop上崩溃前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
当在清单中针对API级别18或更高版本的情况下拨打 AudioManager.startBluetoothSCO()时,该文档规定,建立原始音频连接,并且如果使用了虚拟语音呼叫的17或更低版​​本.

直到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,以增加它将被看到的机会:-)

解决方法

如果没有耳机连接,@xsveda会写,您将收到棒棒糖上的NPE.

您可以先尝试检查蓝牙耳机连接:

mAudioManager.isWiredHeadsetOn()

正如doc所描述的那样,WiredHeadsetOn()(doc link)被删除,仅用于检查耳机是否连接.

之后可以使用startBluetoothSco()连接.至于我,我用这段代码

这一个开始:

if(mAudioManager.isWiredHeadsetOn())
    mAudioManager.startBluetoothSco();

这一个停止:

if(mAudioManager.isBluetoothScoOn())
            mAudioManager.stopBluetoothSco();

希望它有帮助.

猜你在找的Android相关文章