Android音频管理包括以下三个方面_论坛事务_音频应用论坛 - Powered by AUIOAPP

音频应用论坛

 找回密码
 快速注册

QQ登录

只需一步,快速开始

搜索
热搜: 音频应用

[资讯] Android音频管理包括以下三个方面

[复制链接]
254969084 发表于 2015-12-28 08:52:10

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?快速注册

x

   Android音频管理包括以下三个方面:
    1)控制APP的声音和回放:确保用户可以通过硬件或者软件音量键来控制APP的音量以及对音频的一些控制例如播放、暂停、停止、浏览和上下媒体文件切换。
    2)管理音频焦点:由于许多APP都可能播放音频,因此需要考虑它们之间的交互。为了避免同一时刻各个音频都播放,Android利用音频焦点来调节当前的音频播放。
    3)处理音频输出硬件:音频可以被多个源播放,我们需要知道该音频是来自哪儿并且需要知道如何处理当回放音频的时候耳机断开连接的情况。


    1)控制APP的声音和回放
    (1)确定使用哪个音频流
    Android对播放音乐、闹钟、提示、来电铃音、系统音、通话音以及DTMF音采取分割开的音频流管理,所以用户可以独立的控制每一个流的音量。这些流中的大多数都受限于系统响应,大多数情况下当播放我们的音频时,应该采用STREAM_MUSIC流。
    (2)利用手机音量键控制APP音量
    Android通过setVolumeControlStream()方法来管理你所指定的音频流对音量键的处理。当确定了音频流后,应该将该音频流传递给setVolumeControlStream()。值得注意的是,我们应当将该方法的调用放在APP生命周期的最前面,因为在你的Activity生命周期里它只需要调用一次,通常将其放置在onCreate()方法里。例如:
setVolumeControlStream(AudioManager.STREAM_MUSIC);
    (3)利用硬件的控制键来控制音频回放
    通过一些手持设备和其他想连接的耳机上的控制键,可以对音频进行控制。当用户按下某个键后,系统会广播ACTION_MEDIA_BUTTON行为的intent。为了对其作出反应,需要在manifest文件中登记BroadcastReceiver来监听这种广播行为。如下所示:
<receiver android:name=".RemoteControlReceiver">
    <intent-filter>
        <action android:name="android.intent.action.MEDIA_BUTTON" />
    </intent-filter>
</receiver>
    接着需要对intent作出处理。KeyEvent类包括代表按键类型的静态常量列表以KEYCODE_MEDIA_*打头。例如KEYCODE_MEDIA_PLAY_PAUSE和KEYCODE_MEDIA_NEXT。如下示例:
public class RemoteControlReceiver extends BroadcastReceiver {
    @Override public void onReceive(Context context, Intent intent) {
        if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) {
            KeyEvent event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
            if (KeyEvent.KEYCODE_MEDIA_PLAY == event.getKeyCode()) {
                 // Handle key press.
            }
        }
    }
}
    除了硬件上的按键来控制音频外,大多数应用都需要提供屏幕上的软控制,我们利用AudioManager类来为你的APP登记和注销media button事件的接收。如下:
AudioManager am = mContext.getSystemService(Context.AUDIO_SERVICE);
...
// Start listening for button presses am.registerMediaButtonEventReceiver(RemoteControlReceiver);
...
// Stop listening for button presses am.unregisterMediaButtonEventReceiver(RemoteControlReceiver);
    通过应用获得和丢失audio focus来登记和注销media button事件是对该软控制的比较好的一个处理。

    2)管理音频焦点
    为了避免不同应用同时播放声音,Android采用audio focus来播放声音。
    (1)请求Audio Focus
    app在播放任何音频前,需要获取audio focus。通过调用requestAudioFocus(),如果返回AUDIOFOCUS_REQUESST_GRANTED则表示请求成功。
    同时,我们需要指定你所采用的流对audio focus的获取是暂时的还是持续的。暂时的表示仅仅希望流播放很短的时间,例如导航指令;持续的表示希望音频播放很长的一段时间,例如播放音乐。
    如下是一个获取持续audio focus的例子。
AudioManager am = mContext.getSystemService(Context.AUDIO_SERVICE);
...

// Request audio focus for playback
int result = am.requestAudioFocus(afChangeListener,
                                 // Use the music stream.
                                 AudioManager.STREAM_MUSIC,
                                 // Request permanent focus.
                                 AudioManager.AUDIOFOCUS_GAIN);
   
if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
    am.unregisterMediaButtonEventReceiver(RemoteControlReceiver);
    // Start playback.
}
    当结束播放后,应该调用abandAudioFocus()。它会告知系统不需要在占据audio focus,并且注销相关联的AudioManager.OnAudioFocusChangeListener.

// Abandon audio focus when playback complete   
am.abandonAudioFocus(afChangeListener);
    如下给出了获取暂时audio focus的例子。

// Request audio focus for playback
int result = am.requestAudioFocus(afChangeListener,
                             // Use the music stream.
                             AudioManager.STREAM_MUSIC,
                             // Request permanent focus.
                             AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK);
   
if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
    // Start playback.
}
    (3)处理Audio Focus的丢失
    因为能获得audio focus,所以当其他app请求它的时候,你的app可能会失去它,app如何去应对这样一种情况取决于丢失的行为。
    一般来说,当短暂丢失时,应该让app对其流静音,同时要维护其状态。此时要监测audio focus的状态改变,记录暂停的地方,从而在获得focus后继续播放。
    如果是持续的丢失,一般假定另一个应用需要监听音频。所以这时候我们一般要停止播放,注销掉相关的控件。
    如下为上述两种过程的处理方法。
OnAudioFocusChangeListener afChangeListener = new OnAudioFocusChangeListener() {
    public void onAudioFocusChange(int focusChange) {
        if (focusChange == AUDIOFOCUS_LOSS_TRANSIENT
            // Pause playback
        } else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {
            // Resume playback
        } else if (focusChange == AudioManager.AUDIOFOCUS_LOSS) {
            am.unregisterMediaButtonEventReceiver(RemoteControlReceiver);
            am.abandonAudioFocus(afChangeListener);
            // Stop playback
        }
    }
};

    3)处理音频输出硬件
    一般来说手机设备都有内置扬声器,有线耳机插口以及蓝牙。可以通过查询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?
}
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

软硬产品代理咨询服务:声卡:雅马哈UR22C、罗兰声卡、福克斯特、艾肯、阿波罗 、M-audio 、普瑞声纳 、福克斯特、 达思冠系列 音箱:吸顶NS-IW560C、吸顶NS-IW660 、NS-AW350、低音NS-SW050、低音NS-SW100;JBL 吸顶8124、CSS-8006BM;香蕉猴 gibbon系列;普瑞声纳E5XT、E4.5、 E3.5BT 有线话筒:舒尔PGA27、PGA48、MV51、mv88、mv88+、SM27 ;森海E945 、MK4、E835S;舒伯乐top248s;罗德NT1-A、VIDEOMIC、VIDEOMIC GO、VideoMicro、VideoMic NTG 无线领夹麦克风:罗德 wireless go II 一拖一、一拖二;猛犸lark150 耳机:森海HD300 pro、美奇 CR-Buds 、索尼7506、爱科技K240S、K240 MKII、K271 MKII、K52、K72、K92、先锋、飞利浦 1:飞利浦会务通/会议摄像头/全向麦克风/执法仪/录音笔 2:洋铭便携式移动演播室 / 切换台 / 摄控一体摄像机 / 虚拟演播室 / 微金课教室 / 色键器 3:逻兰音视频切换台 / 声卡 / 电子鼓 /电钢琴 /耳机 4:Blackmagic专业摄影机 /调色台 / 切换台/ 广播级转换器 / 监视器 / 采集卡 5:索尼专业摄像机/佳能专业摄像机/松下专业摄像机/ insta360专业摄像机 6:话筒:铁三角/ 舒尔/ 森海塞尔 / AKG / RODE/ BBS 7:音响:YAMAHA/ 声艺 / 皇冠 /JBL / 真力/咪宝/BOSE /美奇 8:声卡:RME/羚羊/IXI /艾肯/PreSonus普瑞声纳/Focusrite福克斯特/YAMAHA/雅马哈/ickb 9:耳机:铁三角/beyerdynamic拜亚动力/AKG爱科技/索尼/RunningMan/美技 10:思锐三脚架 /防潮箱 /米泊三脚架/意美捷三脚架/曼富图三脚架 11:XSW系列,300.500代理商,EWD数字系列代理,6000.9000定制产品,还包销了全国三个型号:XSW1-825,EW100 G4-945,EWD- kk 205

小黑屋|手机版|Archiver|音频应用 (鄂ICP备13005321号-1)

Powered by Audio app

快速回复 返回顶部 返回列表