创建多媒体APP 之 音频播放:处理音频输出硬件

来源:互联网 发布:软件开发培训班 编辑:程序博客网 时间:2024/05/18 03:16

用户有多种途径来听android设备的音频文件。每个android设备都有一个内置的扬声器和一个头戴式耳机插口。而且许多都支持蓝牙连接,支持A2DP音频播放。

检测使用的硬件类型

从哪个硬件输出音频直接影响着你的APP播放音频的具体行为。你可以使用AudioManager才决定当前音频被发送到哪个硬件,如设备的扬声器,有线耳机,或者链接到的蓝牙设备,如下面的代码片段:

if (isBluetoothA2dpOn()) {    // Adjust output for Bluetooth.} else if (isSpeakerphoneOn()) {    // Adjust output for Speakerphone.} else if (isWiredHeadsetOn()) {    // Adjust output for headsets} else {     // If audio plays and noone can hear it, is it still playing?}


处理输出硬件改变的情况

当一个耳机被拔出,或者蓝牙设备断开,那么音频播放自动的被发送到内置的扬声器。如果播放音乐的时候把声音开到最大,那这个时候切换到扬声器的时候就是很大的声音,如噪音一般。

幸运的是,android系统在发现耳机或者蓝牙设备断开的时候,会发送一个广播:ACTION_AUDIO_BECOMING_NOISY 的intent.最好的办法就是注册一个广播,在你播放音频的时候监听这个广播。对于音乐播放器而言,用户一般希望这种情况下暂停播放,对于游戏,可能希望大大的降低声音。

private class NoisyAudioStreamReceiver extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {        if (AudioManager.ACTION_AUDIO_BECOMING_NOISY.equals(intent.getAction())) {            // Pause the playback        }    }}private IntentFilter intentFilter = new IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY);private void startPlayback() {    registerReceiver(myNoisyAudioStreamReceiver(), intentFilter);}private void stopPlayback() {    unregisterReceiver(myNoisyAudioStreamReceiver);}