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