Android音乐播放模式切换-外放、听筒、耳机

时间:2025-01-31 08:51:03

初始化音频管理器

/**
     * 初始化音频管理器
     */
    private void initAudioManager() {
        audioManager = (AudioManager) (Context.AUDIO_SERVICE);
        if (.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){
            (AudioManager.MODE_IN_COMMUNICATION);
        } else {
            (AudioManager.MODE_IN_CALL);
        }
        (true);            //默认为扬声器播放
    }

切换到听筒模式

/**
     * 切换到听筒模式
     */
(false);
        if (.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){
            (AudioManager.STREAM_MUSIC,
                    (AudioManager.MODE_IN_COMMUNICATION), AudioManager.FX_KEY_CLICK);
        } else {
            (AudioManager.STREAM_MUSIC,
                    (AudioManager.MODE_IN_CALL), AudioManager.FX_KEY_CLICK);
        }

切换到耳机模式

/**
     * 切换到耳机模式
     */
    public void changeToHeadsetMode(){
        currentMode = MODE_HEADSET;
        (false);
    }

切换到外放模式

/**
     * 切换到外放模式
     */
    public void changeToSpeakerMode(){
        currentMode = MODE_SPEAKER;
        (true);
    }

设置音量

音量+/-按钮触发

 private void setVolume(Context context,boolean upVolume){
        int volume = (AudioManager.STREAM_MUSIC);
        if (upVolume) {
            volume+=1;
        }else{
            volume-=1;
        }
        int maxVolume = (AudioManager.STREAM_MUSIC);
        if(volume>=0 && volume<=maxVolume){
            (AudioManager.STREAM_MUSIC, volume, FLAG_SHOW_UI);
            (("%s->volume:%d,maxVolume:%d",(upVolume?"upVolume":"downVolume"),volume,maxVolume));
        }
    }

FLAG_SHOW_UI 控制是否显示显示音量大小的ui弹框

拦截系统的音量+/-按钮

@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {
            ("onKeyDown->KEYCODE_VOLUME_DOWN");
            (this);
            return true;
        } else if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
            ("onKeyDown->KEYCODE_VOLUME_UP");
            (this);
            return true;
        } else return (keyCode, event);
    }

    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {
            ("onKeyUp->KEYCODE_VOLUME_DOWN");
            return true;
        } else if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
            ("onKeyUp->KEYCODE_VOLUME_UP");
            return true;
        } else return (keyCode, event);
    }

控制音量状态写成了一个单例类

/**
 * 音乐播放管理类
 * Created by Administrator on 2015/8/27 0027.
 */
public class PlayerManager {

    /**
     * 外放模式
     */
    public static final int MODE_SPEAKER = 0;

    /**
     * 耳机模式
     */
    public static final int MODE_HEADSET = 1;

    /**
     * 听筒模式
     */
    public static final int MODE_EARPIECE = 2;

    private static PlayerManager playerManager;

    private AudioManager audioManager;

    private Context context;

    private int currentMode = MODE_SPEAKER;

    public static PlayerManager getManager(){
        if (playerManager == null){
            synchronized (){
                playerManager = new PlayerManager();
            }
        }
        return playerManager;
    }

    public void init(Context context){
         = context;
        initAudioManager();
    }

    /**
     * 初始化音频管理器
     */
    private void initAudioManager() {
        audioManager = (AudioManager) (Context.AUDIO_SERVICE);
        if (.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){
            (AudioManager.MODE_IN_COMMUNICATION);
        } else {
            (AudioManager.MODE_IN_CALL);
        }
        (true);            //默认为扬声器播放
    }


    /**
     * 获取当前播放模式
     * @return
     */
    public int getCurrentMode() {
        return currentMode;
    }

    /**
     * 切换到听筒模式
     */
    public void changeToEarpieceMode(){
        currentMode = MODE_EARPIECE;
        (false);
        if (.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){
            (AudioManager.STREAM_MUSIC,
                    (AudioManager.MODE_IN_COMMUNICATION), AudioManager.FX_KEY_CLICK);
        } else {
            (AudioManager.STREAM_MUSIC,
                    (AudioManager.MODE_IN_CALL), AudioManager.FX_KEY_CLICK);
        }
    }

    /**
     * 切换到耳机模式
     */
    public void changeToHeadsetMode(){
        currentMode = MODE_HEADSET;
        (false);
    }

    /**
     * 切换到外放模式
     */
    public void changeToSpeakerMode(){
        currentMode = MODE_SPEAKER;
        (true);
    }


    /**
     * 调大音量
     */
    public void raiseVolume(){
        int currentVolume = (AudioManager.STREAM_MUSIC);
        if (currentVolume < (AudioManager.STREAM_MUSIC)) {
            (AudioManager.STREAM_MUSIC,
                    AudioManager.ADJUST_RAISE, AudioManager.FX_FOCUS_NAVIGATION_UP);
        }
    }

    /**
     * 调小音量
     */
    public void lowerVolume(){
        int currentVolume = (AudioManager.STREAM_MUSIC);
        if (currentVolume > 0) {
            (AudioManager.STREAM_MUSIC,
                    AudioManager.ADJUST_LOWER, AudioManager.FX_FOCUS_NAVIGATION_UP);
        }
    }
    public  void raiseVolume(Context context){
        setVolume(context,true);

    }
    public void lowerVolume(Context context){
        setVolume(context,false);
    }
    private void setVolume(Context context,boolean upVolume){
        int volume = (AudioManager.STREAM_MUSIC);
        if (upVolume) {
            volume+=1;
        }else{
            volume-=1;
        }
        int maxVolume = (AudioManager.STREAM_MUSIC);
        if(volume>=0 && volume<=maxVolume){
            (AudioManager.STREAM_MUSIC, volume, FLAG_SHOW_UI);
            (("%s->volume:%d,maxVolume:%d",(upVolume?"upVolume":"downVolume"),volume,maxVolume));
        }
    }
}

监听耳机插入拔出的状态监听

 class HeadsetReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
            String action = ();
            switch (action){
                //插入和拔出耳机会触发此广播
                case Intent.ACTION_HEADSET_PLUG:
                    addHint(Intent.ACTION_HEADSET_PLUG);
                    int state = ("state", 0);
                    if (state == 1){
                       //耳机已插入
                        ();
                    } else if (state == 0){
                       //耳机已拔出
                    }
                    break;
            }
        }
    }