Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android 多媒體和相機詳解一

android 多媒體和相機詳解一

編輯:關於Android編程

  Android多媒體框架包含了獲取和回放音頻,視頻和各種類形的圖像的功能,所以你可以很容易的把它們整合到你的應用中.你可以從存儲在資源中的文件,文件系統中的文件,或從網絡數據流中播放音頻或視頻,這些都是用MediaPlayer或JetPlayerAPI實現.你也可以使用MediaRecorderand Camera API來錄制聲音,視頻或抓取圖片.


  下面的主題向你演示了如何使用Android框架來實現多媒體獲取和回放.

MediaPlayer

如何在你的應用中播放音視頻.

JetPlayer

如何使用通過JetCreator創建的內容播放交互式的音視頻.

Camera  

如何在你的應用中使用一個設備上的相機獲取圖片和視頻.

AudioCapture

如何在你的應用中錄制聲音.

媒體回放

  Android多媒體框架支持播放很多常見的媒體類型,所以你可以使用MediaPlayerAPI很輕松的整合音視頻和圖像到你的應用中.你可以從資源中,從文件中,從網絡上播放音視頻.

 

  此文檔向你演示了如何寫一個媒體播放應用,如何與用戶和系統交互,從而獲得最好的性能和用戶體驗.

 


  注:你只能把音視頻播放到標准的輸出設備上.當前,它們是揚聲器或藍牙耳機.你不能在電話通話時播放音頻文件.

基礎

  以下類被用於播放音頻和視頻:

MediaPlayer

此類是播放音視頻的主要API.

AudioManager

此類管理設備上的音頻源和輸出.

Manifest聲明

 

 

  在使用MediaPlayer開發之前,確保你的manifest中聲明了允許使用的相關特性.

InternetPermission - 如果你使用MediaPlayer來播放網絡流中的內容,你的應用必須請求網絡存取權限.

<uses-permissionandroid:name="android.permission.INTERNET" />

WakeLock Permission -如果你的播放應用需要阻止屏幕變暗或阻止處理器睡眠,或使用MediaPlayer.setScreenOnWhilePlaying()或MediaPlayer.setWakeMode()方法,你必須請求此權限.

<uses-permissionandroid:name="android.permission.WAKE_LOCK" />

使用MediaPlayer


  媒體框架中最重要的組件之一就是MediaPlayer類.此類的對象可以用少量的設置即能獲取,解碼和播放音視頻.它支持多種媒體源,比如:

本地資源.

內部URI,比如你從ContentResolver取得的URI.

外部URI(流媒體)

要了解Android支持的媒體類型列表,請看AndroidSupported Media Formats 文檔.

 

下面是如何播放本地資源中的音頻的例子(保存在你的應用的res/raw/文件夾下):

 

[java]
MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1); 
mediaPlayer.start(); //不需要調用prepare(); create()為你做了 

MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1);
mediaPlayer.start(); //不需要調用prepare(); create()為你做了

 

  在例子中,"raw"資源是一個系統不會以某種方式進行分析的文件.然而,此資源的內容不能是原始音頻,它應是一種適當編碼和格式化的媒體文件(當然是被支持的格式).

 

 

以下是如何播放一個本地URI的例子(URI是你用ContentResolver獲取的):

 

[java]
Uri myUri = ....; // initialize Uri here  
MediaPlayer mediaPlayer = new MediaPlayer(); 
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
mediaPlayer.setDataSource(getApplicationContext(), myUri); 
mediaPlayer.prepare(); 
mediaPlayer.start(); 

Uri myUri = ....; // initialize Uri here
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(getApplicationContext(), myUri);
mediaPlayer.prepare();
mediaPlayer.start();

從一個基於HTTP流的的遠程URL播放看起來是這樣的


[java]
String url = "http://........"; // your URL here 
MediaPlayer mediaPlayer = new MediaPlayer(); 
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
mediaPlayer.setDataSource(url); 
mediaPlayer.prepare(); // might take long! (for buffering, etc)  
mediaPlayer.start(); 

String url = "http://........"; // your URL here
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(url);
mediaPlayer.prepare(); // might take long! (for buffering, etc)
mediaPlayer.start();


  注:如果你傳入了一個URL來流式播放一個在線文件,這個文件必須前進式下載progressivedownload.

 

  警告:當使用setDataSource()時你必須捕獲和傳遞IllegalArgumentException和IOException,因為你引用的文件可能不存在.

異步Preparation

 

  使用MediaPlayer,在其本質上來說可以是簡單直接的.然而,對於一個典型android應用來說還有一些重要的事情要記住.例如,prepare()調用可能耗時很常,因為它可能需要獲取並打開解碼媒體數據.所以,由於有些方法會執行很長時間,那麼你就不能從你的應用的UI線程中調用它.否則會導致UI掛起,直到此方法返回為止.這是很差勁的用戶體驗,還會導致一個ANR(應用沒有反應)錯誤.即使你認為你的資源加載的很快,但記住界面中任何耗時超過10秒的東西將導致一個顯著的暫停並使用戶對你的應用產生慢的印像.

 

  要避免掛起UI線程,應產生另外的線程來"prepare"MediaPlayer並且在完成時通知主線程.然而,色雖然你可以親自寫線程中的邏輯,但是更常用的是使用框架所提供的一個方便的途徑:使用prepareAsync().此方法在後台開始"准備"過程並立即返回.當媒體"准備"完成,MediaPlayer.OnPreparedListener的onPrepared()方法(通過setOnPreparedListener()設置的)被調用.

管理狀態


  對MediaPlayer要記住的另一個方面就是"基於狀態".即,MediaPlayer有一個內部的狀態,因為特定的操作只能在特定的狀態時才有效,所以你必須在寫代碼時一直注意到它的變化.如果你在錯誤的狀態下執行一個操作,系統可能拋出一個異常或導致一個意外的行為.

 


  MediaPlayer類文檔中展示了一個完整的狀態圖例,它闡明了哪個方法使MediaPlayer從一個狀態進入另一個狀態.例如,當你創建一個新的MediaPlayer,它處於Idle狀態.此時,你應調用setDataSource()初始化它,使它進入"已初始化"狀態.之後,你應使用prepare()或prepareAsync()"准備"它.當MediaPlayer准備完成,它將進入Prepared狀態,這表示你可以調用start()來播放了.此時,如圖表所示,你可以調用start(),pause(),和seekTo()以及其它一些方法使MediaPlayer的狀態在Started,Paused和PlaybackCompleted狀態之間轉換.當你調了stop(),注意你不能再調用start(),除非你重新prepare MediaPlayer.

 

  當你寫代碼與MediaPlayer交互時,要時刻記住MediaPlayer的狀態變化圖,因為在錯誤的狀態下調用它的方法是常見的bug的原因.


 作者:nkmnkm
 

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