android基础--音乐播放器

来源:互联网 发布:array shift php 编辑:程序博客网 时间:2024/06/05 00:28
 

用Activity实现音乐播放器,播放存入SD卡的MP3文件。

注意的点:

1.实现播放,暂停,重播,停止:

       暂停时按钮变为“继续”,播放后再点击变为“暂停”,

       重播时,如果正在播放则重新播放,否则直接播放

2.有电话打进来的时候要暂停播放,通话结束后继续播放。

Main.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="vertical"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    >

    <TextView 

    android:layout_width="fill_parent"

       android:layout_height="wrap_content"

    android:text="@string/filename"/>

    <EditText

    android:layout_width="fill_parent"

    android:layout_height="wrap_content"

    android:text="xxx.mp3"

    android:id="@+id/filename"/>

    <LinearLayout

    android:orientation="horizontal"

    android:layout_width="fill_parent"

    android:layout_height="wrap_content">

    <Button

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="@string/play"

        android:id="@+id/playbutton"/>

    <Button

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="@string/pause"

        android:id="@+id/pausebutton"/>

    <Button

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="@string/reset"

        android:id="@+id/resetbutton"/>

    <Button

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="@string/stop"

        android:id="@+id/stopbutton"/>

    </LinearLayout>

</LinearLayout>

MainActivity.java

public class MainActivity extends Activity {

       private EditText eFileName;

       private File audioFile;

       private MediaPlayer mediaPlayer;

       private int position;

      

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

       

        eFileName = (EditText) this.findViewById(R.id.filename);//找到文本框要播放的文件的名称

        Button playButton = (Button) this.findViewById(R.id.playbutton);//找到按钮

        Button pauseButton = (Button) this.findViewById(R.id.pausebutton);//找到按钮

        Button resetButton = (Button) this.findViewById(R.id.resetbutton);//找到按钮

        Button stopButton = (Button) this.findViewById(R.id.stopbutton);//找到按钮

        ButtonClickListener listener = new ButtonClickListener();

        playButton.setOnClickListener(listener);

        pauseButton.setOnClickListener(listener);

        resetButton.setOnClickListener(listener);

        stopButton.setOnClickListener(listener);

    }

    //如果正在播放音乐,有电话打进来了,我们要暂停音乐播放,这时要重写onPause()方法来解决这个问题,

    //因为打电话的Activity覆盖了当前MainActivity,而不管覆盖还是半覆盖,都会调用onPause()方法

    protected void onPause() {

           if(mediaPlayer.isPlaying()){

                  position = mediaPlayer.getCurrentPosition();//取得当前播放进度,以便于挂断电话后继续播放

                  mediaPlayer.stop();

           }

           super.onPause();

       }

    //挂断电话后要继续播放音乐,重写onResume方法。

    //因为不管MainActivity是停止状态还是暂停状态,要回到运行状态必然会调用onResume方法

    protected void onResume() {

           if(audioFile != null && position >0){

                  try {

                            play();

                            mediaPlayer.seekTo(position);//从onPause中暂停的位置播放

                            position = 0;//把播放位置重置为0

                     } catch (IOException e) {

                            e.printStackTrace();

                     }

           }

           super.onResume();

       }

    //如果电话打进来后,内存不足,把音乐播放器的MainActivity杀死掉,那么要用onSaveInstanceState()方法来保存播放器Activity中的数据

       protected void onSaveInstanceState(Bundle outState) {

              outState.putInt("position", position);//保存播放进度

              if(audioFile!=null){

                     outState.putString("path", audioFile.getAbsolutePath());//保存播放的音乐文件路径

              }

              super.onSaveInstanceState(outState);

       }

       //打电话结束后,重新创建了播放器Activity,调用onRestoreInstanceState方法,

       //所以重写该方法,还原杀死播放器时候保存的数据

       protected void onRestoreInstanceState(Bundle savedInstanceState) {

              position = savedInstanceState.getInt("position");//还原播放进度

              String path = savedInstanceState.getString("path");//还原保存的播放文件路径

              if(path!=null){

                     audioFile = new File(path);

              }

              super.onRestoreInstanceState(savedInstanceState);

       }

 

       private void play() throws IOException {

           mediaPlayer.reset();//清除,以备多次播放

              mediaPlayer.setDataSource(audioFile.getAbsolutePath());//设置要播放的文件的路径

              mediaPlayer.prepare();//准备

              mediaPlayer.start();//开始播放

       }

 

      

       private final class ButtonClickListener implements View.OnClickListener{

           private boolean pause;//记录音乐是否被暂停

              public void onClick(View v) {

                     try {

                            switch (v.getId()) {

                            case R.id.playbutton://播放

                                   String fileName = eFileName.getText().toString();//得到用户输入的文件名

                                   audioFile = new File(Environment.getExternalStorageDirectory(),fileName);//创建文件对象

                                   mediaPlayer = new MediaPlayer();//初始化媒体播放器

                                   if(audioFile.exists()){

                                          play();

                                   }else{

                                          Toast.makeText(getApplicationContext(), R.string.filenoexsit, 1).show();

                                          audioFile = null;

                                   }

                                   break;

                            case R.id.pausebutton://暂停

                                   //对音乐的播放状态进行判断,如果是暂停,点击后变为继续,如果是继续,点击后变为暂停

                                   if(mediaPlayer.isPlaying()){//正在播放状态

                                          ((Button)v).setText(R.string.goon);

                                          mediaPlayer.pause();

                                          pause = true;

                                   }else{//音乐没播放,这时点击暂停没意义,所以要判断

                                          if(pause){

                                                 ((Button)v).setText(R.string.pause);

                                                 mediaPlayer.start();//继续播放

                                                 pause = false;

                                          }

                                   }

                                   break;

                            case R.id.resetbutton://重播,如果音乐正在播放,则从头播放,否则直接播放

                                   if(mediaPlayer.isPlaying()){

                                          mediaPlayer.seekTo(0);//把播放音乐的指针置到开始位置

                                   }else{

                                          if(audioFile !=null){

                                                 play();

                                          }

                                   }

                                   break;

                            case R.id.stopbutton://停止

                                   if(mediaPlayer.isPlaying()){

                                          mediaPlayer.stop();

                                   }

                                   break;

                            }

                     } catch (Exception e) {

                            e.printStackTrace();

                     }

              }

    }

}