uni-app 【报Bug】5+ plus.audio.createPlayer 远程地址不能播放,所有事件监听不起作用

uni-app 【报Bug】5+ plus.audio.createPlayer 远程地址不能播放,所有事件监听不起作用

产品分类:

HTML5+

HBuilderX版本号:

3.2.16

手机系统:

Android

手机系统版本号:

Android 9.0

手机厂商:

小米

手机机型:

mi6x

打包方式:

云端

示例代码:

//语音类型点击播放  
Dom_minirefreshScroll.on('tap', 'li[data-type="audio"]', function(e) {  
    var $this = $(this),  
        dataParam = JSON.parse($this.attr('data-param')),  
        dataSend = dataParam.send,  
        dataUrl = dataParam.url,  
        tingtong = plus.storage.getItem('$tingtong'),  
        srcPath = '',  
        // player = plus.audio.createPlayer('_doc/audios/2021_11_30_17_58_32_60_4.mp3'),  
        player = plus.audio.createPlayer(win.apiUrl + dataParam.url),  
        playing = $this.attr('playing'),  
        //恢复 语音 图片样式  
        restoreIconStyle = function() {  
            if ($this.hasClass('self')) {  
                srcPath = '../../images/icon-yuyin-right.png'  
            }  
            if ($this.hasClass('others')) {  
                srcPath = '../../images/icon-yuyin-left.png'  
            }  
            $this.find('.content img').attr('src', srcPath);  
        },  
        //加载中  
        waiting = function() {  
            console.log('加载中');  
            plus.nativeUI.showWaiting('加载中...')  
        },  
        //可以播放  
        canplay = function() {  
            console.log('可以播放');  
            if (playing && playing === 'true') {  
                console.log('点击暂停播放')  
                player.stop()  
            } else {  
                if ($this.hasClass('self')) {  
                    srcPath = '../../images/icon-yuyin-right.gif'  
                }  
                if ($this.hasClass('others')) {  
                    srcPath = '../../images/icon-yuyin-left.gif'  
                }  
                $this.find('.content img').attr('src', srcPath);  
                if (tingtong === 'on') {  
                    mui.toast('听筒模式,请贴近手机倾听!', {  
                        duration: 'short',  
                        type: 'div'  
                    })  
                } else {  
                    mui.toast('扬声器模式!', {  
                        duration: 'short',  
                        type: 'div'  
                    })  
                }  
                player.play();  
                $this.attr('playing', 'true')  
            }  
        },  
        //停止播放  
        stop = function() {  
            console.log('播放音频 停止');  
            $this.attr('playing', 'false');  
            restoreIconStyle()  
        },  
        //播放完成  
        ended = function() {  
            console.log('播放音频完成!');  
            $this.attr('playing', 'false');  
            restoreIconStyle()  
        };  
    // console.log('dataUrl', dataUrl)  
    // console.log('dataSend', dataSend)  
    // console.log('dataParam', JSON.stringify(dataParam))  
    console.log($this.attr('position'))  
    //设置 听筒 和 扬声器 模式  
    player.setRoute(tingtong === 'on' ? plus.audio.ROUTE_EARPIECE : plus.audio.ROUTE_SPEAKER);  
    //音频加载中事件  
    player.addEventListener('waiting', waiting);  
    player.addEventListener('canplay', canplay);  
    player.addEventListener('stop', stop);  
    player.addEventListener('ended', ended);  

    // console.log(player.play())  
    // player.play()  

    // player.play(function() {});  
    // startPlayMp3(win.apiUrl + dataParam.url, $tingtong)  
});

操作步骤:

//语音类型点击播放  
Dom_minirefreshScroll.on('tap', 'li[data-type="audio"]', function(e) {  
    var $this = $(this),  
        dataParam = JSON.parse($this.attr('data-param')),  
        dataSend = dataParam.send,  
        dataUrl = dataParam.url,  
        tingtong = plus.storage.getItem('$tingtong'),  
        srcPath = '',  
        // player = plus.audio.createPlayer('_doc/audios/2021_11_30_17_58_32_60_4.mp3'),  
        player = plus.audio.createPlayer(win.apiUrl + dataParam.url),  
        playing = $this.attr('playing'),  
        //恢复 语音 图片样式  
        restoreIconStyle = function() {  
            if ($this.hasClass('self')) {  
                srcPath = '../../images/icon-yuyin-right.png'  
            }  
            if ($this.hasClass('others')) {  
                srcPath = '../../images/icon-yuyin-left.png'  
            }  
            $this.find('.content img').attr('src', srcPath);  
        },  
        //加载中  
        waiting = function() {  
            console.log('加载中');  
            plus.nativeUI.showWaiting('加载中...')  
        },  
        //可以播放  
        canplay = function() {  
            console.log('可以播放');  
            if (playing && playing === 'true') {  
                console.log('点击暂停播放')  
                player.stop()  
            } else {  
                if ($this.hasClass('self')) {  
                    srcPath = '../../images/icon-yuyin-right.gif'  
                }  
                if ($this.hasClass('others')) {  
                    srcPath = '../../images/icon-yuyin-left.gif'  
                }  
                $this.find('.content img').attr('src', srcPath);  
                if (tingtong === 'on') {  
                    mui.toast('听筒模式,请贴近手机倾听!', {  
                        duration: 'short',  
                        type: 'div'  
                    })  
                } else {  
                    mui.toast('扬声器模式!', {  
                        duration: 'short',  
                        type: 'div'  
                    })  
                }  
                player.play();  
                $this.attr('playing', 'true')  
            }  
        },  
        //停止播放  
        stop = function() {  
            console.log('播放音频 停止');  
            $this.attr('playing', 'false');  
            restoreIconStyle()  
        },  
        //播放完成  
        ended = function() {  
            console.log('播放音频完成!');  
            $this.attr('playing', 'false');  
            restoreIconStyle()  
        };  
    // console.log('dataUrl', dataUrl)  
    // console.log('dataSend', dataSend)  
    // console.log('dataParam', JSON.stringify(dataParam))  
    console.log($this.attr('position'))  
    //设置 听筒 和 扬声器 模式  
    player.setRoute(tingtong === 'on' ? plus.audio.ROUTE_EARPIECE : plus.audio.ROUTE_SPEAKER);  
    //音频加载中事件  
    player.addEventListener('waiting', waiting);  
    player.addEventListener('canplay', canplay);  
    player.addEventListener('stop', stop);  
    player.addEventListener('ended', ended);  

    // console.log(player.play())  
    // player.play()  

    // player.play(function() {});  
    // startPlayMp3(win.apiUrl + dataParam.url, $tingtong)  
});

预期结果:

能正常播放

实际结果:

不能播放

bug描述:

plus.audio.createPlayer 远程地址不能播放,所有事件监听不起作用。
单独播放本地地址可以,在 canplay 事件里播放不行,因为事件监听不起作用。
在别的手机可以,华为,android 11。

还有个 bug,plus toast style 参数配置完后 显示的样式不对,很难看。

更多关于uni-app 【报Bug】5+ plus.audio.createPlayer 远程地址不能播放,所有事件监听不起作用的实战教程也可以访问 https://www.itying.com/category-93-b0.html

10 回复

我都服了,ios iphone xr 14.2 本地地址 _doc/audios/asdf.mp3 不能播放 报错:{“code”:-5,“message”:“IO错误,https://ask.dcloud.net.cn/article/282”},换成远程地址就行。

更多关于uni-app 【报Bug】5+ plus.audio.createPlayer 远程地址不能播放,所有事件监听不起作用的实战教程也可以访问 https://www.itying.com/category-93-b0.html


找到问题所在了,是 plus.downloader.createDownload 下载的文件不完整造成的,解决方法是 在 下载之前设置请求头。 例: this.downloadObj.setRequestHeader(‘Content-Type’,‘application/x-www-form-urlencoded; charset=UTF-8’);// 设置POST请求提交的数据类型为JSON字符串
this.downloadObj.start() 设置请求头后下载成功,打开文件也成功。

你的安卓11系统也是怎么解决的?下载到本地再来播放的吗?

回复 老向: 是的下载到本地再播放

遇到同样的问题,三星 Fold Z,安卓11系统,播不了网络路径,错误信息是未知的错误。

用于远程呈现的音频流的子混音的音频源,需要Manifest.permission.CAPTURE_AUDIO_OUTPUT权限, 你用试试这个权限吗?我的三星 Fold Z无法调试。HBX不能调试。也不知道官方什么时候解决安卓11的调试问题

permission.WRITE_EXTERNAL_STORAGE .permission.MOUNT_UNMOUNT_FILESYSTEMS permission.RECORD_AUDIO
是不是播放网要申请权限?明天试试加WRITE_EXTERNAL_STORAGE有入权限试试!

不试了,我都下载到本地再播放

我最后也用了下载到本地来播放了。

这个问题涉及5+ API的音频播放功能。根据你的描述,问题主要出现在Android 9.0设备上远程音频地址无法播放,且事件监听失效。

核心问题分析:

  1. 远程地址播放失败plus.audio.createPlayer() 在Android 9.0及以上版本对网络音频地址的支持存在兼容性问题,特别是HTTPS地址可能需要额外的网络权限配置。

  2. 事件监听失效:事件监听器在音频未正确加载时不会触发,这是连锁反应。

解决方案:

方案一:检查网络权限和地址格式 确保音频地址是有效的HTTP/HTTPS链接,且在AndroidManifest.xml中已配置网络权限:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

方案二:使用uni-app的音频API替代 建议使用uni-app的通用音频API,兼容性更好:

const innerAudioContext = uni.createInnerAudioContext();
innerAudioContext.src = win.apiUrl + dataParam.url;
innerAudioContext.play();

方案三:添加错误处理 在现有代码中添加错误监听:

player.addEventListener('error', function(e){
    console.log('播放错误:', e.code, e.message);
    plus.nativeUI.alert('音频播放失败');
});
回到顶部