日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android开发之Mediaplayer

發(fā)布時(shí)間:2025/7/14 Android 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android开发之Mediaplayer 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

 Android提供了常見的音頻、視頻的編碼、解碼機(jī)制。借助于多媒體類MediaPlayer的支持,開發(fā)者能夠非常方便在在應(yīng)用中播放音頻、視頻。本篇博客主要解說在Android平臺(tái)下怎樣播放一個(gè)音頻文件。

  本篇博客主要內(nèi)容例如以下:

  • MediaPlayer
  • MediaPlayer的音頻源
  • 使用MediaPlayer播放音樂
  • MediaPlayer使用技巧
  • Demo--一個(gè)簡單的MP3播放器

MediaPlayer

  上面提到過,Android下對(duì)于音頻、視頻的支持均須要使用到MediaPlayer,它主要用來控制Android下播放文件或流的類。MediaPlayer處于Android多媒體包下"android.media.MediaPlayer",僅有一個(gè)無參的構(gòu)造函數(shù),盡管僅為我們提供了一個(gè)無參的構(gòu)造函數(shù),為了方便我們初始化,還為我們提供了幾個(gè)靜態(tài)的create()方法用于完畢MediaPlayer初始化的工作。

  • static MediaPlayer create(Context context,int resid):通過音頻資源的Id來創(chuàng)建一個(gè)MediaPlayer實(shí)例。
  • static MediaPlayer create(Context context,Uri uri):通過一個(gè)音頻資源的Uri地址來創(chuàng)建一個(gè)MediaPlayer實(shí)例。

  MediaPlayer除了通過上面兩個(gè)create()方法在初始化的時(shí)候指定媒體資源,還能夠通過MediaPlayer.setDataSource()方法為初始化后的MediaPlayer設(shè)置媒體資源,setDataSource()具有多個(gè)重載函數(shù),適用于不同的媒體資源來源,下面解說幾個(gè)經(jīng)常使用的,其它的能夠查閱官方文檔。

  • void setDataSource(String path):通過一個(gè)媒體資源的地址指定MediaPlayer的數(shù)據(jù)源,這里的path能夠是一個(gè)本地路徑,也能夠是網(wǎng)絡(luò)路徑。
  • void setDataSource(Context context,Uri uri):通過一個(gè)Uri指定MediaPlayer的數(shù)據(jù)源,這里的Uri能夠是網(wǎng)絡(luò)路徑或這一個(gè)內(nèi)容提供者的Uri。
  • void setDataSource(FileDescriptor fd):通過一個(gè)FileDescriptor指定一個(gè)MediaPlayer的數(shù)據(jù)源。

?

MediaPlayer的音頻源

  通過上面介紹的初始化MediaPlayer的播放時(shí)媒體數(shù)據(jù)源的方法能夠看出,MediaPlayer支持的數(shù)據(jù)源有:本地文件、內(nèi)部的Uri(內(nèi)容提供者)、外部Uri。

  如,設(shè)置一個(gè)本地SD卡的資源:

1 mediaPlayer = new MediaPlayer(); 2 mediaPlayer.setDataSource("/sdcarc/a.mp3");

  注意讀內(nèi)存卡,還須要設(shè)定訪問內(nèi)存卡的權(quán)限:

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

  如,設(shè)置一個(gè)外部uri的網(wǎng)絡(luò)流媒體資源:

1 mediaPlayer = new MediaPlayer(); 2 mediaPlayer.setDataSource(http://192.168.1.102:1231/music/a.mp3);

  假設(shè)訪問網(wǎng)絡(luò)流媒體資源,還須要設(shè)置訪問網(wǎng)絡(luò)的權(quán)限:

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

?

?

使用MediaPlayer播放音樂

  MediaPlayer事實(shí)上是一個(gè)封裝的非常好的音頻、視頻流媒體操作類,假設(shè)查看其源代碼,會(huì)發(fā)現(xiàn)其內(nèi)部是調(diào)用的native方法,所以它事實(shí)上是有C++實(shí)現(xiàn)的。

  既然是一個(gè)流媒體操作類,那么必定涉及到,播放、暫停、停止等操作,實(shí)際上MediaPlayer也為我們提供了對(duì)應(yīng)的方法來直接操作流媒體。

  • void start():開始或恢復(fù)播放。
  • void stop():停止播放。
  • void pause():暫停播放。  

  通過上面三個(gè)方法,僅僅要設(shè)定好流媒體數(shù)據(jù)源,就可以在應(yīng)用中播放流媒體資源,為了更好的操作流媒體,MediaPlayer還為我們提供了一些其它的方法,這里列出一些經(jīng)常使用的,具體內(nèi)容參閱官方文檔。

  • int getDuration():獲取流媒體的總播放時(shí)長,單位是毫秒。
  • int getCurrentPosition():獲取當(dāng)前流媒體的播放的位置,單位是毫秒。
  • void seekTo(int msec):設(shè)置當(dāng)前MediaPlayer的播放位置,單位是毫秒。
  • void?setLooping(boolean looping):設(shè)置是否循環(huán)播放。
  • boolean?isLooping():推斷是否循環(huán)播放。
  • boolean? isPlaying():推斷是否正在播放。
  • void?prepare():同步的方式裝載流媒體文件。
  • void?prepareAsync():異步的方式裝載流媒體文件。
  • void?release?():回收流媒體資源。?
  • void setAudioStreamType(int streamtype):設(shè)置播放流媒體類型。
  • void setWakeMode(Context?context, int mode):設(shè)置CPU喚醒的狀態(tài)。
  • setNextMediaPlayer(MediaPlayer?next):設(shè)置當(dāng)前流媒體播放完成,下一個(gè)播放的MediaPlayer。

  大部分方法的看方法名就能夠理解,可是有幾個(gè)方法須要單獨(dú)說明一下。

  在使用MediaPlayer播放一段流媒體的時(shí)候,須要使用prepare()或prepareAsync()方法把流媒體裝載進(jìn)MediaPlayer,才干夠調(diào)用start()方法播放流媒體。                 

  setAudioStreamType()方法用于指定播放流媒體的類型,它傳遞的是一個(gè)int類型的數(shù)據(jù),均以常量定義在AudioManager類中,?一般我們播放音頻文件,設(shè)置為AudioManager.STREAM_MUSIC就可以。

  

  除了上面介紹的一些方法外,MediaPlayer還提供了一些事件的回調(diào)函數(shù),這里介紹幾個(gè)經(jīng)常使用的:

  • setOnCompletionListener(MediaPlayer.OnCompletionListener?listener):當(dāng)流媒體播放完成的時(shí)候回調(diào)。
  • setOnErrorListener(MediaPlayer.OnErrorListener?listener):當(dāng)播放中錯(cuò)誤發(fā)生的時(shí)候回調(diào)。
  • setOnPreparedListener(MediaPlayer.OnPreparedListener?listener):當(dāng)裝載流媒體完成的時(shí)候回調(diào)。
  • setOnSeekCompleteListener(MediaPlayer.OnSeekCompleteListener?listener):當(dāng)使用seekTo()設(shè)置播放位置的時(shí)候回調(diào)。

?

MediaPlayer使用技巧

  在使用MediaPlayer的使用過程中,有個(gè)小技巧須要說明一下:

  1、在使用start()播放流媒體之前,須要裝載流媒體資源。這里最好使用prepareAsync()用異步的方式裝載流媒體資源。由于流媒體資源的裝載是會(huì)消耗系統(tǒng)資源的,在一些硬件不理想的設(shè)備上,假設(shè)使用prepare()同步的方式裝載資源,可能會(huì)造成UI界面的卡頓,這是很影響用于體驗(yàn)的。由于推薦使用異步裝載的方式,為了避免還沒有裝載完畢就調(diào)用start()而報(bào)錯(cuò)的問題,須要綁定MediaPlayer.setOnPreparedListener()事件,它將在異步裝載完畢之后回調(diào)。異步裝載另一個(gè)優(yōu)點(diǎn)就是避免裝載超時(shí)引發(fā)ANR((Application Not Responding)錯(cuò)誤。

1 mediaPlayer = new MediaPlayer(); 2 mediaPlayer.setDataSource(path); 3 mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 4 5 // 通過異步的方式裝載媒體資源 6 mediaPlayer.prepareAsync(); 7 mediaPlayer.setOnPreparedListener(new OnPreparedListener() { 8 @Override 9 public void onPrepared(MediaPlayer mp) { 10 // 裝載完成回調(diào) 11 mediaPlayer.start(); 12 } 13 });

  2、使用完MediaPlayer須要回收資源。MediaPlayer是非常消耗系統(tǒng)資源的,所以在使用完MediaPlayer,不要等待系統(tǒng)自己主動(dòng)回收,最好是主動(dòng)回收資源。

1 if (mediaPlayer != null && mediaPlayer.isPlaying()) { 2 mediaPlayer.stop(); 3 mediaPlayer.release(); 4 mediaPlayer = null; 5 }

  3、使用MediaPlayer最好使用一個(gè)Service來使用,而且在Service的onDestory()方法中回收MediaPlayer資源,實(shí)際上,就算是直接使用Activity承載MediaPlayer,也最好在銷毀的時(shí)候推斷一下MediaPlayer是否被回收,假設(shè)未被回收,回收其資源,由于底層調(diào)用的native方法,假設(shè)不銷毀還是會(huì)在底層繼續(xù)播放,而承載的組件已經(jīng)被銷毀了,這個(gè)時(shí)候就無法獲取到這個(gè)MediaPlayer進(jìn)而控制它。

1 @Override 2 protected void onDestroy() { 3 if (mediaPlayer != null && mediaPlayer.isPlaying()) { 4 mediaPlayer.stop(); 5 mediaPlayer.release(); 6 mediaPlayer = null; 7 } 8 super.onDestroy(); 9 }

  4、對(duì)于單曲循環(huán)之類的操作,除了能夠使用setLooping()方法進(jìn)行設(shè)置之外,還能夠?yàn)镸ediaPlayer注冊回調(diào)函數(shù),MediaPlayer.setOnCompletionListener(),它會(huì)在MediaPlayer播放完成被回調(diào)。

1 // 設(shè)置循環(huán)播放 2 // mediaPlayer.setLooping(true); 3 mediaPlayer.setOnCompletionListener(new OnCompletionListener() { 4 5 @Override 6 public void onCompletion(MediaPlayer mp) { 7 // 在播放完成被回調(diào) 8 play(); 9 } 10 });

?  5、由于MediaPlayer一直操作的是一個(gè)流媒體,所以無可避免的可能一段流媒體資源,前半段能夠正常播放,而中間一段由于解析或者源文件錯(cuò)誤等問題,造成中間一段無法播放問題,須要我們處理這個(gè)錯(cuò)誤,否則會(huì)影響Ux(用戶體驗(yàn))。能夠?yàn)镸ediaPlayer注冊回調(diào)函數(shù)setOnErrorListener()來設(shè)置出錯(cuò)之后的解決的方法,一般又一次播放或者播放下一個(gè)流媒體就可以。  

1 mediaPlayer.setOnErrorListener(new OnErrorListener() { 2 3 @Override 4 public boolean onError(MediaPlayer mp, int what, int extra) { 5 play(); 6 return false; 7 } 8 });

?

?

Demo--一個(gè)簡單的MP3播放器

  上面已經(jīng)介紹了MediaPlayer播放一段音頻文件的全部須要用到的內(nèi)容。以下通過一個(gè)簡單的Demo來演示怎樣使用MediaPlayer播放一個(gè)SD卡上的MP3文件。操作MediaPlayer應(yīng)該放在Service中完畢,這里為了簡單,使用Activity直接操作MediaPlayer。代碼凝視里寫的非常清楚里,這里不再累述。

  運(yùn)行這個(gè)演示樣例須要在/sdcard/文件夾下存在xm.mp3的文件。  

1 package cn.bgxt.mediaplayerdemo; 2 3 import java.io.File; 4 import android.media.AudioManager; 5 import android.media.MediaPlayer; 6 import android.media.MediaPlayer.OnCompletionListener; 7 import android.media.MediaPlayer.OnErrorListener; 8 import android.media.MediaPlayer.OnPreparedListener; 9 import android.os.Bundle; 10 import android.app.Activity; 11 import android.view.View; 12 import android.widget.Button; 13 import android.widget.EditText; 14 import android.widget.Toast; 15 16 public class MainActivity extends Activity { 17 private EditText et_path; 18 private Button btn_play, btn_pause, btn_replay, btn_stop; 19 private MediaPlayer mediaPlayer; 20 21 @Override 22 protected void onCreate(Bundle savedInstanceState) { 23 super.onCreate(savedInstanceState); 24 setContentView(R.layout.activity_main); 25 26 et_path = (EditText) findViewById(R.id.et_path); 27 btn_play = (Button) findViewById(R.id.btn_play); 28 btn_pause = (Button) findViewById(R.id.btn_pause); 29 btn_replay = (Button) findViewById(R.id.btn_replay); 30 btn_stop = (Button) findViewById(R.id.btn_stop); 31 32 btn_play.setOnClickListener(click); 33 btn_pause.setOnClickListener(click); 34 btn_replay.setOnClickListener(click); 35 btn_stop.setOnClickListener(click); 36 } 37 38 private View.OnClickListener click = new View.OnClickListener() { 39 40 @Override 41 public void onClick(View v) { 42 43 switch (v.getId()) { 44 case R.id.btn_play: 45 play(); 46 break; 47 case R.id.btn_pause: 48 pause(); 49 break; 50 case R.id.btn_replay: 51 replay(); 52 break; 53 case R.id.btn_stop: 54 stop(); 55 break; 56 default: 57 break; 58 } 59 } 60 }; 61 /** 62 * 播放音樂 63 */ 64 protected void play() { 65 String path = et_path.getText().toString().trim(); 66 File file = new File(path); 67 if (file.exists() && file.length() > 0) { 68 try { 69 mediaPlayer = new MediaPlayer(); 70 // 設(shè)置指定的流媒體地址 71 mediaPlayer.setDataSource(path); 72 // 設(shè)置音頻流的類型 73 mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 74 75 // 通過異步的方式裝載媒體資源 76 mediaPlayer.prepareAsync(); 77 mediaPlayer.setOnPreparedListener(new OnPreparedListener() { 78 @Override 79 public void onPrepared(MediaPlayer mp) { 80 // 裝載完成 開始播放流媒體 81 mediaPlayer.start(); 82 Toast.makeText(MainActivity.this, "開始播放", 0).show(); 83 // 避免反復(fù)播放,把播放button設(shè)置為不可用 84 btn_play.setEnabled(false); 85 } 86 }); 87 // 設(shè)置循環(huán)播放 88 // mediaPlayer.setLooping(true); 89 mediaPlayer.setOnCompletionListener(new OnCompletionListener() { 90 91 @Override 92 public void onCompletion(MediaPlayer mp) { 93 // 在播放完成被回調(diào) 94 btn_play.setEnabled(true); 95 } 96 }); 97 98 mediaPlayer.setOnErrorListener(new OnErrorListener() { 99 100 @Override 101 public boolean onError(MediaPlayer mp, int what, int extra) { 102 // 假設(shè)錯(cuò)誤發(fā)生,又一次播放 103 replay(); 104 return false; 105 } 106 }); 107 } catch (Exception e) { 108 e.printStackTrace(); 109 Toast.makeText(this, "播放失敗", 0).show(); 110 } 111 } else { 112 Toast.makeText(this, "文件不存在", 0).show(); 113 } 114 115 } 116 /** 117 * 暫停 118 */ 119 protected void pause() { 120 if (btn_pause.getText().toString().trim().equals("繼續(xù)")) { 121 btn_pause.setText("暫停"); 122 mediaPlayer.start(); 123 Toast.makeText(this, "繼續(xù)播放", 0).show(); 124 return; 125 } 126 if (mediaPlayer != null && mediaPlayer.isPlaying()) { 127 mediaPlayer.pause(); 128 btn_pause.setText("繼續(xù)"); 129 Toast.makeText(this, "暫停播放", 0).show(); 130 } 131 132 } 133 134 /** 135 * 又一次播放 136 */ 137 protected void replay() { 138 if (mediaPlayer != null && mediaPlayer.isPlaying()) { 139 mediaPlayer.seekTo(0); 140 Toast.makeText(this, "又一次播放", 0).show(); 141 btn_pause.setText("暫停"); 142 return; 143 } 144 play(); 145 } 146 147 /** 148 * 停止播放 149 */ 150 protected void stop() { 151 if (mediaPlayer != null && mediaPlayer.isPlaying()) { 152 mediaPlayer.stop(); 153 mediaPlayer.release(); 154 mediaPlayer = null; 155 btn_play.setEnabled(true); 156 Toast.makeText(this, "停止播放", 0).show(); 157 } 158 159 } 160 161 @Override 162 protected void onDestroy() { 163 // 在activity結(jié)束的時(shí)候回收資源 164 if (mediaPlayer != null && mediaPlayer.isPlaying()) { 165 mediaPlayer.stop(); 166 mediaPlayer.release(); 167 mediaPlayer = null; 168 } 169 super.onDestroy(); 170 } 171 }

?

 效果展示:




轉(zhuǎn)載于:https://www.cnblogs.com/mengfanrong/p/4310387.html

總結(jié)

以上是生活随笔為你收集整理的Android开发之Mediaplayer的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产视频h| 亚洲动漫精品 | 天堂网成人 | 官场艳妇疯狂性关系 | ass日本粉嫩pics珍品 | 久久作爱 | 九九精品在线观看视频 | 貂蝉被到爽流白浆在线观看 | 欧美日本韩国一区二区 | av激情影院 | 天天看天天爽 | 女女av在线| 亚洲精品乱码久久久久久9色 | 玖玖爱这里只有精品 | 91亚洲视频在线 | 亚洲乱熟女一区二区 | 中文字幕无码毛片免费看 | 日韩欧美电影一区二区三区 | 日韩精品一区二区三区视频在线观看 | 亚洲精品日韩在线观看 | 国产精品久久久久久久久晋中 | 欧美在线视频一区二区 | 毛片久久久久久久 | 两个人看的www视频免费完整版 | 6080电视影片在线观看 | 欧美日韩视频在线播放 | 噜噜噜av | 免费看黄色片的网站 | 欧美大色 | 日韩在线视频在线观看 | 成人乱人乱一区二区三区一级视频 | 国产日 | 国产馆在线观看 | 国产白浆在线 | 日本一区二区免费高清视频 | 久久亚洲av午夜福利精品一区 | 日韩性生交大片免费看 | 日本精品一区二区三区视频 | 意大利性荡欲xxxxxx | 黄色一级大片免费版 | 国产一区二区免费在线观看 | 黄色精品| 精品人人人人 | 女性裸体瑜伽无遮挡 | 亚洲综合欧美综合 | 精产国品一二三产品蜜桃 | 欧美俄罗斯乱妇 | 国产小精品 | 女生毛片 | 亚洲美女视频在线 | 欧美图片一区 | 中文字幕第一页久久 | 午夜精华| 国产精品国语对白 | 国产高潮网站 | 国产精品久久国产愉拍 | 日韩美一级片 | 激情欧美一区二区 | 韩国伦理电影免费在线 | 秋霞午夜网 | av日日操 | 亚洲AV无码精品国产 | 国产ts在线视频 | 黄色三级三级三级三级 | 欧美日一本 | www.久久.com| 极品人妻一区二区 | 国产成人亚洲综合a∨婷婷 台湾a级片 | 国产精品丝袜视频 | 91丨porny丨中文 | 国产尤物视频在线 | 影音先锋成人资源网站 | 免费人成在线观看 | 夜夜高潮夜夜爽国产伦精品 | 农民人伦一区二区三区 | 日韩福利影院 | 男同av在线观看一区二区三区 | 色女人在线 | 国产中文字幕在线播放 | 成人av手机在线观看 | 色婷婷精品国产一区二区三区 | 爱逼av| 永久免费看片在线观看 | 日本黄色片段 | 亚洲欧美一区二区精品久久久 | 无码黑人精品一区二区 | 啪啪网免费 | 影院一区 | 中国女人性猛交 | 国产精品suv一区二区88 | 在线免费成人网 | 精品99久久| 老妇高潮潮喷到猛进猛出 | 精品人妻午夜一区二区三区四区 | 日本少妇色| 男女网站在线观看 | 中文人妻一区二区三区 | 免费观看黄色av | 日本午夜三级 |