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
我都服了,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设备上远程音频地址无法播放,且事件监听失效。
核心问题分析:
-
远程地址播放失败:
plus.audio.createPlayer()在Android 9.0及以上版本对网络音频地址的支持存在兼容性问题,特别是HTTPS地址可能需要额外的网络权限配置。 -
事件监听失效:事件监听器在音频未正确加载时不会触发,这是连锁反应。
解决方案:
方案一:检查网络权限和地址格式 确保音频地址是有效的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('音频播放失败');
});

