【Android Developers Training】 44. 控制你应

系统 1810 0

注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好。

原文链接: http://developer.android.com/training/managing-audio/volume-playback.html


一个良好的用户体验是一种可预测的。如果你的应用播放多媒体,那么很重要的一点就是你的用户可以通过他们设备上的(蓝牙耳机,耳机等等)硬件或软件音量控制方法,来调整应用的音量。


一). 确定使用的是什么媒体流

要创建一个可预测的音频体验,第一步是要明确你的应用要使用什么音频流。

Android系统中,对于播放音乐,闹铃,通知,来电铃声,系统提示音,按键音等都分别对应不同的音频流。这样做的目的主要是可以让用户分别对不同的音频流控制其音量。

大多数的这些音频流被限制为系统级事件,所以除非你的应用替代了闹铃,你才能使用 STREAM_MUSIC 流来播放你的音频。


二). 使用硬件音量键来控制你的应用音频音量

默认的,按下音量控制键会修改当前激活的音频流的音量。如果你的应用现在没有播放任何东西,那么按下音量键将会调整铃声音量。

如果你有一个游戏或者音乐音乐,那么当用户希望修改游戏或音乐的音量时,按下音量控制键是有效的,甚至用户现在处于两个音乐播放之间的间隔,或者在当前的游戏所处位置没有音乐在播放。

你可能很渴望尝试监听音量键按下的事件,并且通过这种方式来修改你的音频流的音量。放弃这种复杂的想法吧, Android提供了 setVolumeControlStream() 这个方法来直接调整你制定的音频流的音量。

确定了你的应用要使用的音频流之后,你应该将它设置为当前音量流目标。你应该在你应用生命周期的早期调用响应的方法,因为你只需要在Activity整个生命周期中调用它一次,你应该在控制你的媒体的 Activity 或者 Fragment onCreate()方法中调用它。这样可以保证不管你的应用当前是否是可见的,音量控制表现的将会与用户期望的一致。

      setVolumeControlStream(AudioManager.STREAM_MUSIC);
    

从现在开始,按下设备的音量键将会影响你特定的音频流(此例中为“ music ”),不管目标activity或fragment是否是可见的。


三). 使用硬件的播放控制键老控制你的应用的音频播放

媒体播放按钮,比如播放、暂停、停止、跳过、回放键在一些手持设备或其他有限设备上面还是有的。当用户按下一个或其他这类硬件按键时,系统会广播一个具有 ACTION_MEDIA_BUTTON 行为的intent。

要响应媒体按钮的点击事件,你需要在你的清单文件中注册一个广播接收器( BroadcastReceiver ),来监听这一行为的广播,如下所示:

      
        <
      
      
        receiver 
      
      
        android:name
      
      
        =".RemoteControlReceiver"
      
      
        >
      
      
        <
      
      
        intent-filter
      
      
        >
      
      
        <
      
      
        action 
      
      
        android:name
      
      
        ="android.intent.action.MEDIA_BUTTON"
      
      
        />
      
      
        </
      
      
        intent-filter
      
      
        >
      
      
        </
      
      
        receiver
      
      
        >
      
    

这个接收器的实现需要提取出造成这个广播所按下的键是哪个。广播的 Intent 会在 EXTRA_KEY_EVENT 键中包含这一信息,同时在 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 来注册或者注销你的媒体按键事件接收器,这可以用在你的应用中。当注册了以后,你的广播接收器将会是唯一的,监听所有的媒体按钮广播的接收器:

      AudioManager am =
      
         mContext.getSystemService(Context.AUDIO_SERVICE);

...




      
      
        //
      
      
         Start listening for button presses
      
      
        am.registerMediaButtonEventReceiver(RemoteControlReceiver);

...




      
      
        //
      
      
         Stop listening for button presses
      
      

am.unregisterMediaButtonEventReceiver(RemoteControlReceiver);
    

通常情况下,应用应该在他们变成非激活状态或不可见时(比如在 onStop() 回调函数阶段),注销他们的接收器。然而,对于播放应用来说,事情没有那么简单。事实上,因为当你的应用不可见或者不能在当前屏幕的UI界面被控制,时还能响应媒体按键的事件时很重要的。

一个更好的方法是在你的应用获取和丢失音频焦点时,注册或注销媒体按钮事件接收器。

【Android Developers Training】 44. 控制你应用的音量和播放


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论