播放短促的音乐,如触摸触发的事件,可以用
MediaPlayer.create(getApplicationContext(),R.raw.higirl).start();
音乐文件要放到res/raw文件夹下。
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
指定音频流的类型:如果是非常短促的声音,在播放音频流的时候只需要申请一块非常小的内存空间就可以了;如果音频文件非常长的话,会在内存空间中申请一块缓冲区,这块缓冲区的作用是,读一段流,播放一段,播放的同时,继续往内存里面读新的流。
package com.uc.musicplayer; import java.io.File; import android.app.Activity; import android.media.AudioManager; import android.media.MediaPlayer; import android.media.MediaPlayer.OnCompletionListener; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends Activity { private EditText et_path; private MediaPlayer mediaPlayer; private Button btn_pause; private Button btn_play; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); et_path = (EditText) findViewById(R.id.et_path); btn_pause = (Button) findViewById(R.id.btn_pause); btn_play = (Button) findViewById(R.id.btn_play); } public void play(View v) { String path = et_path.getText().toString().trim(); File file = new File(path); if (file.exists()) { try { mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);// 指定音频流的类型 mediaPlayer.setDataSource(path);// 设置播放的数据源 mediaPlayer.prepare();// 准备开始播放 播放的逻辑是C代码在新的线程里执行的 mediaPlayer.start(); btn_play.setEnabled(false);// 设置播放按钮不可用 mediaPlayer.setOnCompletionListener(new OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { btn_play.setEnabled(true); } }); } catch (Exception e) { Toast.makeText(this, "播放失败!", 0).show(); e.printStackTrace(); } } else { Toast.makeText(this, "文件不存在!", 0).show(); } } public void pause(View v) { // 如果暂停按钮的文本为“继续”,说明已经暂停过了,应该执行继续播放,并设置按钮文本为“暂停” if ("继续".equals(btn_pause.getText().toString())) { mediaPlayer.start(); btn_pause.setText("暂停"); return; } // 如果正在播放状态,执行暂停,并设置按钮文本为“继续” if (mediaPlayer != null && mediaPlayer.isPlaying()) { mediaPlayer.pause(); btn_pause.setText("继续"); } } public void stop(View v) { if (mediaPlayer != null) { mediaPlayer.stop(); mediaPlayer.release(); mediaPlayer = null; } btn_play.setEnabled(true);// 设置播放按钮可用 btn_pause.setText("暂停");//设置暂停按钮文本为“暂停” } public void replay(View v) { if (mediaPlayer != null && mediaPlayer.isPlaying()) { mediaPlayer.seekTo(0); } else { play(v); } btn_pause.setText("暂停"); } }
path.startsWith("http://")
另外,播放前会有一段时间的停顿,是因为需要边下载边播放,为了解决这个问题,可以采用异步的准备方法(上面的prepare()是同步的准备方法):
mediaPlayer.prepareAsync();
同步代码:方法是按顺序执行的。
异步代码:开新的线程执行代码。
start语句也要放到mediaPlayer.setOnPreparedListener(new OnPreparedListener(){});接口中。
开发的时候,我们需要把这些方法放到服务里面。