欧美大屁股bbbbxxxx,狼人大香伊蕉国产www亚洲,男ji大巴进入女人的视频小说,男人把ji大巴放进女人免费视频,免费情侣作爱视频

歡迎來到入門教程網!

Android

當前位置:主頁 > 軟件編程 > Android >

Android MediaPlayer 音頻的方式

來源:本站原創(chuàng)|時間:2020-01-10|欄目:Android|點擊: 次

主要介紹使用MediaPlayer 音頻的方式。關于MediaPlayer的基礎知識,比如狀態(tài),可以參考Android MediaPlayer 基礎簡介。

為了方便表達,定義變量名為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();

設置音源 - setDataSource

通過調用setDataSource來設置音源。setDataSource有多個重載方法,我們來看常用的幾種。

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

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

本地文件,需要文件的絕對路徑。

mediaPlayer.setDataSource(file.getAbsolutePath());

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

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

設置網絡音頻,也是用setDataSource方法,設置url。

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

網絡音頻時,如果使用的是http,有可能會報錯

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

可以簡單地設置一下manifest,設置usesCleartextTraffic=”true”

<application
 android:usesCleartextTraffic="true">

準備 - prepare

同步和異步準備音頻資源。prepareAsync()是異步的方式,prepare是同步的。注意線程調度問題,同時不要阻塞UI線程。

使用異步方式準備音頻,經常與MediaPlayer.OnPreparedListener監(jiān)聽器配合使用。異步準備時,也可以進行其他的設置。

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

循環(huán) - Looping

設置循環(huán) setLooping。

mediaPlayer.setLooping(true);

完畢后,不會回調OnCompletionListener,而是從頭 當前音頻。

- start

音頻,調用start方法。

mediaPlayer.start();

處于Prepared,Pause和PlaybackComplete狀態(tài)時,可以調用start方法,進入Started狀態(tài)。

暫停 - pause

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

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

 

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

停止 - stop

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

mediaPlayer.stop();

調進度 - seekTo

調整 進度。我們平時使用音樂 軟件一般都會有這個功能。
seekTo方法接受一個毫秒參數(shù)。

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

 

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

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

reset后的mediaPlayer進入Idle狀態(tài)。需要重新設置音源與準備。

釋放 - release

不再使用這個mediaPlayer時,應當盡快釋放掉,以釋放相關的資源。

調用release后,mediaPlayer進入End狀態(tài)。此時這個mediaPlayer就不能再使用了。

常用監(jiān)聽器

緩沖監(jiān)聽器 OnBufferingUpdateListener

比如我們加載網絡音頻的時候,常用這個監(jiān)聽器來監(jiān)聽緩沖進度。顯示緩沖進度,也可以提高用戶體驗。

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

錯誤監(jiān)聽器 OnErrorListener

mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
 @Override
 public boolean onError(MediaPlayer mediaPlayer, int i, int i1) {
 return true; // 返回true表示在此處理錯誤,不會回調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)聽器 OnCompletionListener

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

使用示例

assets里的音頻

assets里的音頻文件,使用到AssetFileDescriptor類。使用后記得關閉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);
 }
}

在線音頻

設置url, 在線音頻

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);
 }
}

代碼可以參考示例工程: https://github.com/RustFisher/android-MediaPlayer

總結

以上所述是小編給大家介紹的Android MediaPlayer 音頻的方式,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對我們網站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!

上一篇:Android使用MediaPlayer和TextureView實現(xiàn)視頻無縫切換

欄    目:Android

下一篇:Android 使用URLConnection下載音頻文件的方法

本文標題:Android MediaPlayer 音頻的方式

本文地址:http://mengdiqiu.com.cn/a1/Android/9171.html

網頁制作CMS教程網絡編程軟件編程腳本語言數(shù)據(jù)庫服務器

如果侵犯了您的權利,請與我們聯(lián)系,我們將在24小時內進行處理、任何非本站因素導致的法律后果,本站均不負任何責任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網 版權所有