› › 文章

Android焦点管理类AudioFocusManager

文章目录

前言

大家都知道,从Android 8开始 焦点的申请方式变了,因此,为了兼容不同的Android版本,因此整理在AudioFocusManager中统一管理。

正文

其实代码就是 根据当前Android系统版本的判断,然使用不同的参数进行申请焦点和释放焦点,这样用户使用时就不需要考虑版本不同。

直接上代码AudioFocusManager.java

package com.la.audiotools;

import android.content.Context;
import android.media.AudioAttributes;
import android.media.AudioFocusRequest;
import android.media.AudioManager;
import android.os.Build;
import android.util.Log;


/**
 * 焦点申请管理类
 */
public class AudioFocusManager {

    private static final String TAG = AudioFocusManager.class.getSimpleName();

    private AudioFocusRequest mAudioFocusRequest = null;
    private AudioManager mAudioManager = null;


    public AudioFocusManager(Context context) {
        if (null == context) {
            //这里最好获取一下Application中的Context(略)
            Log.d(TAG, "AudioFocusManager null... ");
        }
        mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
    }

    /**
     * @param listener     设置焦点状态监听
     * @param usage        设置场景(Build.VERSION_CODES.O后支持)
     * @param streamType   设置的流媒体类型
     * @param durationHint 设置的焦点状态类型
     * @param acceptDelay  设置接受延迟(Build.VERSION_CODES.O后支持)
     * @return
     */
    public int requestAudioFocus(AudioManager.OnAudioFocusChangeListener listener, int usage, int streamType, int durationHint, boolean acceptDelay) {
        if (null == mAudioManager || null == listener) {
            Log.d(TAG, "requestAudioFocus null... ");
            return -1;
        }
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            AudioAttributes audioAttributes = new AudioAttributes.Builder().setUsage(usage).setContentType(streamType).build();
            mAudioFocusRequest = new AudioFocusRequest.Builder(durationHint)
                    .setAudioAttributes(audioAttributes)
                    .setAcceptsDelayedFocusGain(acceptDelay)
                    .setOnAudioFocusChangeListener(listener).build();
            return mAudioManager.requestAudioFocus(mAudioFocusRequest);
        } else {
            return mAudioManager.requestAudioFocus(listener, streamType, durationHint);
        }
    }


    /**
     * 释放焦点
     *
     * @param listener 焦点状态监听
     * @return
     */
    public int abandonAudioFocusRequest(AudioManager.OnAudioFocusChangeListener listener) {
        if (null == mAudioManager || null == listener) {
            Log.d(TAG, "abandonAudioFocusRequest null... ");
            return -1;
        }
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            return mAudioManager.abandonAudioFocusRequest(mAudioFocusRequest);
        } else {
            return mAudioManager.abandonAudioFocus(listener);
        }
    }
}

因此用户只需要初始化AudioFocusManager然后设置监听和注销监听了。

参考文章

  1. Android 官方文档
  2. Android 8.0后音频焦点处理小结
发表评论