如何写一个正经的音乐播放器 四 意外情况

四,意外情况的控制。

在音频播放时候,容易遇到一些意外情况,这时候,我们就要处理这些意外情况,这时候,我们需要针对不同的意外情况进行处理。大概可以分成两种情况。

1,失去audio_focus的控制。

造成我们的播放器失去焦点的情况很多,主要是其他声音请求了焦点,例如说,其他音乐播放器开始播放音乐,突然来电,短息等。

以上的焦点失去,都可以用AudioManager.OnAudioFocusChangeListener中的回调来处理。先取得AudioManager

AudioManager audioManager = (AudioManager)mContext.getSystemService(Context.AUDIO_SERVICE);
以下是进行申请焦点的两个方法,
private int requestAudioFocus () {
        //Toast.makeText(mContext, "requestAudioFocus", Toast.LENGTH_SHORT).show();
        return mAudioManager.requestAudioFocus(this, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
    }

    private int releaseAudioFocus () {
        //Toast.makeText(mContext, "releaseAudioFocus excuted", Toast.LENGTH_SHORT).show();
        return mAudioManager.abandonAudioFocus(this);
    }

requestAudioFocus的调用时机是在start一个audio之前进行检查(mMediaPlayer.prepareAsync之前),一旦获取焦点失败,就不要去向下执行,不然当其他音频打断播放时候,我们不会收到及时的回调。注意此方法中,申请的焦点类型:AudioManager.STREAM_MUSIC

ReleaseAudioFocus的调用时机是,在我们的播放pause,stop,complete,error或者变成idle状态时候,都要去执行。为了及时释放焦点。

有一个小技巧,来判断是否获得了音乐播放的焦点,就是在我们应用取得焦点后,按音量键,此时调节的是音乐播放的音量,当我们暂停播放,调节音量是当前其他焦点类型的音量。如果我们在一开始播放未申请焦点,则音量调节不会对我们播放的音频生效。

那么失去焦点如何处理?我们在OnAudioFocusChangedListener中进行处理。

我的处理如下:

@Override
    public void onAudioFocusChange(int focusChange) {
        switch (focusChange) {
            case AudioManager.AUDIOFOCUS_LOSS:
                releaseAudioFocus();
                stop();
                Dog.i(mContext, "Michael onAudioFocusChange", "AUDIOFOCUS_LOSS:" + focusChange);
                break;
            case AudioManager.AUDIOFOCUS_GAIN:
                mService.recoverVolume();
                /*if (mService.getState() == MichaelService.State.PAUSED) {
                    mService.resume();
                }*/
                Dog.i(mContext, "Michael onAudioFocusChange", "AUDIOFOCUS_GAIN:" + focusChange);
                break;
            case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
                pause();
                Dog.i(mContext, "Michael onAudioFocusChange", "AUDIOFOCUS_LOSS_TRANSIENT:" + focusChange);
                break;
            case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
                mService.lowerVolume();
                Dog.i(mContext, "Michael onAudioFocusChange", "AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:" + focusChange);
                break;
            default:
                Dog.i(mContext, "Michael onAudioFocusChange", "default:" + focusChange);
                break;
        }
    }

值得注意的是:AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK这一类型,主要是针对类似于短信铃声这样的,当音乐播放时候,有短信,只会有du一声很短暂的声音,此时不需要我们去暂停音乐,只要减小音量即可。

2,插拔耳机的控制。

很明显,主要针对的是拔掉耳机。

说到拔掉耳机,很容易让人去监听拔掉耳机的系统广播,实际上不是这样的,我之前这么做过,出现了一个现象是:拔掉耳机后的一瞬间,能从外音能到一会儿音乐。如果,你监听这个广播再进行暂停,那你已经晚了。请恕我不将这个错误的广播公诸于众了。

我们要监听的是:AudioManager.ACTION_AUDIO_BECOMING_NOISY

系统广播监听很简单,去监听吧。注意在合适时候释放就好了。

按照以上指导思想,最近写成这样子了:

时间: 2024-10-10 11:04:32

如何写一个正经的音乐播放器 四 意外情况的相关文章

VUE项目实现音乐播放器(四)------- 设计播放进度条 + 播放控制按钮

2020.3.31 9:18 好的,早上好各位,今天我们来进行一个很炫酷的页面开发——播放器控制页面( src\components\Play.vue ),如下图: 我们可以看到,该页面有很多元素组成,歌曲的封面.左上角的页面隐藏按钮,中间的播放进度条.歌词栏.下方的播放控制按钮.右下角的显示播放列表按钮,这些元素完美的结合在一起,整个页面有没有一种很高大上的感觉!好了,让我们来亲自动手实现它吧! 1. 歌曲封面&隐藏按钮 首先通过 getters 获取到歌曲的封面: computed: { i

使用绑定服务实现一个简单的音乐播放器

效果 布局文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:

使用service实现一个简单的音乐播放器

效果 布局文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:

vue音乐播放器

利用vue写一个简单的音乐播放器,包括功能有歌曲搜索.歌曲播放.歌曲封面.歌曲评论.播放动画.mv播放六个功能. <template> <div class="wrap"> <!-- 播放器主体区域 --> <div class="play_wrap" id="palyer"> <div class="search_bar"> <img src="./

如何写一个正经的Android音乐播放器 一

以前写过很多次音乐播放器,但是总有一些问题出现,例如: 1,音乐长时间播放问题(即便是放在service中去播放,依然会被杀死): 2,音乐的播放进度如何掌握?(如何利用mediaplayer.getCurrentPosition()来有效的通知界面变更进度?): 3,在我以往的经验中,音乐播放完毕下一曲时候,经常出现当前音乐播放还差几秒钟的时候就下一曲了的情况. 从网上找到教程中,通常都是一个播放器的demo,简单的直接把MediaPlayer放在了一个Activity中去操作,稍有良心的教程

用&lt;audio&gt;标签打造一个属于自己的HTML5音乐播放器

上一章节,我们刚刚讲了<video>标签,今晚,我们讲的是<audio>标签,这两个东东除了表示的内容不一样以外,其他的特性相似的地方真的太多了,属性和用法几乎一样,也就说,如果上一章节你理解了,那么这一节你学起来会:毫无压力. <audio>简介 <audio>标签:用于在文档中表示音频内容.利用它,你可以在你的个人网站上放一首你喜欢的歌.    <audio src="music.mp3"></audio> 用

做一个Android音乐播放器是遇到的一些困难

最近再做一个安卓的音乐播放器,是实验室里学长派的任务,我是在eclipse上进行开发的,由于没有android的基础,所以做起来困难重重. 首先是布局上的困难 1.layout里的控件属性不熟悉 2.想做一个音乐列表做不出来知道要用Listview控件,网上也找了许多的音乐播放器的代码,但导入项目中总会出错,所以想在这里请教各位 3.除了布局有困难外,实现相关功能也有困难,由于基础不行所以我并不想也做不出网上音乐播放器那么多的功能,我只想要我的播放器有播放,暂停,上一曲,下一曲的效果就行了,这还

HTML5项目笔记4:使用Audio API设计绚丽的HTML5音乐播放器

HTML5 有两个很炫的元素,就是Audio和 Video,可以用他们在页面上创建音频播放器和视频播放器,制作一些效果很不错的应用. 无论是视屏还是音频,都是一个容器文件,包含了一些音频轨道,视频轨道和一些元数据,这些是和你的视频或者音频控件绑定到一块的,这样才形成了一个完整的播放组件. 浏览器支持情况: 浏览器 支持情况 编解码器 Chrome 3.0 Theora . Vorbis .Ogg H.264 . AAC .MPEG4 FireFox 3.5 Theora . Vorbis .Og

一步一步实战HTML音乐播放器

在这里我用HTML5从头开始一步一步来制作一个简约的音乐播放器,大家可以参考一下,接下来正式开始. 音乐播放器效果 播放器分析 这里将播放器分两块来做: 视图层(html + css) 逻辑层 ( js ) 视图层分析 视图中包含: 播放器容器 播放器名称 音乐专辑图 音乐信息 歌曲名 歌手 专辑名 控制区 上一曲 播放 下一曲 播放进度条 播放时间 当前时间 歌曲总时间 音频控件 页面背景 逻辑层分析 逻辑层处理包括: 加载歌单 渲染歌曲信息 专辑图 歌曲名 歌手 专辑名 歌曲时长 歌曲音频地