1. 程式人生 > >Android 中級教程之------Android MediaPlayer播放mp3的例項!

Android 中級教程之------Android MediaPlayer播放mp3的例項!

Android 中級教程之——Android MediaPlayer播放mp3的例項!

大家好我們今天研究的是Android中很重要也最為複雜的媒體播放器—MediaPlayer.

Android的MediaPlayer包含了Audio和video的播放功能,在Android的介面上,Music和Video兩個應用程式都是呼叫MediaPlayer實現的。

MediaPlayer在底層是基於OpenCore(PacketVideo)的庫實現的,為了構建一個MediaPlayer程式,上層還包含了程序間通訊等內容,這種程序間通訊的基礎是Android基本庫中的Binder機制。

而我們今天的例子只是利用MediaPlayer來播放res/raw資料夾中一首非常動聽的英文哥love fool.mp3.程式有三個ImageButton按鈕,播放,停止,和暫停!三個按鈕的功能我就不用多說.下面我將Step By Step教你如何完成本Demo的實現.

Step 1 :新建一個Android工程,命名為MediaPlayerDemo.

Step 2 :準備素材,在res下建一個raw資料夾,將foollove.mp3匯入,將play.png,pause.png,及stop.png匯入res/drawable資料夾下.

Step 3: 設計UI佈局,在main.xml裡放入三個ImageButton(這裡可以用AbsoluteLayout,或者RelativeLayout實現,我用後者).程式碼如下:

<?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.android.com/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的實現,程式碼如下:

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;  
 //宣告一個變數判斷是否為暫停,預設為false  
 private boolean isPaused = false;  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  

        //通過findViewById找到資源  
        mb1 = (ImageButton)findViewById(R.id.myButton1);  
        mb2 = (ImageButton)findViewById(R.id.myButton2);  
        mb3 = (ImageButton)findViewById(R.id.myButton3);  
        tv = (TextView)findViewById(R.id.myTextView1);  

        //建立MediaPlayer物件,將raw資料夾下的lovefool.mp3  
        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("音樂播放中...");  
    } catch (Exception e) {  
     tv.setText("播放發生異常...");  
     e.printStackTrace();  
    }      
   }        
        });  

        mb2.setOnClickListener(new ImageButton.OnClickListener(){  
   @Override 
   public void onClick(View v) {  
    try {  
     if(mp !=null)  
     {  
      mp.stop();  
      tv.setText("音樂停止播放...");  
     }  
    } catch (Exception e) {  
     tv.setText("音樂停止發生異常...");  
     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("開始播發!");  
      }  
     }  
    } catch (Exception e) {  
     tv.setText("發生異常...");  
     e.printStackTrace();  
    }  

   }           
        });  

        /* 當MediaPlayer.OnCompletionLister會執行的Listener */ 
        mp.setOnCompletionListener(  
          new MediaPlayer.OnCompletionListener()   
        {   
          // @Override   
          /*覆蓋檔案播出完畢事件*/ 
          public void onCompletion(MediaPlayer arg0)   
          {   
            try   
            {   
              /*解除資源與MediaPlayer的賦值關係  
               * 讓資源可以為其它程式利用*/ 
              mp.release();   
              /*改變TextView為播放結束*/ 
              tv.setText("音樂播發結束!");   
            }   
            catch (Exception e)   
            {   
              tv.setText(e.toString());   
              e.printStackTrace();   
            }   
          }   
        });   

        /* 當MediaPlayer.OnErrorListener會執行的Listener */ 
        mp.setOnErrorListener(new MediaPlayer.OnErrorListener()  
        {  
          @Override 
          /*覆蓋錯誤處理事件*/ 
          public boolean onError(MediaPlayer arg0, int arg1, int arg2)  
          {  
            // TODO Auto-generated method stub  
            try 
            {  
              /*發生錯誤時也解除資源與MediaPlayer的賦值*/ 
              mp.release();  
              tv.setText("播放發生異常!");  
            }  
            catch (Exception e)  
            {  
              tv.setText(e.toString());   
              e.printStackTrace();   
            }   
            return false;   
          }   
        });   
      }   

}  

Step 5: 執行效果如下,一首動聽的love fool在播放…享受中…

擴散學習:

如果我們想播放手機卡里的音樂,或者URL下載流媒體來播放,示意程式如下:

MediaPlayer mp = new MediaPlayer();   

mp.setDataSource(String URL/FILE_PATH);   

mp.prepare();   

mp.start();   

以上程式主要是通過MediaPlayer.setDataSource() 的方法,將URL或檔案路徑以字串的方式傳入.使用setDataSource ()方法時,要注意以下三點:

1.構建完成的MediaPlayer 必須實現Null 對像的檢查.

2.必須實現接收IllegalArgumentException 與IOException 等異常,在很多情況下,你所用的檔案當下並不存在.

3.若使用URL 來播放線上媒體檔案,該檔案應該要能支援pragressive 下載.

相關推薦

Android 中級教程------Android MediaPlayer播放mp3例項!

Android 中級教程之——Android MediaPlayer播放mp3的例項! 大家好我們今天研究的是Android中很重要也最為複雜的媒體播放器—MediaPlayer. Android的MediaPlayer包含了Audio和video的播放

Android中級教程--------Android應用程式的生命週期(一定要理解,面試會問的哦!)

Android的應用程式的生命週期,我相信這在以後的Android面試一定是經常考的題目,所以大家一點要重視哦!下面我將圖文雙執行緒,希望對大家有一點幫助! 首先我們看一下Android應用程式的生命週期圖:         在大部份情況下,每個Android應用都

Android系列教程七:EditText使用詳解-包含很多教程上看不到的功能演示

Android系列教程目錄: 一:新建HelloEditText工程 新建一個Hello world詳細步驟可以參見 建立設定如下: Project name:HelloEditTextBuild Target :android 2.2Application name

android開發教程startActivityForResult使用方法

最近做的一個小東西遇到這樣的情況,我從一個頁面MainActivity修改一些內容,需要跳轉到一個新的EditActivity去做修改操作,修改完成後就回到之前的MainActivity,因為資訊被修改了,最好還是從伺服器上重新獲取一下,那麼就要在MainActivity裡

Android疑難雜症(ImageView播放gif遇到的坑)

最近做專案需要用到gif圖片,專案中直接用的Glide的gif載入,還沒有時間去研究Glide的原始碼的,不得不說Glide很強大啊,以前在郭神的部落格中看到了一個播放Gif的ImageView,於是打算跟著敲一遍咯。 原文連結先附上:http://blog.

Android高手進階教程---Android中幾種影象特效處理的集錦!!

大家好,這一節給大家分享的是Android中幾種影象特效處理的小技巧,比如圓角,倒影,還有就是圖片縮放,Drawable轉化為Bitmap,Bitmap轉化為Drawable等等. 廢話少說了,直接講解今天的例項,本例主要是先獲取桌布(getWallpaper()),然後對

Android中級Fresco-載入圖片基礎[詳細圖解Fresco的使用]

常見問題: 初次使用,我們就先簡單書寫我們的 activity_main.xml : <code class="hljs avrasm has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing

Android直播開發旅(4):MP3編碼格式分析與lame庫編譯封裝

轉載請宣告出處:http://blog.csdn.net/andrexpert/article/77683776 一、Mp3編碼格式分析       MP3,全稱MPEG Audio Layer3,是一種高效的計算機音訊編碼方案,它以較大的壓縮比(1:10至1:12)將音

Android Camera2教程開啟相機、開啟預覽、實現PreviewCallback、拍照

Android API 21新增了Camera2,這與之前的camera架構完全不同,使用起來也比較複雜,但是功能變得很強大。

Android常見錯誤android widget LinearLayout 4375f248 that was or

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Android面試系列Android基礎知識

這兩天就要換工作了,為了拿到offer,是時候來一波面試準備了!希望自己能找到心儀的工作。也希望這篇部落格能幫助到大家。 本篇部落格是相對基礎的知識,雖然是基礎,但是很重要,你能保證你都記住了麼? Activity相關 Activity是四大元件之一,

Android基礎篇Android快速入門--你必須要知道的基礎

1. Activity的理解: 2. Intent的理解 關於IntentFilter 3. Intent的使用:(建立、攜帶資料、讀取資料) 1.建立:      顯式意圖: Intent intent = new Inten

Android自學筆記 Android五大布局線性佈局的功能、常用屬性、用法

1.介紹:   線性佈局管理器對存放其中的控制元件或佈局採用線性方式管理 2.LinearLayout的常用屬性android:orientation = “vertical” —— 該屬性決定它子類

Android ORM 框架 Android中ORMLite應用基礎

ORMLite是常用的一個ORM框架,她不止可以用在Android的sqlite資料庫,也可以使用她操作其他常見的資料庫。這兒是根據官方文件抽取來的android用法。 一,新增依賴 匯入ormlite-core.jar和ormlite-android.

Android架構分析Android訊息處理機制(二)

作者:劉昊昱  Android版本:4.4.2 在上一篇文章中我們看了一個使用Handler處理Message訊息的例子,本文我們來分析一下其背後隱藏的Android訊息處理機制。 我們可能比較熟悉Windows作業系統的訊息處理模型: while(GetMessage

Android Service的使用方法 音樂播放例項

Service翻譯成中文是服務,熟悉Windows 系統的同學一定知道很熟悉了。Android裡的Service跟Windows裡的Service功能差不多,就是一個不可見的程序在後臺執行,避免被使

Android應用安全Android APP通用型拒絕服務漏洞

0xr0ot和Xbalien交流所有可能導致應用拒絕服務的異常型別時,發現了一處通用的本地拒絕服務漏洞。該通用型本地拒絕服務可以造成大面積的app拒絕服務。 針對序列化物件而出現的拒絕服務主要是由於應用中使用了getSerializableExtra() 的API,由於應用開發者沒有對

Android開發者福利--------Android 5.0 API

Android 5.0 API Android 5.0 (LOLLIPOP) 為使用者和應用開發者提供了新功能。本文旨在介紹其中最值得關注的新 API。 如果您有已釋出的應用,請務必看一看 Android 5.0 行為變更,瞭解您的應用應該考慮的變化。即使您不使用

Android休眠】Android休眠機制

一、休眠概述 休眠,簡而言之就是裝置在不需要工作的時候把一些部件、外設關掉(掉電或讓它進入低功耗模式)。 為什麼要休眠呢?一言以蔽之:省電。 休眠分主動休眠和被動休眠。主動休眠:比如我電腦不用了,就通過設定讓系統進入休眠模式;被動休眠:系統檢測到自己閒的慌,為了節約故,自

Android開發規範------Android 資原始檔命名與使用

以下主要引用阿里巴巴 Android 開發手冊: Android 資原始檔命名與使用: 【推薦】資原始檔需帶模組字首。 【推薦】layout 檔案的命名方式。 Activity 的 layout 以 module_activity 開頭 Fragment 的 la