安卓音视频技术文章合集

Android MediaSession简单分析

2018-12-29  本文已影响0人  伪乐观的W先生

Android8.1 Mediasession 分析

概念性简述

核心类

一、MediaSession使用

1.1 初始化配置

1.2 设置监听回调

public class TestMediaSession{
    ...
    ...
    ...
    public void setCallBack(MediaSession.Callback callback){
        mMediaSession.setCallback(callback);
    }
    //Callback有多个函数可以重写,但本文只针对MediaKey的接收,故只重写此函数
    class MediaSessionCallback extends MediaSession.Callback {
        @override
        public boolean onMediaButtonEvent(Intent mediaButtonEvent) {
            KeyEvent event = (KeyEvent) mediaButtonEvent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
            return true;
        }
    }
    ...
    ...
    ...

}

二、MediaSession源码分析

类图

2.1 MediaSeesion的设置

2.2 MediaSeesion的管理

//frameworks/base/services/core/java/com/android/server/media/MeediaSessionService.java
public void onStart() {
    ...
    ...
    //如代码所示,获取了一个AudioService,然后设置了一个monitor去进行回调监听,一旦有audio发生变化,就会去更新MediaSession
    mAudioService = getAudioService();
    mAudioPlaybackMonitor = AudioPlaybackMonitor.getInstance(getContext(), mAudioService);
    mAudioPlaybackMonitor.registerOnAudioPlaybackStartedListener(
            new AudioPlaybackMonitor.OnAudioPlaybackStartedListener() {
        @Override
        public void onAudioPlaybackStarted(int uid) {
            synchronized (mLock) {
                FullUserRecord user =
                        getFullUserRecordLocked(UserHandle.getUserId(uid));
                if (user != null) {
                    user.mPriorityStack.updateMediaButtonSessionIfNeeded();
                }
            }
        }
    });
    ...
    ...
}

//frameworks/base/services/core/java/com/android/server/media/MediaSessionStack.java
public void updateMediaButtonSessionIfNeeded() {
    if (DEBUG) {
        Log.d(TAG, "updateMediaButtonSessionIfNeeded, callers=" + Debug.getCallers(2));
    }
    //获取audio中的uid,通过uid,去find已经add进来的MediaSession,如果发现当前正在使用的MediaSession
    //的uid跟audio中正在播放的不符的话,就会将MediaSession进行更新,没有正在使用的MediaSession的话,就直接赋值过去,
    //将mMediaButtonSession更新了。
    IntArray audioPlaybackUids = mAudioPlaybackMonitor.getSortedAudioPlaybackClientUids();
    for (int i = 0; i < audioPlaybackUids.size(); i++) {
        MediaSessionRecord mediaButtonSession =
                findMediaButtonSession(audioPlaybackUids.get(i));
        if (mediaButtonSession != null) {
            Log.d("MediaSessionTest", "Found the media button session");
            // Found the media button session.
            mAudioPlaybackMonitor.cleanUpAudioPlaybackUids(mediaButtonSession.getUid());
            if (mMediaButtonSession != mediaButtonSession) {
                updateMediaButtonSession(mediaButtonSession);
                 Log.d("MediaSessionTest", "updateMediaButtonSession");
            }
            return;
        }
    }
}
上一篇 下一篇

猜你喜欢

热点阅读