博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
后台播放音乐时进来电话或微信视频通话暂停音乐播放 网易云音乐 喜马拉雅...
阅读量:6801 次
发布时间:2019-06-26

本文共 3803 字,大约阅读时间需要 12 分钟。

最近项目中遇到一个问题,app内音乐后台播放时,如果有电话或者微信视频通话进来,app后台音乐还在播放。这样就造成用户体验不好,研究了市面上的音乐播放器,比如网易云音乐就很好的做到了如果有微信视频或者语音通话进来时音乐暂停播放。微信视频挂断后继续播放音乐。

相关实现肯定是要监听音频相关的一些接口回调。研究了安卓的官方文档,终于找到解决方案。先贴出我的实现代码

##主要用到了:AudioManager.OnAudioFocusChangeListener

package qcl.com;import android.app.Service;import android.content.Context;import android.content.Intent;import android.media.AudioManager;import android.os.IBinder;import android.telephony.PhoneStateListener;import android.telephony.TelephonyManager;import android.util.Log;/** * Description: * Author     : qcl * Date       : 17/11/9 */public class PhoneService extends Service {    private boolean isChangeToPause = false;    // 电话管理器    private TelephonyManager tm;    // 监听器对象    private MyListener listener;    private AudioManager ams = null;//音频管理器    @Override    public IBinder onBind(Intent intent) {        return null;    }    /**     * 服务创建的时候调用的方法     */    @Override    public void onCreate() {        // 后台监听电话的呼叫状态。        // 得到电话管理器        tm = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE);        listener = new MyListener();        tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);        initAudio();        super.onCreate();    }    //微信,qq通话监听    private void initAudio() {        ams = (AudioManager) getSystemService(Context.AUDIO_SERVICE);        ams.getMode();//这里getmode返回值为3时代表,接通qq或者微信电话        ams.requestAudioFocus(mAudioFocusListener, 1, 1);    }    private class MyListener extends PhoneStateListener {        // 当电话的呼叫状态发生变化的时候调用的方法        @Override        public void onCallStateChanged(int state, String incomingNumber) {            super.onCallStateChanged(state, incomingNumber);            Log.d("qcl111", "state" + state);            try {                switch (state) {                    case TelephonyManager.CALL_STATE_IDLE://空闲状态。            //继续播放音乐                        Log.v("myService", "空闲状态");                        break;                    case TelephonyManager.CALL_STATE_RINGING://铃响状态。                      //暂停播放音乐                        Log.v("myService", "铃响状态");                        break;                    case TelephonyManager.CALL_STATE_OFFHOOK://通话状态                        Log.v("myService", "通话状态");                        break;                    default:                        break;                }            } catch (Exception e) {                e.printStackTrace();            }        }    }    private AudioManager.OnAudioFocusChangeListener mAudioFocusListener = new AudioManager.OnAudioFocusChangeListener() {        public void onAudioFocusChange(int focusChange) {            Log.d("qcl111", "focusChange----------" + focusChange);            if (focusChange == 1) {//视频语音挂断状态                if (isChangeToPause) {                    GlobalAudioManager.getInstance().playResume();                    Log.d("qcl111", "playResume()" + focusChange);                }            } else {//微信或者qq语音视频接通状态                if (GlobalAudioManager.getInstance().isPlaying()) {                    isChangeToPause = true;                    GlobalAudioManager.getInstance().playPause();                    Log.d("qcl111", "playPause()" + focusChange);                }            }        }    };    /**     * 服务销毁的时候调用的方法     */    @Override    public void onDestroy() {        super.onDestroy();        // 取消电话的监听,采取线程守护的方法,当一个服务关闭后,开启另外一个服务,除非你很快把两个服务同时关闭才能完成        Intent i = new Intent(this, PhoneService2.class);        startService(i);        tm.listen(listener, PhoneStateListener.LISTEN_NONE);        listener = null;     ams.abandonAudioFocus(mAudioFocusListener);    }}复制代码

后台音乐播放.png
根据上面的log可以看出focusChange为1时代表微信视频结束,我们这个时候继续我们的后台音乐播放。focusChange不为1时就暂停音乐播放。
这样就能实现像网易云音乐那样。在有微信或qq视频通话时暂停音乐播放。挂断时继续音乐播放。

转载于:https://juejin.im/post/5a0e6e706fb9a045067130e9

你可能感兴趣的文章
这两天说到的苹果软件中毒是个什么情况?
查看>>
IOS的消息传递机制,使用NSNotificationCenter进行通信,很实用
查看>>
开始使用Emacs
查看>>
Qt Creator + MinGW 在windows 下的调试
查看>>
sql server中filegroup与partition解析
查看>>
转 Spring.NET 与 NHibernate 的整合
查看>>
TNS-01190故障的处理
查看>>
C++ Exercises(十)
查看>>
《kali linux 渗透测试初级教程》免费下载
查看>>
[Oracle]PDB Clone 方法
查看>>
JavaScript词法作用域与调用对象
查看>>
当谈论设备指纹时,我们到底在说什么?(转)
查看>>
Python天天美味(10) - 除法小技巧
查看>>
webrtc进阶-信令篇-之三:信令、stun、turn、ice
查看>>
.NET调试实例-信息和安装说明 (原创翻译)
查看>>
ThinkPHP 数据库操作之数据表模型和基础模型 ( Model
查看>>
Listener and sqlnet trace
查看>>
Unity3D对安卓盒子的支持
查看>>
redis源码笔记 - redis-cli.c
查看>>
QTabWiget Change Color 改变颜色
查看>>