利用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();
}