1)如何获得MediaPlayer实例: 可以使用直接new的方式: MediaPlayer mp = new MediaPlayer(); 也可以使用create的方式,如: MediaPlayer mp = MediaPlayer.create(this, R.raw.test);//这时就不用调用setDataSource了 2) 如何设置要播放的文件: MediaPlayer要播放的文件主要包括3个来源: a. 用户在应用中事先自带的resource资源 例如:MediaPlayer.create(this, R.raw.test); b. 存储在SD卡或其他文件路径下的媒体文件 例如:mp.setDataSource("/sdcard/test.mp3"); c. 网络上的媒体文件 例如:mp.setDataSource("http://www.citynorth.cn/music/confucius.mp3"); MediaPlayer的setDataSource一共四个方法: setDataSource (String path) setDataSource (FileDescriptor fd) setDataSource (Context context, Uri uri) setDataSource (FileDescriptor fd, long offset, long length) 其中使用FileDescriptor时,需要将文件放到与res文件夹平级的assets文件夹里,然后使用: AssetFileDescriptor fileDescriptor = getAssets().openFd("rain.mp3"); m_mediaPlayer.setDataSource(fileDescriptor.getFileDescriptor(),fileDescriptor.getStartOffset(), fileDescriptor.getLength()); 来设置datasource 3)对播放器的主要控制方法: Android通过控制播放器的状态的方式来控制媒体文件的播放,其中: prepare()和prepareAsync() 提供了同步和异步两种方式设置播放器进入prepare状态,需要注意的是,如果MediaPlayer实例是由create方法创建的,那么第一次启动播放前不需要再调用prepare()了,因为create方法里已经调用过了。 start()是真正启动文件播放的方法, pause()和stop()比较简单,起到暂停和停止播放的作用,
seekTo()是定位方法,可以让播放器从指定的位置开始播放,需要注意的是该方法是个异步方法,也就是说该方法返回时并不意味着定位完成,尤其是播放的网络文件,真正定位完成时会触发OnSeekComplete.onSeekComplete(),如果需要是可以调用setOnSeekCompleteListener(OnSeekCompleteListener)设置监听器来处理的。 release()可以释放播放器占用的资源,一旦确定不再使用播放器时应当尽早调用它释放资源。 reset()可以使播放器从Error状态中恢复过来,重新会到Idle状态。
4)设置播放器的监听器: MediaPlayer提供了一些设置不同监听器的方法来更好地对播放器的工作状态进行监听,以期及时处理各种情况, 如: setOnCompletionListener(MediaPlayer.OnCompletionListener listener)、 setOnErrorListener(MediaPlayer.OnErrorListener listener) 等,设置播放器时需要考虑到播放器可能出现的情况设置好监听和处理逻辑,以保持播放器的健壮性。
下面是一个结合seekbar而简易实现的在线播放和下载功能的音乐播放器demo
效果实现:
本篇 博客是在多线程下载那篇博客增加在线播放音乐实现,下面是提供项目下载地址:
下面介绍具体实现过程:
定义一个具有缓冲效果的播放器:Player
我们看到的缓冲效果,是通过设置拖动条SeekBar的二级进度实现的,这就要设置MediaPlayer的缓冲更新的监听了。
具体代码实现:
package com.wwj.download; import java.io.File; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import android.app.Activity; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.os.Message; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.ProgressBar; import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.TextView; import android.widget.Toast; import com.wwj.download.util.Player; import com.wwj.net.download.DownloadProgressListener; import com.wwj.net.download.FileDownloader; public class MainActivity extends Activity { private static final int PROCESSING = 1 ; private static final int FAILURE = - 1 ; private EditText pathText; private TextView resultView; private Button downloadButton; private Button stopButton; private ProgressBar progressBar; private Button playBtn; private Player player; private SeekBar musicProgress; private Handler handler = new UIHandler(); private final class UIHandler extends Handler { public void handleMessage(Message msg) { switch (msg.what) { case PROCESSING: progressBar.setProgress(msg.getData().getInt("size" )); float num = ( float ) progressBar.getProgress() / (float ) progressBar.getMax(); int result = ( int ) (num * 100 ); resultView.setText(result + "%" ); if (progressBar.getProgress() == progressBar.getMax()) { Toast.makeText(getApplicationContext(), R.string.success, Toast.LENGTH_LONG).show(); } break ; case FAILURE: Toast.makeText(getApplicationContext(), R.string.error, Toast.LENGTH_LONG).show(); break ; } } } @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.main); pathText = (EditText) findViewById(R.id.path); resultView = (TextView) findViewById(R.id.resultView); downloadButton = (Button) findViewById(R.id.downloadbutton); stopButton = (Button) findViewById(R.id.stopbutton); progressBar = (ProgressBar) findViewById(R.id.progressBar); ButtonClickListener listener = new ButtonClickListener(); downloadButton.setOnClickListener(listener); stopButton.setOnClickListener(listener); playBtn = (Button) findViewById(R.id.btn_online_play); playBtn.setOnClickListener(listener); musicProgress = (SeekBar) findViewById(R.id.music_progress); player = new Player(musicProgress); musicProgress.setOnSeekBarChangeListener(new SeekBarChangeEvent()); } private final class ButtonClickListener implements View.OnClickListener { @Override public void onClick(View v) { switch (v.getId()) { case R.id.downloadbutton: String path = pathText.getText().toString(); String filename = path.substring(path.lastIndexOf('/' ) + 1 ); try { filename = URLEncoder.encode(filename, "UTF-8" ); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } path = path.substring(0 , path.lastIndexOf( "/" ) + 1 ) + filename; if (Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { File savDir = Environment.getExternalStorageDirectory(); download(path, savDir); } else { Toast.makeText(getApplicationContext(), R.string.sdcarderror, Toast.LENGTH_LONG).show(); } downloadButton.setEnabled(false ); stopButton.setEnabled(true ); break ; case R.id.stopbutton: exit(); Toast.makeText(getApplicationContext(), "Now thread is Stopping!!" , Toast.LENGTH_LONG).show(); downloadButton.setEnabled(true ); stopButton.setEnabled(false ); break ; case R.id.btn_online_play: new Thread( new Runnable() { @Override public void run() { player.playUrl(pathText.getText().toString()); } }).start(); break ; } } private DownloadTask task; private void exit() { if (task != null ) task.exit(); } private void download(String path, File savDir) { task = new DownloadTask(path, savDir); new Thread(task).start(); } private final class DownloadTask implements Runnable { private String path; private File saveDir; private FileDownloader loader; public DownloadTask(String path, File saveDir) { this .path = path; this .saveDir = saveDir; } public void exit() { if (loader != null ) loader.exit(); } DownloadProgressListener downloadProgressListener = new DownloadProgressListener() { @Override public void onDownloadSize( int size) { Message msg = new Message(); msg.what = PROCESSING; msg.getData().putInt("size" , size); handler.sendMessage(msg); } }; public void run() { try { loader = new FileDownloader(getApplicationContext(), path, saveDir, 3 ); progressBar.setMax(loader.getFileSize()); loader.download(downloadProgressListener); } catch (Exception e) { e.printStackTrace(); handler.sendMessage(handler.obtainMessage(FAILURE)); } } } } class SeekBarChangeEvent implements OnSeekBarChangeListener { int progress; @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { this .progress = progress * player.mediaPlayer.getDuration() / seekBar.getMax(); } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { player.mediaPlayer.seekTo(progress); } } @Override protected void onDestroy() { super .onDestroy(); if (player != null ) { player.stop(); player = null ; } } }