AudioPlayer.kt 4.83 KB
Newer Older
洪国微 committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185
package com.ydl.audioim.player

import android.content.Context
import android.media.AudioAttributes
import android.media.AudioManager
import android.media.MediaPlayer
import android.os.Build


/**
 * @author jiucheng
 * @描述:音频播放
 * @Copyright Copyright (c) 2018
 * @Company 壹点灵
 * @date 2018/11/9
 */
class AudioPlayer {
    private var mPlayer: MediaPlayer? = null
    private var mContext: Context? = null
    private var audioManager: AudioManager? = null

    constructor(mContext: Context?) {
        this.mContext = mContext
        mPlayer = MediaPlayer()
        mPlayer?.setAudioStreamType(AudioManager.STREAM_VOICE_CALL)

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            var attributes = AudioAttributes.Builder()
                    .setLegacyStreamType(AudioManager.STREAM_VOICE_CALL)
                    .build()
            mPlayer?.setAudioAttributes(attributes)
        } else {
            mPlayer?.setAudioStreamType(AudioManager.STREAM_VOICE_CALL)
        }

        audioManager = mContext!!.getSystemService(Context.AUDIO_SERVICE) as AudioManager?
        audioManager?.setStreamVolume(AudioManager.STREAM_VOICE_CALL,
                audioManager!!.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL) / 2,
                AudioManager.STREAM_VOICE_CALL)
        //默认听筒模式
        audioManager?.isSpeakerphoneOn = false
    }


    /**
     * 设置音频文件
     * @param id  文件id
     */
    fun setDataSource(id: Int) {
        val file = mContext?.resources?.openRawResourceFd(id)
        if (null == file){
            return
        }
        if (mPlayer != null) {
            mPlayer?.reset()
            mPlayer?.setDataSource(file.fileDescriptor, file.startOffset, file.length)
        }
        file.close()
    }

    /**
     * 设置两个音乐文件,第一个播放一次,第二个循环播放
     */
    fun setTwoDataAndStart(startMusicId: Int, loopMusicId: Int) {
        requestFocus()
        setDataSource(startMusicId)
        mPlayer?.setOnPreparedListener {
            it.start()
        }
        mPlayer?.setOnCompletionListener {
            it.pause()
            startNext(loopMusicId)
        }
        mPlayer?.prepare()
    }

    /**
     * 播放下一首
     */
    private fun startNext(loopMusicId: Int) {
        setDataSource(loopMusicId)
        start(true, false)
    }


    /**
     * 播放
     * @param isLooping 是否重复播放
     * @param isSetOnCompletionListener 是否设置过播放完成监听
     */
    fun start(isLooping: Boolean, isSetOnCompletionListener: Boolean) {
        requestFocus()
        mPlayer?.isLooping = isLooping
        mPlayer?.setOnPreparedListener {
            it.start()
        }
        if (!isLooping && !isSetOnCompletionListener) {
            mPlayer?.setOnCompletionListener {
                it.pause()
            }
        }
        mPlayer?.prepare()
    }

    /**
     * 设置播放完成回调
     */
    fun setCompletionListener(listener: MediaPlayer.OnCompletionListener) {
        if (listener == null) {
            return
        }
        mPlayer?.setOnCompletionListener(listener)
    }


    /**
     * 切换扬声器、听筒播放方式
     * @param isSpeakerphoneOn  true 扬声器  false 听筒模式
     */
    fun switchPlayType(isSpeakerphoneOn: Boolean) {
        audioManager?.isSpeakerphoneOn = isSpeakerphoneOn
        audioManager?.mode = AudioManager.MODE_IN_CALL
    }

    /**
     * 暂停
     */
    fun pause() {
        if (mPlayer != null) {
            mPlayer?.pause()
        }
    }

    /**
     * 停止
     */
    fun stop() {
        if (mPlayer != null) {
            mPlayer?.stop()
        }
    }

    /**
     * 获取焦点
     *
     */
    fun requestFocus() {
        try {
            val result = audioManager?.requestAudioFocus(afChangeListener,
                    // Use the music stream.
                    AudioManager.STREAM_VOICE_CALL,
                    // Request permanent focus.
                    AudioManager.AUDIOFOCUS_GAIN)
        } catch (e: Exception) {

        }
    }

    fun clear() {
        if (audioManager != null) {
            audioManager?.abandonAudioFocus(afChangeListener)
        }
        if (mPlayer != null) {
            mPlayer?.stop()
            mPlayer?.release()
            mPlayer = null
        }
    }


    var afChangeListener = AudioManager.OnAudioFocusChangeListener {
        if (it == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT) {
            // Pause playback
//            pause()
        } else if (it == AudioManager.AUDIOFOCUS_GAIN) {
            // Resume playback

        } else if (it == AudioManager.AUDIOFOCUS_LOSS) {
            // mAm.unregisterMediaButtonEventReceiver(RemoteControlReceiver);
//            audioManager!!.abandonAudioFocus(afChangeListener)
//            // Stop playback
//            stop()
        }
    }
}