uni-app 音频切换蓝牙没声音 手机内所有应用也跟着切换音频

uni-app 音频切换蓝牙没声音 手机内所有应用也跟着切换音频

开发环境 版本号 项目创建方式
HBuilderX 3.1.22 云端

产品分类:HTML5+

手机系统:Android

手机系统版本号:Android 11

手机厂商:华为

手机机型:荣耀x10


示例代码:

if ( plus.audio == undefined ) {
    // alert( "Device not ready!" );
}

var p = plus.audio.createPlayer(bofang_path);  
if(bofangwey ==1){  
    p.setRoute(plus.audio.ROUTE_SPEAKER);  
}else{  
    p.setRoute( plus.audio.ROUTE_EARPIECE );  
}  
p.play( function () {  

}, function ( e ) {  

} );

操作步骤:

if ( plus.audio == undefined ) {
    // alert( "Device not ready!" );
}

var p = plus.audio.createPlayer(bofang_path);  
if(bofangwey ==1){  
    p.setRoute(plus.audio.ROUTE_SPEAKER);  
}else{  
    p.setRoute( plus.audio.ROUTE_EARPIECE );  
}  
p.play( function () {  

}, function ( e ) {  

} );

预期结果:

if ( plus.audio == undefined ) {
    // alert( "Device not ready!" );
}

var p = plus.audio.createPlayer(bofang_path);  
if(bofangwey ==1){  
    p.setRoute(plus.audio.ROUTE_SPEAKER);  
}else{  
    p.setRoute( plus.audio.ROUTE_EARPIECE );  
}  
p.play( function () {  

}, function ( e ) {  

} );

实际结果:

if ( plus.audio == undefined ) {
    // alert( "Device not ready!" );
}

var p = plus.audio.createPlayer(bofang_path);  
if(bofangwey ==1){  
    p.setRoute(plus.audio.ROUTE_SPEAKER);  
}else{  
    p.setRoute( plus.audio.ROUTE_EARPIECE );  
}  
p.play( function () {  

}, function ( e ) {  

} );

更多关于uni-app 音频切换蓝牙没声音 手机内所有应用也跟着切换音频的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于uni-app 音频切换蓝牙没声音 手机内所有应用也跟着切换音频的实战教程也可以访问 https://www.itying.com/category-93-b0.html


这个问题是由于Android系统(特别是华为/荣耀设备)的音频路由策略导致的。当使用plus.audio.setRoute()强制切换音频输出设备时,系统可能会全局改变音频路由,影响所有应用。

原因分析:

  1. Android系统的音频路由管理是全局性的,ROUTE_SPEAKERROUTE_EARPIECE的切换会改变系统默认的音频输出通道
  2. 华为/荣耀设备对音频路由有更严格的控制策略
  3. 蓝牙设备连接时,系统优先将音频路由到蓝牙设备

解决方案:

  1. 使用Web Audio API替代(推荐)
// 创建AudioContext
const audioContext = new (window.AudioContext || window.webkitAudioContext)();
const source = audioContext.createMediaElementSource(audioElement);
source.connect(audioContext.destination);
  1. 检查蓝牙连接状态
// 在播放前检查蓝牙状态
plus.bluetooth.getState(function(state) {
    if(state === 'connected') {
        // 蓝牙已连接,提示用户
        uni.showToast({
            title: '请断开蓝牙设备',
            icon: 'none'
        });
    }
});
  1. 延迟播放设置
// 先创建播放器,稍后再设置路由
var p = plus.audio.createPlayer(bofang_path);
setTimeout(() => {
    if(bofangwey == 1) {
        p.setRoute(plus.audio.ROUTE_SPEAKER);
    } else {
        p.setRoute(plus.audio.ROUTE_EARPIECE);
    }
    p.play();
}, 100);
  1. 使用uni-app的音频API
// uni-app自带的音频API对路由处理更好
const innerAudioContext = uni.createInnerAudioContext();
innerAudioContext.src = bofang_path;
innerAudioContext.play();
  1. 添加权限声明 在manifest.json中添加:
{
    "permissions": {
        "Audio": {
            "description": "音频播放"
        }
    }
}
回到顶部