Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Android學習指南之二十八:Android多媒體(Media)實例講解

Android學習指南之二十八:Android多媒體(Media)實例講解

編輯:關於android開發

       說到移動設備,裡面的多媒體資源想必是很多人的興趣所在,多媒體資源一般包括視頻、音頻和圖片等。本節主要講Android開發中訪問和操作音頻與視頻的方法。

       Android為音頻和視頻操作分別提供了MediaPlayer類和MediaRecorder類這兩個工具類,本文就為大家演示如何使用這兩個類操作音頻和視頻。

       一、簡單音樂播放器

       1、新建一個項目Lesson28_Music,主Activity的名字是MainMusic.java。

       2、拷貝以下這幾張圖片到res/drawable目錄下,並建立3個xml文件,拷貝love.mp3到res/raw文件中。

play play disable pause pause disable stop stop disable

       play.xml:

XML/HTML代碼
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <SELECTOR xmlns:android="http://schemas.android.com/apk/res/android">  
  3.     <ITEM android:state_enabled="false" android:drawable="@drawable/play_disable" /> <!-- state_enabled=false -->  
  4.     <ITEM android:drawable="@drawable/play_50" /> <!-- default -->  
  5. </SELECTOR>  

       pause.xml:

XML/HTML代碼
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <SELECTOR xmlns:android="http://schemas.android.com/apk/res/android">  
  3.     <ITEM android:state_enabled="false" android:drawable="@drawable/pause_disable" /> <!-- state_enabled=false -->  
  4.     <ITEM android:drawable="@drawable/pause_50" /> <!-- default -->  
  5. </SELECTOR>  

       stop.xml:

XML/HTML代碼
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <SELECTOR xmlns:android="http://schemas.android.com/apk/res/android">  
  3.     <ITEM android:state_enabled="false" android:drawable="@drawable/stop_disable" /> <!-- state_enabled=false -->  
  4.     <ITEM android:drawable="@drawable/stop_50" /> <!-- default -->  
  5. </SELECTOR>  

       3、res/layout/main.xml 的內容如下:

XML/HTML代碼
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LINEARLAYOUT xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="fill_parent" android:layout_width="fill_parent" android:orientation="vertical">  
  3.     <TEXTVIEW android:layout_height="wrap_content" android:layout_width="fill_parent" android:text="簡單音樂播放器" android:textsize="25sp" />  
  4. </LINEARLAYOUT>  
  5. <LINEARLAYOUT xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="fill_parent" android:layout_width="fill_parent" android:orientation="horizontal">  
  6.   
  7.         <IMAGEBUTTON android:layout_height="wrap_content" android:layout_width="wrap_content" android:background="@drawable/play" android:id="@+id/play" android:adjustviewbounds="true" android:layout_margin="4dp">  
  8.         </IMAGEBUTTON>  
  9.   
  10.         <IMAGEBUTTON android:layout_height="wrap_content" android:layout_width="wrap_content" android:background="@drawable/pause" android:id="@+id/pause" android:adjustviewbounds="true" android:layout_margin="4dp">  
  11.         </IMAGEBUTTON>  
  12.   
  13.         <IMAGEBUTTON android:layout_height="wrap_content" android:layout_width="wrap_content" android:background="@drawable/stop" android:id="@+id/stop" android:adjustviewbounds="true" android:layout_margin="4dp">  
  14.         </IMAGEBUTTON>  
  15. </LINEARLAYOUT>  

       4、MainMusic.java的內容如下:

Java代碼
  1. package android.basic.lesson28;   
  2.   
  3. import java.io.IOException;   
  4.   
  5. import android.app.Activity;   
  6. import android.media.MediaPlayer;   
  7. import android.media.MediaPlayer.OnCompletionListener;   
  8. import android.media.MediaPlayer.OnPreparedListener;   
  9. import android.os.Bundle;   
  10. import android.view.View;   
  11. import android.view.View.OnClickListener;   
  12. import android.widget.ImageButton;   
  13. import android.widget.Toast;   
  14.   
  15. public class MainMusic extends Activity {   
  16.   
  17.     // 聲明變量   
  18.     private ImageButton play, pause, stop;   
  19.     private MediaPlayer mPlayer;   
  20.   
  21.     /** Called when the activity is first created. */  
  22.     @Override  
  23.     public void onCreate(Bundle savedInstanceState) {   
  24.         super.onCreate(savedInstanceState);   
  25.         setContentView(R.layout.main);   
  26.   
  27.         // 定義UI組件   
  28.         play = (ImageButton) findViewById(R.id.play);   
  29.         pause = (ImageButton) findViewById(R.id.pause);   
  30.         stop = (ImageButton) findViewById(R.id.stop);   
  31.   
  32.         // 按鈕先全部失效   
  33.         play.setEnabled(false);   
  34.         pause.setEnabled(false);   
  35.         stop.setEnabled(false);   
  36.   
  37.         // 定義單擊監聽器   
  38.         OnClickListener ocl = new View.OnClickListener() {   
  39.   
  40.             @Override  
  41.             public void onClick(View v) {   
  42.                 switch (v.getId()) {   
  43.                 case R.id.play:   
  44.                     // 播放   
  45.                     Toast.makeText(MainMusic.this, "點擊播放", Toast.LENGTH_SHORT).show();   
  46.                     play();   
  47.                     break;   
  48.                 case R.id.pause:   
  49.                     // 暫停   
  50.                     Toast.makeText(MainMusic.this, "暫停播放", Toast.LENGTH_SHORT).show();   
  51.                     pause();   
  52.                     break;   
  53.                 case R.id.stop:   
  54.                     // 停止   
  55.                     Toast.makeText(MainMusic.this, "停止播放", Toast.LENGTH_SHORT).show();   
  56.                     stop();   
  57.                     break;   
  58.                 }   
  59.             }   
  60.         };   
  61.   
  62.         // 綁定單擊監聽   
  63.         play.setOnClickListener(ocl);   
  64.         pause.setOnClickListener(ocl);   
  65.         stop.setOnClickListener(ocl);   
  66.   
  67.         // 初始化   
  68.         initMediaPlayer();   
  69.     }   
  70.   
  71.     // 初始化播放器   
  72.     private void initMediaPlayer() {   
  73.   
  74.         // 定義播放器   
  75.         mPlayer = MediaPlayer.create(getApplicationContext(), R.raw.love);   
  76.   
  77.         // 定義資源准備好的監聽器   
  78.         mPlayer.setOnPreparedListener(new OnPreparedListener() {   
  79.             @Override  
  80.             public void onPrepared(MediaPlayer mp) {   
  81.                 // 資源准備好了再讓播放器按鈕有效   
  82.                 Toast.makeText(MainMusic.this, "onPrepared", Toast.LENGTH_SHORT)   
  83.                         .show();   
  84.                 play.setEnabled(true);   
  85.             }   
  86.         });   
  87.   
  88.         // 定義播放完成監聽器   
  89.         mPlayer.setOnCompletionListener(new OnCompletionListener() {   
  90.   
  91.             @Override  
  92.             public void onCompletion(MediaPlayer mp) {   
  93.                 Toast.makeText(MainMusic.this, "onCompletion",   
  94.                         Toast.LENGTH_SHORT).show();   
  95.                 stop();   
  96.             }   
  97.         });   
  98.     }   
  99.   
  100.     // 停止播放   
  101.     private void stop() {   
  102.         mPlayer.stop();   
  103.         pause.setEnabled(false);   
  104.         stop.setEnabled(false);   
  105.         try {   
  106.             mPlayer.prepare();   
  107.             mPlayer.seekTo(0);   
  108.             play.setEnabled(true);   
  109.         } catch (IllegalStateException e) {   
  110.             e.printStackTrace();   
  111.         } catch (IOException e) {   
  112.             e.printStackTrace();   
  113.         }   
  114.   
  115.     }   
  116.   
  117.     // 播放   
  118.     private void play() {   
  119.   
  120.         mPlayer.start();   
  121.         play.setEnabled(false);   
  122.         pause.setEnabled(true);   
  123.         stop.setEnabled(true);   
  124.     }   
  125.   
  126.     // 暫停   
  127.     private void pause() {   
  128.         mPlayer.pause();   
  129.         play.setEnabled(true);   
  130.         pause.setEnabled(false);   
  131.         stop.setEnabled(true);   
  132.     }   
  133.   
  134.     // Activity銷毀前停止播放   
  135.     @Override  
  136.     protected void onDestroy() {   
  137.         super.onDestroy();   
  138.         if (stop.isEnabled()) {   
  139.             stop();   
  140.         }   
  141.   
  142.     }   
  143.   
  144. }  

       5、運行程序,查看效果。

簡單音樂播放器

簡單音樂播放器暫停播放

       二、簡單視頻播放器

       Android為視頻播放提供了VideoView和MediaController兩個現成的組件,讓我們可以方便的實現MP4、3GP等視頻的播放。下面我們通過一個例子來看一下:

       1、新建一個項目Lesson28_Video。

       2、使用Format Factory這個軟件壓縮一個視頻備用,我這裡壓縮的參數如下:

Format Factory壓縮視頻的參數

       注意,如果播放時完全無法播放或者只有聲音沒有圖像,你就需要換壓縮軟件和調整壓縮參數重新壓縮視頻了,暫時只能這樣,我也是折騰了2-3小時都是黑屏,郁悶中(似乎得出一個答案,是否黑屏和機器設備的性能有關,我降低壓縮分辨率和每秒幀數,出圖像音畫同步,如果提高每秒幀數,聲音出來後十幾秒圖像才會出來,但是出來後音畫還是同步的,有興趣的朋友可以多測試測試給出一個結論)。

       用命令行的方式拷貝此視頻到存儲卡(sdcard)中,為什麼不用eclipse中的可視化工具拷貝呢?因為那個方式靠大文件的時候經常失敗,而命令行方式我沒拷貝失敗一次過。命令就是 adb push ,具體截個圖給你看:

命令行拷貝視頻到sd卡

       3、res\layout\main.xml的內容如下:

XML/HTML代碼
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LINEARLAYOUT xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="match_parent" android:layout_width="match_parent" android:orientation="vertical" android:layout_gravity="top">  
  3. <VIDEOVIEW android:layout_height="fill_parent" android:layout_width="fill_parent" android:id="@+id/VideoView01">  
  4. </VIDEOVIEW>  
  5. </LINEARLAYOUT>  

       4、MainVideo.java的內容如下:

Java代碼
  1. package android.basic.lesson28;   
  2.   
  3. import android.app.Activity;   
  4. import android.net.Uri;   
  5. import android.os.Bundle;   
  6. import android.view.Window;   
  7. import android.view.WindowManager;   
  8. import android.widget.MediaController;   
  9. import android.widget.VideoView;   
  10.   
  11. public class MainVideo extends Activity {   
  12.     /** Called when the activity is first created. */  
  13.     @Override  
  14.     public void onCreate(Bundle savedInstanceState) {   
  15.         super.onCreate(savedInstanceState);   
  16.         //全屏   
  17.         this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);   
  18.         //標題去掉   
  19.         this.requestWindowFeature(Window.FEATURE_NO_TITLE);   
  20.         //要在全屏等設置完畢後再加載布局   
  21.         setContentView(R.layout.main);   
  22.   
  23.         //定義UI組件   
  24.         VideoView videoView = (VideoView) findViewById(R.id.VideoView01);   
  25.         //定義MediaController對象   
  26.         MediaController mediaController = new MediaController(this);   
  27.         //把MediaController對象綁定到VideoView上   
  28.         mediaController.setAnchorView(videoView);   
  29.         //設置VideoView的控制器是mediaController   
  30.         videoView.setMediaController(mediaController);   
  31.   
  32.         //這兩種方法都可以 videoView.setVideoPath("file:///sdcard/love_480320.mp4");   
  33.         videoView.setVideoURI(Uri.parse("/sdcard/love_480320.mp4"));   
  34.         //啟動後就播放   
  35.         videoView.start();   
  36.     }   
  37. }  

       5、運行效果如下:

簡單視頻播放器

簡單視頻播放器播放

       三、簡單錄音程序

       1、新建一個一個項目Tip_Recorder,主activity名字是MainActivity。

       2、其布局文件main.xml的代碼是:

XML/HTML代碼
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LINEARLAYOUT xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="fill_parent" android:layout_width="fill_parent" android:orientation="vertical" android:gravity="center">  
  3.   
  4.     <BUTTON type=submit android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="錄音" android:textsize="30sp" android:id="@+id/Button01"></BUTTON>  
  5.     <BUTTON type=submit android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="停止" android:textsize="30sp" android:id="@+id/Button02" android:layout_margintop="20dp"></BUTTON>  
  6. </LINEARLAYOUT>  

       3、主程序文件 MainActivity.java的代碼如下:

Java代碼
  1. package android.tip.yaoyao;   
  2.   
  3. import java.io.File;   
  4. import java.io.IOException;   
  5. import java.util.Calendar;   
  6. import java.util.Locale;   
  7.   
  8. import android.app.Activity;   
  9. import android.media.MediaRecorder;   
  10. import android.os.Bundle;   
  11. import android.text.format.DateFormat;   
  12. import android.view.View;   
  13. import android.widget.Button;   
  14. import android.widget.Toast;   
  15.   
  16. public class MainActivity extends Activity {   
  17.   
  18.     private Button recordButton;   
  19.     private Button stopButton;   
  20.   
  21.     private MediaRecorder mr;   
  22.   
  23.     @Override  
  24.     public void onCreate(Bundle savedInstanceState) {   
  25.         super.onCreate(savedInstanceState);   
  26.         setContentView(R.layout.main);   
  27.   
  28.         recordButton = (Button) this.findViewById(R.id.Button01);   
  29.         stopButton = (Button) this.findViewById(R.id.Button02);   
  30.   
  31.         // 錄音按鈕點擊事件   
  32.         recordButton.setOnClickListener(new View.OnClickListener() {   
  33.   
  34.             @Override  
  35.             public void onClick(View v) {   
  36.   
  37.                 File file = new File("/sdcard/"  
  38.                         + "YY"  
  39.                         + new DateFormat().format("yyyyMMdd_hhmmss",   
  40.                                 Calendar.getInstance(Locale.CHINA)) + ".amr");   
  41.   
  42.                 Toast.makeText(getApplicationContext(), "正在錄音,錄音文件在"+file.getAbsolutePath(), Toast.LENGTH_LONG)   
  43.                         .show();   
  44.   
  45.                 // 創建錄音對象   
  46.                 mr = new MediaRecorder();   
  47.   
  48.                 // 從麥克風源進行錄音   
  49.                 mr.setAudioSource(MediaRecorder.AudioSource.DEFAULT);   
  50.   
  51.                 // 設置輸出格式   
  52.                 mr.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);   
  53.   
  54.                 // 設置編碼格式   
  55.                 mr.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);   
  56.   
  57.                 // 設置輸出文件   
  58.                 mr.setOutputFile(file.getAbsolutePath());   
  59.   
  60.                 try {   
  61.                     // 創建文件   
  62.                     file.createNewFile();   
  63.                     // 准備錄制   
  64.                     mr.prepare();   
  65.                 } catch (IllegalStateException e) {   
  66.                     e.printStackTrace();   
  67.                 } catch (IOException e) {   
  68.                     e.printStackTrace();   
  69.                 }   
  70.                 // 開始錄制   
  71.                 mr.start();   
  72.                 recordButton.setText("錄音中……");   
  73.             }   
  74.         });   
  75.   
  76.         // 停止按鈕點擊事件   
  77.         stopButton.setOnClickListener(new View.OnClickListener() {   
  78.   
  79.             @Override  
  80.             public void onClick(View v) {   
  81.   
  82.                 if (mr != null) {   
  83.                     mr.stop();   
  84.                     mr.release();   
  85.                     mr = null;   
  86.                     recordButton.setText("錄音");   
  87.                     Toast.makeText(getApplicationContext(), "錄音完畢", Toast.LENGTH_LONG).show();   
  88.                 }   
  89.             }   
  90.         });   
  91.   
  92.     }   
  93.   
  94. }  

       4、因為錄音和寫存儲卡都需要權限聲明,所以這裡也把AndroidManifest.xml代碼提供出來:

XML/HTML代碼
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <MANIFEST android:versionname="1.0" android:versioncode="1" xmlns:android="http://schemas.android.com/apk/res/android" package="android.tip.yaoyao">  
  3.     <APPLICATION android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true">  
  4.         <ACTIVITY android:name=".MainActivity" android:label="@string/app_name" android:screenorientation="portrait" android:configchanges="orientation|keyboardHidden|keyboard">  
  5.             <INTENT -filter>  
  6.                 <ACTION android:name="android.intent.action.MAIN" />  
  7.                 <CATEGORY android:name="android.intent.category.LAUNCHER" />  
  8.             </INTENT>  
  9.         </ACTIVITY>  
  10.   
  11.     </APPLICATION>  
  12.     <USES android:minsdkversion="4" -sdk />  
  13.   
  14. <USES android:name="android.permission.RECORD_AUDIO" -permission></USES>  
  15. <USES android:name="android.permission.WRITE_EXTERNAL_STORAGE" -permission></USES>  
  16. </MANIFEST>   

       5、編譯並運行程序,查看結果。

簡單錄音程序

       點擊錄音:

簡單錄音程序錄音中

       錄音文件在存儲卡的根目錄幾個以YY開頭的amr文件:

錄音文件在sd卡中的目錄


       6、這個例子要用到錄音設備,而模擬器並不能把電腦聲卡模擬出來使用,因此這個例子必須在真機上進行測試。

       真機上測試方法也很簡單:

       1)在真機上把USB調試模式打開。

       2)把真機用USB線與電腦連接。

       3)設置電腦和手機的連接方式為 ”僅充電“(此時手機可以操作存儲卡)。

       4)打開Eclipse,在不選擇模擬器的情況下運行程序,此時,Eclipse會自動找到真機,並使用它運行程序,最完美的是他可以把真機運行程序的輸出信息,照樣輸出在Eclipse中的Logcat日志中。

       上面的真機截圖也是通過Eclipse的DDMS窗口直接抓取的,下圖中右上角顏色最深的圖標就是抓取真機截圖的按鈕:

DDMS截圖按鈕

       本節就講到這裡,內容不少,希望大家自己多加練習,熟練掌握。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved