android使用MediaPlayer加AudioManager 封装播放音乐,外加切换蓝牙,耳机,内放,外放

时间:2025-01-26 17:56:12

项目需要 写了个音乐播放器,要适配本地声音和网络获取的声音,而且切换评率非常高,而且老板总喜欢带蓝牙耳机,所以输出音频要根据设备关联 我这边给大家提供一个简单的工具 

public class BgmPlayer {

    private final MediaPlayer mMediaPlayer;
    private  AudioManager mAudioManager;
    private final BluetoothAdapter ba;

    private boolean mPlay;
    private boolean mPause;
    private boolean LooPing = true;
    private Context context;
    private final  mFocusChangeListener;

    public BgmPlayer(Context context) {
         = context;
        mMediaPlayer = new MediaPlayer();

        mAudioManager = (AudioManager) (Context.AUDIO_SERVICE);
//        if (()) {
//            changeToHeadset();
//
//        } else {
//            changeToSpeaker();
//
//        }

        ba = ();
        if (ba == null) {
//         isBlueCon = -1;     //error
            //return -1;
        } else if (()) {
            int a2dp = (BluetoothProfile.A2DP);              //可操控蓝牙设备,如带播放暂停功能的蓝牙耳机
            int headset = ();        //蓝牙头戴式耳机,支持语音输入输出
            int health = ();          //蓝牙穿戴式设备

            //查看是否蓝牙是否连接到三种设备的一种,以此来判断是否处于连接状态还是打开并没有连接的状态
            int flag = -1;
            if (a2dp == BluetoothProfile.STATE_CONNECTED) {
                flag = a2dp;
            } else if (headset == BluetoothProfile.STATE_CONNECTED) {
                flag = headset;
            } else if (health == BluetoothProfile.STATE_CONNECTED) {
                flag = health;
            }
            //说明连接上了三种设备的一种
            if (flag != -1) {
//            isBlueCon = 1;            //connected
                //  return 2;
                changeToSpeaker();//蓝牙

            }
        }


        mFocusChangeListener = new () {
            @Override
            public void onAudioFocusChange(int focusChange) {
                if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT) {
                    pause();
                }
            }
        };
    }

    /**
     * 切换到外放  连接设备
     */
    public void changeToSpeaker() {
        ("tag", "切换到外放");
        (AudioManager.MODE_NORMAL);
        (true);
    }

    /**
     * 切换到耳机模式
     */
    public void changeToHeadset() {
        ("tag", "切换到内放");
        (false);
    }

    /**
     * 切换到听筒  手机自带喇叭
     */
    public void changeToReceiver() {
        (false);
        if (.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            (AudioManager.MODE_IN_COMMUNICATION);
        } else {
            (AudioManager.MODE_IN_CALL);
        }
    }

    public boolean isPlay() {
        return mPlay;
    }

    public boolean isPause() {
        return mPause;
    }

    public void play(String url) {
        LooPing = true;
        mPlay = false;

        ("播放=" + url);

        if ((url)) {
            return;
        }
        initPlayerAndPlay(url);
    }

    public void plays(String url, boolean LooPing) {
         = LooPing;
        mPlay = false;

        ("播放=" + url);

        if ((url)) {
            return;
        }
        mAudioManager = (AudioManager) (Context.AUDIO_SERVICE);
        changeToSpeaker();
        initPlayerAndPlay(url);
    }

    private void initPlayerAndPlay(String url) {

        mPause = false;

        String md5 = Md5Util.md5(url);
        File dstFile = getDstFile(md5);
        if (()) {
            playLocal(dstFile);
        } else {
            downLoad(url, md5, dstFile);
            playNet(url);
        }
    }

    private void playLocal(File dstFile) {
        try {
            ("TAG", "开始");
            (LooPing);//是否循环播放
            (());//通过一个具体的路径来设置MediaPlayer的数据源,path可以是本地的一个路径,也可以是一个网络路径
            (AudioManager.STREAM_MUSIC);
            (); //准备播放  
            ();//开始播放
            mPlay = true;
            requestPermanentAudioFocus(true, mFocusChangeListener);
        } catch (IOException e) {
            ();
            ();
            requestPermanentAudioFocus(false, mFocusChangeListener);
        }
    }

    private void playNet(String url) {
        try {
            (LooPing);
            (url);
            (AudioManager.STREAM_MUSIC);//手机音乐的声音
            (); //异步准备播放
            (new () {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    ();//开始播放  
                    mPlay = true;
                    requestPermanentAudioFocus(true, mFocusChangeListener);
                }
            });
        } catch (IOException e) {
            ();
            ();
            requestPermanentAudioFocus(false, mFocusChangeListener);
        }
    }

    public void resume() {
        if (mPlay && mPause) {
            ();
            mPause = false;
            requestPermanentAudioFocus(true, mFocusChangeListener);
        }
    }


    public void pause() {
        if (mPlay) {
            ();
            mPause = true;
            requestPermanentAudioFocus(false, mFocusChangeListener);
        }
    }

    public void stop() {
        mPlay = false;
        ();
        ();
        ();
        requestPermanentAudioFocus(false, mFocusChangeListener);
    }

    public void release() {
        ("TAG", "退出房间,音频关闭");
        mPlay = false;
        ();
        ();
        requestPermanentAudioFocus(false, mFocusChangeListener);
    }

    private File getDstFile(String mds) {
        File dstDir = ("bgms");
        File dstFile = new File(dstDir, mds + ".bgm");
        return dstFile;
    }

    private void downLoad(String url, String md5, final File dstFile) {
        File tempDir = ("tmp_bgms");
        String tempName = md5 + ".tmp";
        File tempFile = new File(tempDir, tempName);
        ();
        OkGo.<File>get(url).execute(new FileCallback((), tempName) {
            @Override
            public void onSuccess(Response<File> response) {

                ("下载完毕");

                File body = ();
                (dstFile);
            }
        });
    }

    /**
     * 获取永久的音频焦点
     *
     * @param request
     * @return
     */
    public boolean requestPermanentAudioFocus(boolean request,
                                               listener) {
        if (request) {
            int result = (listener, AudioManager.STREAM_MUSIC,
                    AudioManager.AUDIOFOCUS_GAIN);
            return result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED;
        } else {
            int result = (listener);
            return result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED;
        }
    }

    /**
     * 获取短暂的音频焦点
     *
     * @param request
     * @return
     */
    public boolean requestTransientAudioFocus(boolean request,
                                               listener) {
        if (request) {
            int result = (listener, AudioManager.STREAM_MUSIC,
                    AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
            return result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED;
        } else {
            int result = (listener);
            return result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED;
        }
    }
}

注册代码

mBgmPlayer = new BgmPlayer(());

使用的时候直接

if (!()) {
    (url);//循环播放
}
();暂停 
();销毁
(url,false);不循环播放