音频播放
在 Android 中播放音频文件一般都是使用 MediaPlayer 类来实现的,它对多种格式的音
频文件提供了非常全面的控制方法,从而使得播放音乐的工作变得十分简单。下表列出了
MediaPlayer 类中一些较为常用的控制方法。
方法名 功能描述
setDataSource() 设置要播放的音频文件的位置。
prepare() 在开始播放之前调用这个方法完成准备工作。
start() 开始播放音频。(重头开始播放的,并且是再开启一个线程)
pause() 暂停播放音频。
reset() 将 MediaPlayer 对象重置到刚刚创建的状态。
seekTo() 从指定的位置开始播放音频。
stop() 停止播放音频。调用这个方法后的 MediaPlayer 对象无法再播放音频。
release() 释放掉与 MediaPlayer 对象相关的资源。
isPlaying() 判断当前 MediaPlayer 是否正在播放音频。
getDuration() 获取载入的音频文件的时长。
getCurrentPosition() 获取当前播放的位置
音乐播放结束的监听器:mediaPlayer.setOnCompletionListener
一种比较简单的播放方式,播放当前工程里的Mp3文件:音频文件放res/raw下
MediaPlayer mp = MediaPlayer.create(context, R.raw.sound_file_1);//播放当前工程文件里的音频 sound_file_1为音频文件 mp.setLooping(true);//设置为循环播放,默认为false mp.setVolume(1.0f, 1.0f);//设置音量为最大 上面的方法都可以使用,包括播放结束的监听 mp.start();
播放短音乐:
//int maxStreams参数一:表示音乐池数量 //int streamType 参数二:类型 // int srcQuality参数三:资源的质量 soundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 0); //将音乐加载到soundPool soundId = soundPool.load(this, R.raw.music, 1); //播放小音乐,不用MediaPlayer是因为mediaplayer适合播放耗时的文件,并且比较消耗资源 /** * int soundID 音乐 * float leftVolume左声道 * float rightVolume 右声道 * int priority * int loop 循环播放 * float rate 优先级 */ soundPool.play(soundId,1.0f,1.0f,1,1,1.0f);//开始播放
另一种播放内存卡里的MP3文件的方式
代码如下:
public class MainActivity extends Activity implements OnClickListener { private MediaPlayer media; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button start=(Button) findViewById(R.id.start); Button stop=(Button) findViewById(R.id.stop); Button pause=(Button) findViewById(R.id.pause); start.setOnClickListener(this); pause.setOnClickListener(this); stop.setOnClickListener(this); initMediaPlayer();//初始化 } @Override public void onClick(View v) { switch (v.getId()) { case R.id.start://开始播放 if(!media.isPlaying()){ media.start(); } break; case R.id.pause://暂停播放 if(media.isPlaying()){//如果正在播放 media.pause(); } break; case R.id.stop://结束播放 if(media.isPlaying()){ media.reset();//将 MediaPlayer 对象重置到刚刚创建的状态。 initMediaPlayer();//使得继续按播放键时能播放 } break; default: break; } } //初始化播放 public void initMediaPlayer(){ media = new MediaPlayer(); File file=new File(Environment.getExternalStorageDirectory()+File.separator+"Music","ye.mp3");//MP3文件的路径 System.out.println("该音频文件的时长:"+media.getDuration()); try { media.setDataSource(file.getPath());//指定音频文件路径 media.prepare();//进入准备状态 } catch (Exception e) { e.printStackTrace(); } } @Override protected void onDestroy() { super.onDestroy(); if(media!=null){ media.stop();//该对象无法再播放 media.release();//释放掉与该对象相关的资源 } } }
播放网络上的音乐:
/* MediaPlayer 试用起来很简单。然而,当我们将它集成在应用中时,需要特别留意一些注意点。举个例子, prepare() 这个方法可能会执行很长时间,因为它会去获取并解析多媒体文件。所以这种耗时的操作,我们 千万不要在UI线程中去执行. 这样的操作会阻塞UI线程,这是非常差的用户体验,并且有可能造成程序ANR(应用程序无响应)。 即使你觉得你的资源加载非常块,请记住任何花费 1/10 秒的操作都会造成可见的停滞,并且用户会觉得你的应用程序非常慢。 为了避免阻塞UI线程,可以开辟一个线程来准备 MediaPlayer,准备完成后通知UI线程。 可以自己写线程实现这样的异步操作,然而 MediaPlayer 提供了 prepareAsync() 方法来让我们更加容易实现这样的逻辑。 这个方法将在后台去准备多媒体的播放。当完成准备工作后,MediaPlayer.OnPreparedListener接口中的 onPrepared()方法将会执行, 这个接口是通过 setOnPreparedListener() 方法来设置的。 */ //功能:播放网络音乐 public class MainActivity extends Activity implements OnClickListener { private MediaPlayer mp; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final Button start=(Button) findViewById(R.id.start); final Button pause=(Button) findViewById(R.id.pause);//暂停播放 start.setOnClickListener(this); pause.setOnClickListener(this); mp = new MediaPlayer(); //指定网络音频资源 String url="http://192.168.56.1:8080/mp3/ye.mp3"; try { mp.setDataSource(url);//指定播放的网络资源 mp.setAudioStreamType(AudioManager.STREAM_MUSIC);//设置播放的流的类型 //mp.prepare();//这是同步的准备 mp.prepareAsync();//这是异步的准备,因为是获取网络上的音频,如果用同步会出现页面卡顿的现象 //准备完毕的监听事件 mp.setOnPreparedListener(new OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { System.out.println("歌曲播放准备完毕"); } }); //音乐播放结束的监听 mp.setOnCompletionListener(new OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { System.out.println("音乐播放完毕"); } }); }catch (Exception e) { e.printStackTrace(); } } @Override public void onClick(View v) { switch (v.getId()) { case R.id.start: if(!mp.isPlaying()){ mp.start(); }break; case R.id.pause: if(mp.isPlaying()){ mp.pause(); } break; } } }