android学习之利用MediaPlayer制作音乐播放器

使用步骤:

 1.先创建MediaPlayer对象

 2.利用setDataSource()方法,将要播放的文件(歌曲)路径给MediaPlayer对象。

 3.利用prepare()方法,进行缓冲(准备阶段)

 4.调用setOnPreparedListener()方法,进行监听是否缓冲好。

 5.当缓冲好,调用start()方法开始播放。

其它方法:

  reset()方法:使得MediaPlayer对象所有参数回到初始状态

  isPlaying()方法:判断是否播放

  start()方法:播放

  seekTo(int position)方法:从哪个地方播放 (postion是播放的位置)

  stop()方法:停止

  pause()方法:暂停


代码部分

Activity部分

package com.example.mp3_strudy_ysq;

import java.io.File;

import android.media.MediaPlayer;
import android.media.MediaPlayer.OnPreparedListener;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.content.Context;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener{
	private Button start_btn;
	private Button pause_btn;
	private Button reset_btn;
	private Button stop_btn;
	private EditText file_path;
	private MediaPlayer mediaPlayer;
	private String path;//文件路径
	private boolean pause;//暂停标志:true.暂停,false.没有暂停
	private int position;//当来电话了,播放文件的位置记录
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        /**
         * 初始化个UI组件
         * */
        start_btn=(Button) findViewById(R.id.start_btn);
        pause_btn=(Button) findViewById(R.id.pause_btn);
        reset_btn=(Button) findViewById(R.id.reset_btn);
        stop_btn=(Button) findViewById(R.id.stop_btn);
        file_path=(EditText) findViewById(R.id.file_path);
        /**
         * 绑定监听
         * */
        start_btn.setOnClickListener(this);
        pause_btn.setOnClickListener(this);
        reset_btn.setOnClickListener(this);
        stop_btn.setOnClickListener(this);
        /**
         * 创建MediaPlayer对象
         * */
        mediaPlayer=new MediaPlayer();
        
        /**
         * 最后要求:当有电话时候,就不能播放歌曲,当电话结束,就继续播放
         * */
        TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        telephonyManager.listen(new MyPhoneListener(), PhoneStateListener.LISTEN_CALL_STATE);
        
        
    }
    private final class MyPhoneListener extends PhoneStateListener{
		public void onCallStateChanged(int state, String incomingNumber) {
			switch (state) {
			case TelephonyManager.CALL_STATE_RINGING://来电
				if(mediaPlayer.isPlaying()) {
					position = mediaPlayer.getCurrentPosition();
					mediaPlayer.stop();
				}
				break;

			case TelephonyManager.CALL_STATE_IDLE:
				if(position>0 && path!=null){
					play(position);
					position = 0;
				}
				break;
			}
		}
    }
    
    
    
    
    @Override
	protected void onDestroy() {
    	System.out.println("执行了我!");
    	mediaPlayer.release();
    	mediaPlayer = null;
		super.onDestroy();
	}


	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		
		case R.id.start_btn:
			    /**
			     * 播放
			     * 第一步:获取输入文件地址,并判断文件是否存在
			     * 第二步:当文件存在,将文件路径传入到mediaPlayer对象,并进行缓冲文件(准备文件)
			     * 第三步:设置缓冲(文件准备)监听
			     * 第四步:当缓冲成功,播放文件
			     * */
			  String fileName=file_path.getText().toString();
			  File file=new File(Environment.getExternalStorageDirectory(), fileName);
			  if(file.exists()){
				  //文件存在
				 path=file.getAbsolutePath();//获取文件绝对路径
				 play(0);
			  }else{
				  path=null;
				  Toast.makeText(MainActivity.this,R.string.filenoexist,Toast.LENGTH_SHORT).show();
			  }
			  break;
			  
		case R.id.pause_btn:
			/**
			 * 暂停
			 * 1.先判断,是否在播放
			 * 2.当在播放,就执行暂停,并将按钮文本信息改为:继续,标志pause=true.
			 * 3.不在播放,判断是否是暂停状态(根据标志pause判断),是就继续播放,并将按钮文本信息改为:暂停,标志pause=false
			 * */
			if(mediaPlayer.isPlaying()){
				mediaPlayer.pause();
				pause=true;
				pause_btn.setText(R.string.continues);
			}else{
				if(pause){
					mediaPlayer.start();
					pause=false;
					pause_btn.setText(R.string.pause);
				}
			}
			break;
		case R.id.reset_btn:
			/**
			 * 重播
			 * 1.判先判断,是否在播放
			 * 2.当在播放,就执行从开始播放
			 * 3.当不在播放,就判断播放文件路径是否存在,存在就直接播放
			 * */
			if(mediaPlayer.isPlaying()){
				mediaPlayer.seekTo(0);
			}else{
				if(path!=null){
					play(0);
				}
			}
			break;
		case R.id.stop_btn:
			/**
			 * 停止
			 * 1.判先判断,是否在播放
			 * 2.当在播放,就执行停止
			 * */
			if(mediaPlayer.isPlaying()){
				mediaPlayer.stop();
			}
			break;
		default:
			break;
		}
		
	}
	public void play(int postion){
		try {
			mediaPlayer.reset();//将各项数据恢复到初始状态
		    mediaPlayer.setDataSource(path);
		    mediaPlayer.prepare();//设置缓冲文件
		    //设置准备监听
		    mediaPlayer.setOnPreparedListener(new onPrepared(postion));
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
    public class onPrepared implements OnPreparedListener{
    	private int position;
    	public onPrepared(int position){
    		this.position=position;
    	}
    	
		@Override
		public void onPrepared(MediaPlayer mp) {
			mediaPlayer.start();//播放文件
			if(position>0)mediaPlayer.seekTo(position);//设置从哪播放
			
		}
    	
    }
}

layout的xml配置


    
    
    
	      

权限添加



你可能感兴趣的:(android)