您的位置:首页 > 移动开发 > Android开发

android 音乐模仿器demo,实现指定目录下的音乐循环播放,和在线播放的方法。

2015-08-17 13:22 836 查看
利用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();
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: