大家好我們今天研究的是Android中很重要也最為復(fù)雜的媒體播放器---MediaPlayer.
Android的MediaPlayer包含了Audio和video的播放功能,,在Android的界面上,Music和Video兩個(gè)應(yīng)用程序都是調(diào)用MediaPlayer實(shí)現(xiàn)的,。
MediaPlayer在底層是基于OpenCore(PacketVideo)的庫(kù)實(shí)現(xiàn)的,,為了構(gòu)建一個(gè)MediaPlayer程序,上層還包含了進(jìn)程間通訊等內(nèi)容,,這種進(jìn)程間通訊的基礎(chǔ)是Android基本庫(kù)中的Binder機(jī)制,。
而我們今天的例子只是利用MediaPlayer來(lái)播放res/raw文件夾中一首非常動(dòng)聽的英文哥love fool.mp3.程序有三個(gè)ImageButton按鈕,播放,停止,和暫停!三個(gè)按鈕的功能我就不用多說(shuō).下面我將Step By Step教你如何完成本Demo的實(shí)現(xiàn).
Step 1 :新建一個(gè)Android工程,命名為MediaPlayerDemo.
Step 2 :準(zhǔn)備素材,在res下建一個(gè)raw文件夾,將foollove.mp3導(dǎo)入,將play.png,pause.png,及stop.png導(dǎo)入res/drawable文件夾下.
Step 3: 設(shè)計(jì)UI布局,在main.xml里放入三個(gè)ImageButton(這里可以用AbsoluteLayout,或者RelativeLayout實(shí)現(xiàn),我用后者).代碼如下:
- <?xml version="1.0" encoding="utf-8"?>
- <RelativeLayout
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:background="@drawable/white"
- xmlns:android="http://schemas./apk/res/android "
- >
- <TextView
- android:id="@+id/myTextView1"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/hello"
- android:layout_alignParentTop="true"
- android:layout_alignParentLeft="true"
- >
- </TextView>
- <ImageButton
- android:id="@+id/myButton1"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:src="@drawable/play"
- android:layout_below="@+id/myTextView1"
- >
- </ImageButton>
- <ImageButton
- android:id="@+id/myButton3"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:src="@drawable/pause"
- android:layout_alignTop="@+id/myButton1"
- android:layout_toRightOf="@+id/myButton1"
- >
- </ImageButton>
- <ImageButton
- android:id="@+id/myButton2"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:src="@drawable/stop"
- android:layout_alignTop="@+id/myButton1"
- android:layout_toRightOf="@+id/myButton3"
- >
- </ImageButton>
- </RelativeLayout>
-
Step 4 :主控制程序MediaPlayerDemo.java的實(shí)現(xiàn),代碼如下:
- package com.android.test;
-
- import android.app.Activity;
- import android.media.MediaPlayer;
- import android.os.Bundle;
- import android.view.View;
- import android.widget.ImageButton;
- import android.widget.TextView;
-
- public class MediaPlayerDemo extends Activity {
-
- private ImageButton mb1,mb2,mb3;
- private TextView tv;
- private MediaPlayer mp;
-
- private boolean isPaused = false;
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
-
-
- mb1 = (ImageButton)findViewById(R.id.myButton1);
- mb2 = (ImageButton)findViewById(R.id.myButton2);
- mb3 = (ImageButton)findViewById(R.id.myButton3);
- tv = (TextView)findViewById(R.id.myTextView1);
-
-
- mp = MediaPlayer.create(this,R.raw.lovefool);
-
- mb1.setOnClickListener(new ImageButton.OnClickListener(){
- @Override
- public void onClick(View v) {
- try {
- if(mp != null)
- {
- mp.stop();
- }
- mp.prepare();
- mp.start();
- tv.setText("音樂(lè)播放中...");
- } catch (Exception e) {
- tv.setText("播放發(fā)生異常...");
- e.printStackTrace();
- }
- }
- });
-
- mb2.setOnClickListener(new ImageButton.OnClickListener(){
- @Override
- public void onClick(View v) {
- try {
- if(mp !=null)
- {
- mp.stop();
- tv.setText("音樂(lè)停止播放...");
- }
- } catch (Exception e) {
- tv.setText("音樂(lè)停止發(fā)生異常...");
- e.printStackTrace();
- }
-
- }
- });
-
- mb3.setOnClickListener(new ImageButton.OnClickListener(){
- @Override
- public void onClick(View v) {
- try {
- if(mp !=null)
- {
- if(isPaused==false)
- {
- mp.pause();
- isPaused=true;
- tv.setText("停止播放!");
- }
- else if(isPaused==true)
- {
- mp.start();
- isPaused = false;
- tv.setText("開始播發(fā)!");
- }
- }
- } catch (Exception e) {
- tv.setText("發(fā)生異常...");
- e.printStackTrace();
- }
-
- }
- });
-
-
- mp.setOnCompletionListener(
- new MediaPlayer.OnCompletionListener()
- {
-
-
- public void onCompletion(MediaPlayer arg0)
- {
- try
- {
-
-
- mp.release();
-
- tv.setText("音樂(lè)播發(fā)結(jié)束!");
- }
- catch (Exception e)
- {
- tv.setText(e.toString());
- e.printStackTrace();
- }
- }
- });
-
-
- mp.setOnErrorListener(new MediaPlayer.OnErrorListener()
- {
- @Override
-
- public boolean onError(MediaPlayer arg0, int arg1, int arg2)
- {
-
- try
- {
-
- mp.release();
- tv.setText("播放發(fā)生異常!");
- }
- catch (Exception e)
- {
- tv.setText(e.toString());
- e.printStackTrace();
- }
- return false;
- }
- });
- }
-
- }
-
-
-
-
-
Step 5: 運(yùn)行效果如下,一首動(dòng)聽的love fool在播放...享受中...
擴(kuò)散學(xué)習(xí):
如果我們想播放手機(jī)卡里的音樂(lè),或者URL下載流媒體來(lái)播放,示意程序如下:
- MediaPlayer mp = new MediaPlayer();
-
- mp.setDataSource(String URL/FILE_PATH);
-
- mp.prepare();
-
- mp.start();
-
以上程序主要是通過(guò)MediaPlayer.setDataSource() 的方法,將URL或文件路徑以字符串的方式傳入.使用setDataSource ()方法時(shí),要注意以下三點(diǎn):
1.構(gòu)建完成的MediaPlayer 必須實(shí)現(xiàn)Null 對(duì)像的檢查.
2.必須實(shí)現(xiàn)接收IllegalArgumentException 與IOException 等異常,在很多情況下,你所用的文件當(dāng)下并不存在.
3.若使用URL 來(lái)播放在線媒體文件,該文件應(yīng)該要能支持pragressive 下載.