利用android完成了指定目录下的音乐循环播放:
xml文件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.musicplayer.MainActivity$PlaceholderFragment" > <EditText android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="请输入地址:" android:id="@+id/ed_t" /> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_below="@+id/ed_t" android:layout_marginTop="16dp" android:text="播放" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/button1" android:layout_alignBottom="@+id/button1" android:layout_toRightOf="@+id/button1" android:text="暂停" /> <Button android:id="@+id/button3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignTop="@+id/button2" android:layout_marginLeft="19dp" android:layout_toRightOf="@+id/button2" android:text="停止" /> </RelativeLayout>
activity文件
package com.example.musicplayer; import java.io.File; import java.io.IOException; import android.support.v7.app.ActionBarActivity; import android.support.v7.app.ActionBar; import android.support.v4.app.Fragment; import android.app.Activity; import android.content.DialogInterface; import android.media.MediaPlayer; import android.media.MediaPlayer.OnCompletionListener; import android.media.MediaPlayer.OnPreparedListener; import android.os.Bundle; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; import android.os.Build; public class MainActivity extends Activity implements OnClickListener { private EditText ed; private Button bt1,bt2,bt3; private String path; private MediaPlayer mediaPlayer; private String[] musicpool; private int musicIndex=0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if(savedInstanceState!=null) { musicIndex=savedInstanceState.getInt("musicIndex"); System.out.println(musicIndex); } ed=(EditText) findViewById(R.id.ed_t); bt1=(Button) findViewById(R.id.button1); bt2=(Button) findViewById(R.id.button2); bt3=(Button) findViewById(R.id.button3); // ed.setText("data/data/zp.mp3"); bt1.setOnClickListener(this); bt2.setOnClickListener(this); bt3.setOnClickListener(this); bt3.setEnabled(false); // path=ed.getText().toString(); //此处为方便测试将path设为我的手机目录,写死,本程序重在演示 mediaplayer的方法。
path="data/data/musics";
//获得该目录下的文件名目录 File file=new File(path); musicpool=file.list(); // for(String s:musicpool) // System.out.println(s); } @Override public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case R.id.button1: mediaPlayer=new MediaPlayer(); startMusic(); bt2.setEnabled(true); bt1.setEnabled(false); bt3.setEnabled(true); mediaPlayer.setOnCompletionListener(new Complete()); break; case R.id.button2: if(bt2.getText().toString().equals("暂停")) { mediaPlayer.pause(); bt2.setText("续播"); } else if(bt2.getText().toString().equals("续播")) { mediaPlayer.start(); bt2.setText("暂停"); } break; case R.id.button3: bt1.setEnabled(true); bt2.setEnabled(false); mediaPlayer.release(); bt2.setText("暂停"); bt3.setEnabled(false); mediaPlayer=null; break; default: break; } }
//完成播放的监听器 class Complete implements OnCompletionListener { @Override public void onCompletion(MediaPlayer mp) { // TODO Auto-generated method stub try { mediaPlayer.reset(); musicIndex= (musicIndex+1)%(musicpool.length); startMusic(); mediaPlayer.setOnCompletionListener(new Complete()); } catch (Exception e) { e.printStackTrace(); } // bt1.setEnabled(true); } } public void startMusic() // 播放音乐的2种方式 { try {
//1、这种是将音乐写入工程中,生成R的文件引用,一般文件较小,在游戏里设为打斗的音效 // mediaPlayer = MediaPlayer.create(this, R.raw.zp0); // mediaPlayer.start();
// 2、这种方式是设定音乐播放器常用的方式 mediaPlayer.setDataSource(path+"/"+musicpool[musicIndex]); mediaPlayer.prepareAsync(); mediaPlayer.setOnPreparedListener(new Preparelistener()); } catch (Exception e) { e.printStackTrace(); } } class Preparelistener implements OnPreparedListener { @Override public void onPrepared(MediaPlayer mp) { mp.start(); } } @Override protected void onSaveInstanceState(Bundle outState) { outState.putInt("musicIndex", musicIndex); super.onSaveInstanceState(outState); System.out.println(); } }
注意
1、 代码中有2种创建和启动音乐的方式,其中第一种是音乐文件导入到工程中多用于游戏中的打斗音效,第二多用于音乐播发器。其中播放有2种prepaere方式,
prepare(),是同步的,只有执行完了这句才会执行后面的,一般是音乐文件准备完了再播放,如果播放是本地音乐速度不会影响,但如果是音乐很大需要加载半天,影响用户体验。
prepareAsync()时异步的,启动了它后,会继续执行后面的代码无不影响,它需要设定监听器,如准备好了就开始播放mediaPlayer.setOnPreparedListener(new Preparelistener());
2、代码中可以设定listview来点击播放,将点击返回的point复制给musicIndex再启动播放即可。也可以设定扫描全部文件,找到.mp3结尾的文件添加到musicpool,不过也要存入他们的路径,将数据接口改为hashma集合存储或者存入sharepreferece文件里,下次启动直接读取。
3、设定来电监听事件,监听电话状态,来暂停音乐。或者退出时候记录下当前musicIndex,下次接着播放那首歌。
二、在线播放,
mediaPlayer=new MediaPlayer(); String url ="http://192.168.61.173:8080/mymusics/zp0.mp3"; // your URL here MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); try { mediaPlayer.setDataSource(url); Uri uri=Uri.parse(url); System.out.println(uri.getScheme()); System.out.println(uri.getPath()); //如果在主线程用mediaplayer.preapareAsync() // mediaPlayer.prepare(); // mediaPlayer.start(); mediaPlayer.prepareAsync(); mediaPlayer.setOnPreparedListener(new Preparelistener()); mediaPlayer.setOnCompletionListener(new Listener()); } catch (Exception e) { e.printStackTrace(); }