一、概述
視頻和音樂的操作思想其實都是差不多的。其中音樂的API圖已經概括了MedialPlayer的使用步驟,有兩個分支需要關注:
- 本地音樂,可以直接 setDataSource–prepare—start
- 網絡音樂,考慮到ANR,放到子線程中 setDataSource–prepareAsync–setOnPreparedListener(在其中的onPrepared方法中設置開始)–start
二、小技巧
- 涉及到暫停再播放的問題,可以用SharedPreferences,存放播放的位置,再次打開時,用seekTo跳到指定的位置。
- 爲了防止播放錯誤,可以對MediaPlayer設置錯誤的監聽事件setOnErrorListener.onError()
當播放完時,執行如下,可以設置下一曲或循環等操作
mediaPlayer.setOnCompletionListener(new OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { mp.seekTo(0); mp.start(); } }
- 停止時注意release資源
三、本地音樂操作
public class MainActivity extends Activity {
private Button start;
private Button pause;
private Button stop;
private EditText et;
private MediaPlayer mediaPlayer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
start = (Button) findViewById(R.id.start);
pause = (Button) findViewById(R.id.pause);
stop = (Button) findViewById(R.id.stop);
et = (EditText) findViewById(R.id.editText1);
}
public void start(View v){
//先拿到路徑
String path = et.getText().toString().trim();
//文件路徑不能爲空
if(TextUtils.isEmpty(path)){
Toast.makeText(this, "文件名不能爲空", 0).show();
return;
}
//文件路徑要對
if(!(new File(path).exists())||!path.endsWith(".mp3")){
Toast.makeText(this, "文件不存在或者不是音頻文件,請檢查。。。", 0).show();
return;
}
try {
//1.創建一個多媒體對象
mediaPlayer = new MediaPlayer();
//2.設置資源
mediaPlayer.setDataSource(path);
//3.準備
mediaPlayer.prepare();
//4.開始讀
mediaPlayer.start();
//5.當音頻文件有錯時,執行如下
mediaPlayer.setOnErrorListener(new OnErrorListener() {
public boolean onError(MediaPlayer mp, int what, int extra) {
return false;
}
});
//6.當播放完時,執行如下,可以設置下一曲或循環等操作
mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mp.seekTo(0);
mp.start();
}
});
} catch ( Exception e) {
e.printStackTrace();
}
}
public void pause(View v){
if(mediaPlayer.isPlaying()){
mediaPlayer.pause();
}else {
mediaPlayer.start();
}
}
public void stop(View v){
if (mediaPlayer != null){
mediaPlayer.stop();
mediaPlayer.seekTo(0);
mediaPlayer.release();
}
}
}
四、網絡音樂的操作
public class MainActivity extends Activity {
private EditText et;
private MediaPlayer mediaPlayer;
private ProgressDialog dialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et = (EditText) findViewById(R.id.editText1);
dialog = new ProgressDialog(this);
dialog.setMessage("正在拼命加載中。。。");
}
public void start(View v){
//先拿到路徑
String path = et.getText().toString().trim();
if(TextUtils.isEmpty(path)){
Toast.makeText(this, "文件名不能爲空", 0).show();
return;
}
try {
//1.創建一個多媒體對象
mediaPlayer = new MediaPlayer();
//2.設置資源
mediaPlayer.setDataSource(path);
//3.用異步去準備,從而讓子線程去執行
dialog.show();
mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
//4.準備
try {
mediaPlayer.start();
dialog.dismiss();
} catch ( Exception e) {
e.printStackTrace();
}
//4.開始讀
}
});
//5.當音頻文件有錯時,執行如下
mediaPlayer.setOnErrorListener(new OnErrorListener() {
public boolean onError(MediaPlayer mp, int what, int extra) {
return false;
}
});
//6.當播放完時,執行如下,可以設置下一曲或循環等操作
mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mp.seekTo(0);
mp.start();
}
});
} catch ( Exception e) {
e.printStackTrace();
}
}
public void pause(View v){
if(mediaPlayer.isPlaying()){
mediaPlayer.pause();
}else {
mediaPlayer.start();
}
}
public void stop(View v){
if (mediaPlayer != null){
mediaPlayer.stop();
mediaPlayer.seekTo(0);
mediaPlayer.release();
}
}
}