通过mediaPlayer实现音乐播放有三种方式:项目中raw、手机内存、网络。以下是我通过这三种方式实现音乐播放的demo,不足的地方,希望大家提出来,交流交流
首先是我们在读取手机上的音源时需要一些权限所以在清单文件中加入:`
接下来是布局文件:activity_main.xml
<SeekBar
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/main_seekBar"
android:layout_weight="0.04" />
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@android:drawable/ic_media_play"
android:onClick="playOrPause"
android:id="@+id/main_ib_button"
/>
最后最重要的是:MainActivity
package com.example.g150825_playmusic;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Environment;
import android.os.SystemClock;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ImageButton;
import android.widget.SeekBar;
import java.io.IOException;
public class MainActivity extends AppCompatActivity {
private ImageButton main_ib_button;
private MediaPlayer mediaPlayer;
private SeekBar main_seekBar;
private Boolean isplay=false;
private Mythred mythred;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
main_ib_button = (ImageButton) findViewById(R.id.main_ib_button);
main_seekBar = (SeekBar) findViewById(R.id.main_seekBar);
//给进度条设置监听(以次来实现快进功能)
main_seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
//首先获取seekbar拖动后的位置
int progress=main_seekBar.getProgress();
//跳转到某个位置播放
mediaPlayer.seekTo(progress);
}
});
}
public void playOrPause(View view){
if(mediaPlayer==null) {
isplay=true;
//0.1 播放raw中的音乐(在项目的res下新建的文件夹raw)
// mediaPlayer = MediaPlayer.create(this, R.raw.yang);
// mediaPlayer.start();
// //改变图标(实现暂停)
// main_ib_button.setImageResource(android.R.drawable.ic_media_pause);
// //获得音乐总时长
// int lengthoftime = mediaPlayer.getDuration();
// main_seekBar.setMax(lengthoftime);
// //开启线程\
// mythred = new Mythred();
// mythred.start();
//
// //播放完之后停止线程
// //设置媒体播放器的监听
// mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
// @Override
// public void onCompletion(MediaPlayer mp) {
// isplay = false;
// mythred = null;
// main_ib_button.setImageResource(android.R.drawable.ic_media_play);
// }
// });
//0.2 播放手机内存中的音乐
// 第一步判断是否有内存卡
// if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
// //得到内存卡的根目录
// String sdPath = Environment.getExternalStorageDirectory().getAbsolutePath();
// String musicPath = sdPath + "/music11/白若溪 - 无处安放.mp3";
//
// mediaPlayer=new MediaPlayer();
// //设置音频流的类型
// mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
// //设置音源
// try {
// mediaPlayer.setDataSource(this, Uri.parse("file://"+musicPath));
// //准备
// mediaPlayer.prepare();
// } catch (IOException e) {
// e.printStackTrace();
// }
//
//
// mediaPlayer.start();
// //改变图标(实现暂停)
// main_ib_button.setImageResource(android.R.drawable.ic_media_pause);
// //获得音乐总时长
// int lengthoftime = mediaPlayer.getDuration();
// main_seekBar.setMax(lengthoftime);
// //开启线程\
new Mythred().start();
// mythred = new Mythred();
// mythred.start();
//
// //播放完之后停止线程
// //设置媒体播放器的监听
// mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
// @Override
// public void onCompletion(MediaPlayer mp) {
// isplay = false;
// mythred = null;
// main_ib_button.setImageResource(android.R.drawable.ic_media_play);
// }
// });
//
// }
// 0.3 从网络播放音乐(tomcat中)
mediaPlayer=new MediaPlayer();
//设置音频流的类型
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
//设置音源
try {
//这是你电脑中tomcat中webapps中的ROOT里面的音乐
mediaPlayer.setDataSource(this, Uri.parse("http://192.168.120.101:8080/musiclove.mp3"));
//异步准备
mediaPlayer.prepareAsync();
} catch (IOException e) {
e.printStackTrace();
}
//准备完成的监听
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mediaPlayer.start();
//改变图标(实现暂停)
main_ib_button.setImageResource(android.R.drawable.ic_media_pause);
//获得音乐总时长
int lengthoftime = mediaPlayer.getDuration();
main_seekBar.setMax(lengthoftime);
//开启线程\
mythred = new Mythred();
mythred.start();
mediaPlayer.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() {
@Override
public void onBufferingUpdate(MediaPlayer mp, int percent) {
//得到缓冲值
int secendProssed= mediaPlayer.getDuration()/100*percent;
//设置第二进度
main_seekBar.setSecondaryProgress(secendProssed);
}
});
}
});
//播放完之后停止线程
//设置媒体播放器的监听
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
isplay = false;
mythred = null;
main_ib_button.setImageResource(android.R.drawable.ic_media_play);
}
});
}else if (mediaPlayer.isPlaying()){
isplay=false;
mediaPlayer.pause();
//改变图标(实现播放)
main_ib_button.setImageResource(android.R.drawable.ic_media_play);
//当停止播放时线程也停止了(这样也可以减少占用的内存)
mythred=null;
}else {
isplay=true;
mediaPlayer.start();
//改变图标(实现暂停)
main_ib_button.setImageResource(android.R.drawable.ic_media_pause);
mythred = new Mythred();
mythred.start();
}
}
class Mythred extends Thread{
@Override
public void run() {
super.run();
while(main_seekBar.getProgress()<=main_seekBar.getMax()){
//设置进度条的进度
//得到当前音乐的播放位置
int currentPosition=mediaPlayer.getCurrentPosition();
Log.i("test","currentPosition"+currentPosition);
main_seekBar.setProgress(currentPosition);
//让进度条每一秒向前移动
SystemClock.sleep(1000);
if (!isplay){
break;
}
}
}
}
}
在MainActivity中的playOrPause方法中共有三种播放方式,第三种网络的方式是借助tomcat拿的数据