真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

AndroidMediaPlayer如何實(shí)現(xiàn)播放音頻的方式

小編給大家分享一下Android MediaPlayer如何實(shí)現(xiàn)播放音頻的方式,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

創(chuàng)新互聯(lián)專(zhuān)注于企業(yè)營(yíng)銷(xiāo)型網(wǎng)站、網(wǎng)站重做改版、衡水網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5網(wǎng)站設(shè)計(jì)、商城網(wǎng)站開(kāi)發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性?xún)r(jià)比高,為衡水等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。

主要介紹使用MediaPlayer播放音頻的方式。關(guān)于MediaPlayer的基礎(chǔ)知識(shí),比如狀態(tài),可以參考Android MediaPlayer 基礎(chǔ)簡(jiǎn)介。

為了方便表達(dá),定義變量名為mediaPlayer。

MediaPlayer的使用方式

創(chuàng)建MediaPlayer

可以直接 new MediaPlayer,也可以用MediaPlayer提供的create方法創(chuàng)建。

mediaPlayer = new MediaPlayer();

使用create方法創(chuàng)建成功后,mediaPlayer處于Prepared狀態(tài)??梢灾苯觭tart播放。

mediaPlayer = MediaPlayer.create(getApplicationContext(), Uri.fromFile(file));
mediaPlayer.start();

設(shè)置音源 - setDataSource

通過(guò)調(diào)用setDataSource來(lái)設(shè)置音源。setDataSource有多個(gè)重載方法,我們來(lái)看常用的幾種。

例如設(shè)置使用assets里的資源。實(shí)際情況可能需要try catch。

AssetFileDescriptor fd = null;
MediaPlayer mediaPlayer = new MediaPlayer();
fd = context.getApplicationContext().getAssets().openFd(name);
mediaPlayer.setDataSource(fd.getFileDescriptor(), fd.getStartOffset(), fd.getLength());

本地文件,需要文件的絕對(duì)路徑。

mediaPlayer.setDataSource(file.getAbsolutePath());

或者獲取文件的Uri來(lái)創(chuàng)建mediaPlayer。

mediaPlayer = MediaPlayer.create(getApplicationContext(), Uri.fromFile(file));

設(shè)置網(wǎng)絡(luò)音頻,也是用setDataSource方法,設(shè)置url。

mediaPlayer.setDataSource("https://demo.com/sample.mp3"));

播放網(wǎng)絡(luò)音頻時(shí),如果使用的是http,有可能會(huì)報(bào)錯(cuò)

java.io.IOException: Cleartext HTTP traffic to demo.com not permitted

可以簡(jiǎn)單地設(shè)置一下manifest,設(shè)置usesCleartextTraffic=”true”

準(zhǔn)備 - prepare

同步和異步準(zhǔn)備音頻資源。prepareAsync()是異步的方式,prepare是同步的。注意線(xiàn)程調(diào)度問(wèn)題,同時(shí)不要阻塞UI線(xiàn)程。

使用異步方式準(zhǔn)備音頻,經(jīng)常與MediaPlayer.OnPreparedListener監(jiān)聽(tīng)器配合使用。異步準(zhǔn)備時(shí),也可以進(jìn)行其他的設(shè)置。

mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
 @Override
 public void onPrepared(MediaPlayer mediaPlayer) {
 mediaPlayer.start(); // 準(zhǔn)備好了就播放
 }
});

循環(huán)播放 - Looping

設(shè)置循環(huán)播放setLooping。

mediaPlayer.setLooping(true);

播放完畢后,不會(huì)回調(diào)OnCompletionListener,而是從頭播放當(dāng)前音頻。

播放 - start

播放音頻,調(diào)用start方法。

mediaPlayer.start();

處于Prepared,Pause和PlaybackComplete狀態(tài)時(shí),可以調(diào)用start方法,進(jìn)入Started狀態(tài)。

暫停 - pause

暫停播放,使用pause方法。在暫停前先判斷一下mediaPlayer的是否在播放。

if (mediaPlayer.isPlaying()) {
 mediaPlayer.pause();
}

暫停成功則處于Paused狀態(tài)。

停止 - stop

回顧一下MediaPlayer狀態(tài)切換的圖示,我們可以得知在播放中,暫停,播放完成這3個(gè)狀態(tài)下,可以調(diào)用stop方法,進(jìn)入Stopped狀態(tài)。

mediaPlayer.stop();

調(diào)進(jìn)度 - seekTo

調(diào)整播放進(jìn)度。我們平時(shí)使用音樂(lè)播放軟件一般都會(huì)有這個(gè)功能。
seekTo方法接受一個(gè)毫秒?yún)?shù)。

int targetMS = (int) (percent * mediaPlayer.getDuration());
mediaPlayer.seekTo(targetMS);

seekTo并不會(huì)改變MediaPlayer的狀態(tài)。

int targetMS = (int) (percent * mediaPlayer.getDuration());
mediaPlayer.seekTo(targetMS);

reset后的mediaPlayer進(jìn)入Idle狀態(tài)。需要重新設(shè)置音源與準(zhǔn)備。

釋放 - release

不再使用這個(gè)mediaPlayer時(shí),應(yīng)當(dāng)盡快釋放掉,以釋放相關(guān)的資源。

調(diào)用release后,mediaPlayer進(jìn)入End狀態(tài)。此時(shí)這個(gè)mediaPlayer就不能再使用了。

常用監(jiān)聽(tīng)器

緩沖監(jiān)聽(tīng)器 OnBufferingUpdateListener

比如我們加載網(wǎng)絡(luò)音頻的時(shí)候,常用這個(gè)監(jiān)聽(tīng)器來(lái)監(jiān)聽(tīng)緩沖進(jìn)度。顯示緩沖進(jìn)度,也可以提高用戶(hù)體驗(yàn)。

mMediaPlayer.prepareAsync();
mMediaPlayer.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() {
 @Override
 public void onBufferingUpdate(MediaPlayer mp, int percent) {
 // percent代表緩沖百分比
 }
});

錯(cuò)誤監(jiān)聽(tīng)器 OnErrorListener

mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
 @Override
 public boolean onError(MediaPlayer mediaPlayer, int i, int i1) {
 return true; // 返回true表示在此處理錯(cuò)誤,不會(huì)回調(diào)onCompletion
 }
});

注意onError的返回值。可以選擇自己處理error。

 * @return True if the method handled the error, false if it didn't.
 * Returning false, or not having an OnErrorListener at all, will
 * cause the OnCompletionListener to be called.
 */
boolean onError(MediaPlayer mp, int what, int extra);

播放完畢監(jiān)聽(tīng)器 OnCompletionListener

mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
 @Override
 public void onCompletion(MediaPlayer mediaPlayer) {
 // 播放完畢
 }
});

使用示例

播放assets里的音頻

播放assets里的音頻文件,使用到AssetFileDescriptor類(lèi)。使用后記得關(guān)閉AssetFileDescriptor。

private void playAssetsAudio(final String name, Context context) {
 Log.d(TAG, "playAssetWordSound: try to play assets sound file. -> " + name);
 AssetFileDescriptor fd = null;
 try {
 MediaPlayer mediaPlayer;
 Log.v(TAG, "Looking in assets.");
 fd = context.getApplicationContext().getAssets().openFd(name);
 mediaPlayer = new MediaPlayer();
 mediaPlayer.reset();
 mediaPlayer.setDataSource(fd.getFileDescriptor(), fd.getStartOffset(), fd.getLength());
 mediaPlayer.prepareAsync();
 mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
  @Override
  public void onPrepared(MediaPlayer mediaPlayer) {
  Log.d(TAG, "onPrepared: " + name);
  mediaPlayer.start();
  }
 });
 mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
  @Override
  public void onCompletion(MediaPlayer mp) {
  mp.release();
  Log.d(TAG, "onCompletion: " + name);
  }
 });
 mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
  @Override
  public boolean onError(MediaPlayer mp, int i, int i1) {
  mp.release();
  return true;
  }
 });
 } catch (Exception e) {
 try {
  if (fd != null) {
  fd.close();
  }
 } catch (Exception e1) {
  Log.e(TAG, "Exception close fd: ", e1);
 }
 } finally {
 if (fd != null) {
  try {
  fd.close();
  } catch (IOException e) {
  Log.e(TAG, "Finally, close fd ", e);
  }
 }
 }
}

播放本地音頻文件

嘗試播放音頻文件。僅播放一次。

private void playAudioFile(final File file) {
 Log.d(TAG, "playAudioFile: " + file.getAbsolutePath());
 MediaPlayer mediaPlayer;
 try {
 mediaPlayer = new MediaPlayer();
 mediaPlayer.setLooping(false);
 mediaPlayer.setDataSource(file.getAbsolutePath());
 mediaPlayer.prepare();
 mediaPlayer.start();
 mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
  @Override
  public void onCompletion(MediaPlayer mp) {
  mp.release();
  }
 });
 mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
  @Override
  public boolean onError(MediaPlayer mediaPlayer, int i, int i1) {
  Log.d(TAG, "Play local sound onError: " + i + ", " + i1);
  return true;
  }
 });
 } catch (Exception e) {
 Log.e(TAG, "playAudioFile: ", e);
 }
}

播放在線(xiàn)音頻

設(shè)置url,播放在線(xiàn)音頻

private void playOnlineSound(String soundUrlDict) {
 try {
 MediaPlayer mediaPlayer = new MediaPlayer();
 mediaPlayer.setDataSource(soundUrlDict);
 mediaPlayer.prepareAsync();
 mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
  @Override
  public void onPrepared(MediaPlayer mediaPlayer) {
  mediaPlayer.start();
  }
 });
 mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
  @Override
  public void onCompletion(MediaPlayer mp) {
  if (mp != null) {
   mp.release();
  }
  Log.d(TAG, "onCompletion: play sound.");
  }
 });
 mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
  @Override
  public boolean onError(MediaPlayer mediaPlayer, int i, int i1) {
  Log.d(TAG, "Play online sound onError: " + i + ", " + i1);
  return false;
  }
 });
 } catch (IOException e1) {
 Log.e(TAG, "url: ", e1);
 }
}

以上是“Android MediaPlayer如何實(shí)現(xiàn)播放音頻的方式”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!


網(wǎng)頁(yè)標(biāo)題:AndroidMediaPlayer如何實(shí)現(xiàn)播放音頻的方式
當(dāng)前路徑:http://weahome.cn/article/jeedod.html

其他資訊

在線(xiàn)咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部