Android之MediaPlayer的简单介绍之播放音乐

Android多媒体之MediaPlayer

 

         Android应用增加动画,视频,音乐等多媒体功能,因此为手机提供音频录制,播放,视频录制,播放的功能十分重要。Android提供了常见音频,视频的编码,解码机制,Android支持的音频格式有MP3,WAV3GP等,支持的视频格式有MP43GP等。                                             Android提供了这些多媒体的支持类,可以非常方便地在手机应用中播放音频,视频等。这些多媒体数据可以来自Android应用的资源文件,也可以来自外部存储器上的文件,也可以来自网络的文件流。

      不仅如此,Android也提供了对摄像头,麦克风的支持,因此也可以十分方便地从外部采集照片,视频,音频等多媒体信息。

 

——音频和视频的播放

——MediaPlayer播放音频

  1)MediaPalyer进行播放控制的方式:

     start():开始或者恢复播放

     stop():停止播放

     pause():暂停播放

  2)MediaPlayer装载指定音频文件的方式

      static MediaPlayer create(Content,Uri):从指定Uri来装载音频文件,并返回新创建的MediaPlayer对象。

      static MediaPlayer create(Content,int resid):redid资源ID来装载音频文件,并返回新创建的MediaPlayer对象。

    上面这两个方法使用起来很简单,但这两个方法每次都会返回新的MediaPlayer.如果程序需要播放多个音频文件,使用该方法就不太合适了。此时可通过setDataSource方法装载指定的音频文件。

      MediaPlayer m = new MediaPlayer():只需要创建一个对象

      setDataSource(String path):指定装载path路径所代表的文件

      setDataSource(FileDescriptor fs,long offset,long length):指定装载fd所代表的文件中从offset开始,长度为length的文件内容。

      setDataSource(FileDescriptor fd):指定装载fd所代表的文件                    

 

     setDataSource(Context,Uri):指定装载Uri所代表的文件

    执行setDataSource方法之后,MediaPlayer并未真正装载那些音频文件,还需要调用prepare()方法准备装载音频。

 3)播放应用raw的资源文件

    MediaPlayer m=MediaPlayer.create(this,R.raw.apple);

    m.start();

 4)播放应用raw的资源文件

      MediaPlayer m=new  MediaPlayer();

      m.setDataSource(Context,Uri.parse(

        "android.resource://"+getPackageName()+"/"+R.raw.apple"))

 5)播放应用的原始资源文件

    a)调用ContextgetAssets()获取AssetManager;

    b)调用AssetManageropenFd(String name)方法打开指定的原生资源.返回AssetFileDescriptor对象

    c)调用AssetFileDescriptorgetFileDescriptor()方法来获取音频文件的FileDescriptor.

    d)创建MediaPlayer对象,调用setDataSource(FileDescriptor)方法。

    e)调用MediaPlayerprepare()方法准备音频

    f)调用MediaPlayerstart(),stop(),pause()方法控制播放即可

  5)播放外部存储器上音频文件

    a)创建MediaPlayer对象,调用setDataSource("/sdcard/apple.mp3")

    b)调用MediaPlayer对象的prepare()方法

    c)调用MediaPlayerstart(),stop(),pause()方法控制播放即可

  6)播放来自网络的音频文件

    a)根据网络上的音频文件所在的位置创建Uri对象。

      Uri  uri = Uri.parse("http://www.baidu.com/song.mp3");

    b)创建MediaPlayer对象,调用setDataSource(Context,Uri);

    c)调用MediaPlayer对象的prepare()方法

    d)调用MediaPlayerstart(),stop(),pause()方法控制播放即可

 7)如播放下一首歌曲的代码:

   mPlayer.reset();//空闲状态

   mPlayer.setDataSource("/sdcard/gequ.mp3");

   mPlayer.prepare();

   mPlayer.start();

 8)MediaPlayer还提供了事件监听器的方法

    setOnCompletionListener():播放完成事件绑定事件监听器

    setOnErrorListener():播放错误事件绑定事件监听器

    setOnPreparedListener():调用prepare()方法时触发该监听器

    setOnSeekCompleteListener():调用seek()方法时触发该监听器

  9)Mediaplayer除了调用prepare()方法准备声音之外,

  还可以调用

     prepareAsync()来准备声音,他们的区别在于:

     prepareAsync()是异步的,它不会阻塞当前的UI线程。

  10)MediaPlayer的状态图

     reset():清空MediaPlayer中的数据

     setDataSource():设置音频数据

     prepare():准备装载音频数据

     prepareAsync():准备装载音频数据(异步)

     seekTo():重新定位到音频数据的什么位置,单位毫秒

     seekTo()是定位方法,可以让播放器从指定的位置开始播放,需要注意的是该方法是个异步方法,也就是说该方法返回时并不意味着定位完成,尤其是播放的网络文件,真正定位完成时会触发OnSeekComplete.onSeekComplete(),如果需要是可以调用setOnSeekCompleteListener(OnSeekCompleteListener)设置监听器来处理的。

     start():

     pause():

     stop():

     release():释放MediaPlayer资源

  

 11)其他的方法

      setLooping(true):是否重复播放

      setAudioStreamType()设置使用的音频流

A(播放音乐的界面)—>B

onPause()—>onCreate,onStart/onResume

—>onStop

实例:


先看效果吧:

Android之MediaPlayer的简单介绍之播放音乐_第1张图片


接下来我就说下步骤:

1.音乐路径:

我们要把播放的音乐文件放在虚拟机的SD卡中,要到第一个0目录下面,按照下面这个图来~

Android之MediaPlayer的简单介绍之播放音乐_第2张图片

2.播放音乐要MediaPlayer

MediaPlayer mediaPlayer=new MediaPlayer();

3.音乐的声音控制

AudioManager audioManager=(AudioManager) getSystemService(AUDIO_SERVICE);

4.音乐的开始与暂停

public void start(View view){
		mediaPlayer.start();
		new Thread(){
        	public void run() {
        		while(true){
        			try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}//一秒
        			Message msg=
							handler.obtainMessage();
					msg.what=0x123;
					handler.sendMessage(msg);
        		}
        	};
        }.start();
		
	}
    public void stop(View view){
		mediaPlayer.pause();
	}
5.布局:



    
6.Activity:

public class MainActivity extends Activity {

	private SeekBar sb1,sb2;
	private MediaPlayer mediaPlayer;
	private TextView tv;
	private AudioManager audioManager;
	
	
	    private Handler handler =new Handler(){
	    	//收到Handler发回的消息被回调
	    public void handleMessage(Message msg) {
	         //更新UI组件
	         if(msg.what==0x123){
		        int current=mediaPlayer.getCurrentPosition();
		        sb1.setProgress(current);
		      }
	       }
	    };
	
	public void start(View view){
		mediaPlayer.start();
		new Thread(){
        	public void run() {
        		while(true){
        			try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}//一秒
        			Message msg=
							handler.obtainMessage();
					msg.what=0x123;
					handler.sendMessage(msg);
        		}
        	};
        }.start();
		
	}
    public void stop(View view){
		mediaPlayer.pause();
	}
    
   
    
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		sb1=(SeekBar) findViewById(R.id.sb1);
		sb2=(SeekBar) findViewById(R.id.sb2);
		tv=(TextView) findViewById(R.id.tv);
		//实例了一个mediaplayer,并给它装在了音乐
		/*//这个方法使用起来很简单
		//但是这俩个方法每次都会返回新的MediaPlayer
		//如果程序需要播放多个音频文件
		//使用该方法不合适
		mediaPlayer=mediaPlayer.create(this, R.raw.music);*/
		mediaPlayer=new MediaPlayer();
		//加载资源文件
		try {
			String path=Environment.getExternalStorageDirectory().
					getAbsolutePath()+"/music.mp3";
			mediaPlayer.setDataSource(path);
			/*mediaPlayer.setDataSource(this, 
					Uri.parse
					("android.resource://"+getPackageName()+"/"+R.raw.music));*/
		    //如果是setDataSource,那么调用完这个文件之后,音频文件没有真正的加载
			//要调用prepare方法
			//异步的加载方式
			//mediaPlayer.prepareAsync();
			mediaPlayer.prepare();
			
			//设置循环播放
			mediaPlayer.setLooping(false);
			
			//mediaPlayer.setOnErrorListener(listener);
			//1.setLooping --false   
			//2.在播放完成时触发
			mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
				
				@Override
				public void onCompletion(MediaPlayer mp) {
					// TODO Auto-generated method stub
					//加载下一首
					Toast.makeText(MainActivity.this, "播放完成", 0).show();
				}
			});
			tv.setText(convert(mediaPlayer.getDuration()));
			
			sb1.setMax(mediaPlayer.getDuration());
			sb1.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
				
				@Override
				public void onStopTrackingTouch(SeekBar seekBar) {
					// TODO Auto-generated method stub
					//mediaPlayer.start();
				}
				
				@Override
				public void onStartTrackingTouch(SeekBar seekBar) {
					// TODO Auto-generated method stub
					
				}
				
				@Override
				public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
					// TODO Auto-generated method stub
					if(fromUser){
						mediaPlayer.seekTo(progress);
					}
				}
			});
			
			audioManager=(AudioManager) getSystemService(AUDIO_SERVICE);
			
			sb2.setMax(audioManager.getStreamMaxVolume(audioManager.STREAM_MUSIC));
			sb2.setProgress(audioManager.getStreamMaxVolume(audioManager.STREAM_MUSIC));
			sb2.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
				
				@Override
				public void onStopTrackingTouch(SeekBar seekBar) {
					// TODO Auto-generated method stub
					
				}
				
				@Override
				public void onStartTrackingTouch(SeekBar seekBar) {
					// TODO Auto-generated method stub
					
				}
				
				@Override
				public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
					// TODO Auto-generated method stub
					//一句话
					audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 
							progress, AudioManager.FLAG_SHOW_UI);
				}
			});
			
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalStateException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
		
		
		
	}
	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		if(mediaPlayer!=null&&mediaPlayer.isPlaying()){
			mediaPlayer.stop();
			mediaPlayer.reset();
			mediaPlayer=null;//回收资源
		}
		super.onDestroy();
	}
	private String convert(int duration){
		//总秒
		int second=duration/1000;
		//总分
		int minute=second/60;
		//剩余秒数
		int miao=second%60;
		return minute+":"+miao;
		
	}
}





你可能感兴趣的:(安卓)