Android 音乐播放器有很多种方式,首先由一个音乐播放器:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
//进度条
<SeekBar
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/main_seekbar"
android:layout_weight="1"
/>
//播放按钮
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@android:drawable/ic_media_play"
android:onClick="isPlayorPauser"/>
</LinearLayout>
第一种就是播放应用内的音频文件,将你需要播放的音频文件放入Raw文件中,调用MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.cd);取到raw文件中的音频,再用MediaPlayer 的准备完成的监听事件mediaPlayer.setOnPreparedListener() 中播放,mediaPlayer.start();方法。
第二种是内存卡里面音频文件,首先实例化 MediaPlayer mediaPlayer = new MediaPlayer();再设置属性。准备方法: mediaPlayer.prepare();
第三种是播放网络音乐(Tomcat),需要配置Tomcat,再一步准备:mediaPlayer.prepareAsync();
public class MainActivity extends AppCompatActivity {
private SeekBar main_seekbar;
private MediaPlayer mediaPlayer;
private SurfaceView main_surfaceview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
main_seekbar = (SeekBar) findViewById(R.id.main_seekbar);
//得到视频播放器
main_surfaceview = (SurfaceView) findViewById(R.id.main_surfaceview);
//给进度条设置点击拖动事件
main_seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
//获取拖动的进度 给mediaPlayer设置进度
int length=main_seekbar.getProgress();
mediaPlayer.seekTo(length);
}
});
}
public void isPlayorPauser(View view) throws Exception{
final ImageButton imageButton= (ImageButton) view;
//如果mediaPlayer有值
if (mediaPlayer==null) {
//播放应用内的音频文件
//mediaPlayer = MediaPlayer.create(this, R.raw.cd);
//播放内存卡里面音频文件
mediaPlayer = new MediaPlayer();
//设置音频流的类型
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
//设置音源
mediaPlayer.setDataSource(this, Uri.parse("file://mnt/sdcard/kugou/mv/nlch.mp4"));
//准备一下(内存卡)
mediaPlayer.prepare();
/* //播放网络音乐(Tomcat)
mediaPlayer.setDataSource(this, Uri.parse("http://192.168.43.135/internet.mp3"));
//准备(异步准备)
mediaPlayer.prepareAsync();*/
//设置准备完成的监听
// mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
// @Override
// public void onPrepared(MediaPlayer mediaPlayer) {
//将媒体播放器的捕捉的画面展示到surfaceView
mediaPlayer.setDisplay(main_surfaceview.getHolder());
//开始播放
mediaPlayer.start();
//设置按钮改变图片
imageButton.setImageResource(android.R.drawable.ic_media_pause);
//获取音乐的播放时长
int duration=mediaPlayer.getDuration();
//设置进度条的最大值(音乐的播放时长)
main_seekbar.setMax(duration);
new MyThread().start();
// }
// });
}else if (mediaPlayer.isPlaying()){
//开始就关闭
mediaPlayer.pause();
imageButton.setImageResource(android.R.drawable.ic_media_play);
}else{
//关闭就开始
mediaPlayer.start();
imageButton.setImageResource(android.R.drawable.ic_media_pause);
}
}
class MyThread extends Thread{
@Override
public void run() {
super.run();
//判断拖动长度是否小于seekbar的最大长度
if (main_seekbar.getProgress()<=main_seekbar.getMax()){
//获取音乐的当前播放位置
int c=mediaPlayer.getCurrentPosition();
//设置seekbar的位置
main_seekbar.setProgress(c);
}
}
}
}
最后,我在说一个控件,叫音频池(SoundPool),虽然已经过时。但是还可以用。用来做一些混音。有兴趣的可以了解下:
public class SoundPoolActivity extends AppCompatActivity {
private SoundPool soundPool;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_soundpool);
//实例化音频池
soundPool = new SoundPool(4, AudioManager.STREAM_MUSIC,0);
//设置监听事件(加载音频)
soundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
@Override
public void onLoadComplete(SoundPool soundPool, int i, int i1) {
//播放
soundPool.play(i,1,1,1,-1,1);
}
});
}
public void playKFC(View view){
soundPool.load(this,R.raw.rooster,1);
}
public void playTwo(View view){
soundPool.load(this,R.raw.chimp,1);
}
public void playThree(View view){
soundPool.load(this,R.raw.crickets,1);
}
public void playFour(View view){
soundPool.load(this,R.raw.roar,1);
}
public void playDog(View view){
soundPool.load(this,R.raw.dogbark,1);
}
@Override
protected void onDestroy() {
super.onDestroy();
//退出应用程序时关闭音频池
if(soundPool!=null){
soundPool.release();
soundPool=null;
}
}
}