Android音频管理类MediaPlayer的使用

Android音频管理类MediaPlayer的使用

源码传送门,本篇文章将通过简单的示例,介绍如何播放SD卡,网络,项目音频的使用,项目使用kt语言,Studio最新稳定版4.4

播放音乐

网络音频播放

播放网络音频之前先添加网络权限

 

具体播放代码

   /**
     * 放网络音频
     * http://sc1.111ttt.cn:8282/2018/1/03m/13/396131229550.m4a?tflag=1546606800&pin=97bb2268ae26c20fe093fd5b0f04be80#.mp3
     * 1,添加网络权限
     */
    private fun playNet() {
        //2,创建MediaPlayer
        val media = MediaPlayer()
        //3,重置ediaPlayer
        media.reset()
        //4,设置播放源
        media.setDataSource("http://sc1.111ttt.cn:8282/2018/1/03m/13/396131229550.m4a?tflag=1546606800&pin=97bb2268ae26c20fe093fd5b0f04be80#.mp3")
        //5,激活MediaPlayer
        media.prepare()
        //6,开始播放
        media.start()
    }

项目raw文件夹下音乐播放

首先在res下创建raw文件夹,放入音乐文件

    //延迟初始化
    private lateinit var mediaPlayer: MediaPlayer
    /**
     * 播放raw文件夹下的music.mp3文件
     */
    private fun playRaw() {
        //通过create方法创建的MediaPlayer对象不需要再调用prepare方法了
        //因为在create中已经调用过prepare方法了,再次调用反而会报错
        //R.raw.music
        mediaPlayer = MediaPlayer.create(this, R.raw.music)
        mediaPlayer.start()
    }

    /**
     * 在离开的时候将MediaPlayer销毁
     */
    override fun onDestroy() {
        super.onDestroy()
        //mediaPlayer.pause()//暂停播放
        mediaPlayer.stop()
        mediaPlayer.release()
    }

SD卡播放

我们需要获取手机外部存储的路径(但由于现在手机大多没有外置存储了,所以说是外部存储,其实还是手机本身的存储空间)

    val externalStorageDirectory = Environment.getExternalStorageDirectory()

这里的路径打印出来是这样的:/storage/emulated/0

那究竟是哪里?Stuido3.0后查看文件从DDMS变成了右下角的Device File Explorere

Android音频管理类MediaPlayer的使用_第1张图片
文件管理.png

我们点击上图中的Upload就可以导入我们想要播放的音乐文件了,如果要到手机查看,以小米系统为例,是打开文件管理-手机-内部存储设备,这最外层就是我们得/storage/emulated/0了

Android音频管理类MediaPlayer的使用_第2张图片
手机文件管理.png

由于Android6.0以上读取外部存储需要动态权限处理,我们需要提前申请好权限

   

具体代码

//权限动态申请
if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                    ActivityCompat.requestPermissions(this, arrayOf(android.Manifest.permission.WRITE_EXTERNAL_STORAGE), 1)
                } else {
                    initSD()
                }

具体播放逻辑

        /**
         * 播放SD卡的资源文件
         */
        private fun initSD() {
            //1,创建Mediaplayer对象
            val media = MediaPlayer()
            //2,重置
            media.reset()//重置
            //3,设置播放源
            val externalStorageDirectory = Environment.getExternalStorageDirectory()
            val s = "$externalStorageDirectory/music.mp3"
            Log.d("tonjies","最終文件的播放源:$s")
            media.setDataSource(s)
            //4,进入准备状态
            media.prepare()
            //5,播放音乐
            media.start()
        }

通过服务来播放音乐

创建服务

/**
 * Created by 舍长
 * describe:通过服务来播放音乐
 */
class MyService : Service() {

    override fun onBind(intent: Intent): IBinder {
        return Binder()
    }


    //延迟初始化
    private lateinit var mediaPlayer: MediaPlayer
    /**
     * 播放raw文件夹下的music.mp3文件
     */
    private fun playRaw() {
        //通过create方法创建的MediaPlayer对象不需要再调用prepare方法了
        //因为在create中已经调用过prepare方法了,再次调用反而会报错
        //R.raw.music
        mediaPlayer = MediaPlayer.create(this, R.raw.music)
        mediaPlayer.start()
    }

    override fun onCreate() {
        super.onCreate()
        playRaw()
    }
}

在Activity中启动服务,服务就会调用onCreate方法来播放音乐了

   btn_01.setOnClickListener {
          //启动服务
          startService(Intent(this,MyService::class.java))
  }

这样就可以播放音乐了,但是这样会产生一个问题,我们把应用关掉退出后,音乐还是会继续播放,在Service加入这个方法就可以了

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        return START_NOT_STICKY
    }

    override fun onDestroy() {
        super.onDestroy()
        mediaPlayer.stop()
        mediaPlayer.release()
    }

AudioManager

该类可以为音乐的播放设置音量的大小,是否静音


import android.app.Service
import android.content.Intent
import android.media.AudioManager
import android.os.Build
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.support.annotation.RequiresApi
import android.view.View
import kotlinx.android.synthetic.main.activity_audio.*

/**
 * Created by 舍长
 * describe:AudioManager的使用
 */
class AudioActivity : AppCompatActivity(), View.OnClickListener {


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_audio)
        btnUp.setOnClickListener(this)
        btnDown.setOnClickListener(this)
        btnMute.setOnClickListener(this)
        btnUnMute.setOnClickListener(this)
        btn_01.setOnClickListener {
            //启动服务
            startService(Intent(this, MyService::class.java))
        }
    }

    @RequiresApi(Build.VERSION_CODES.M)
    override fun onClick(v: View?) {
        //1,获取声音管理器
        var manager = getSystemService(Service.AUDIO_SERVICE) as AudioManager
        //2,操作
        when (v?.id) {
            //增大声音
            R.id.btnUp -> {
                //ADJUST_RAISE升高声音 对应的还有ADJUST_LOWER降低声音
                //AudioManager.FLAG_SHOW_UI 显示系统调节声音进度条,FLAG_PLAY_SOUND只有提示音
                manager.adjustStreamVolume(
                    AudioManager.STREAM_MUSIC,
                    AudioManager.ADJUST_RAISE,
                    AudioManager.FLAG_SHOW_UI
                )
            }
            //减小声音
            R.id.btnDown -> {
                //ADJUST_RAISE升高声音 对应的还有ADJUST_LOWER降低声音
                //AudioManager.FLAG_SHOW_UI 显示系统调节声音进度条,FLAG_PLAY_SOUND只有提示音
                manager.adjustStreamVolume(
                    AudioManager.STREAM_MUSIC,
                    AudioManager.ADJUST_LOWER,
                    AudioManager.FLAG_SHOW_UI
                )
            }
            //静音
            R.id.btnMute -> {
                //API>=23
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    manager.adjustStreamVolume(
                        AudioManager.STREAM_MUSIC,
                        AudioManager.ADJUST_MUTE,
                        AudioManager.FLAG_SHOW_UI
                    )
                }else{
                    //API<23
                    manager.setStreamMute(AudioManager.STREAM_MUSIC, true)
                }
            }
            //非静音
            R.id.btnUnMute -> {
                //API>=23
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    manager.adjustStreamVolume(
                        AudioManager.STREAM_MUSIC,
                        AudioManager.ADJUST_MUTE,
                        AudioManager.FLAG_SHOW_UI
                    )
                }else{
                    //API<23
                    manager.setStreamMute(AudioManager.STREAM_MUSIC, false)
                }
            }
        }
    }
}

你可能感兴趣的:(Android音频管理类MediaPlayer的使用)