亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > OS > 安卓 > 正文

Android實現使用流媒體播放遠程mp3文件的方法

2024-09-11 17:15:13
字體:
來源:轉載
供稿:網友

本文實例講述了Android實現使用流媒體播放遠程mp3文件的方法。分享給大家供大家參考,具體如下:

package com.shadow.util;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.net.URL;import java.net.URLConnection;import java.util.ArrayList;import java.util.List;import com.shadow.service.AudioPlayService.LocalBinder;import android.app.Service;import android.content.Context;import android.content.Intent;import android.media.MediaPlayer;import android.os.Binder;import android.os.Handler;import android.os.IBinder;import android.util.Log;import android.widget.Button;import android.widget.ImageButton;import android.widget.ProgressBar;import android.widget.TextView;import android.widget.Toast;/** * MediaPlayer does not yet support streaming from external URLs so this class provides a pseudo-streaming function * by downloading the content incrementally & playing as soon as we get enough audio in our temporary storage. */public class StreamingMediaPlayer extends Service{  private static final int INTIAL_KB_BUFFER = 96*10/8;//assume 96kbps*10secs/8bits per byte  private TextView textStreamed;  private ImageButton playButton;  private ProgressBar  progressBar;  // Track for display by progressBar  private long mediaLengthInKb, mediaLengthInSeconds;  private int totalKbRead = 0;  // Create Handler to call View updates on the main UI thread.  private final Handler handler = new Handler();  private MediaPlayer   mediaPlayer;  private File downloadingMediaFile;  private boolean isInterrupted;  private Context context;  private int counter = 0;  private static Runnable r;  private static Thread playerThread;  private LocalBinder localBinder = new LocalBinder();  private MediaPlayer player;  private boolean isPause = false;   //播放器是否處于暫停狀態  private boolean isSame = false;   //所點播歌曲是否是當前播放歌曲  private Integer position = -1;    //設置播放標記  private List<String> music_name;   //歌曲列表  private List<String> music_path;   public StreamingMediaPlayer(Context context,TextView textStreamed, ImageButton  playButton, Button  streamButton,ProgressBar  progressBar)   {     this.context = context;    this.textStreamed = textStreamed;    this.playButton = playButton;    this.progressBar = progressBar;  }  /**   * Progressivly download the media to a temporary location and update the MediaPlayer as new content becomes available.   */  public void startStreaming(final String mediaUrl, long  mediaLengthInKb, long  mediaLengthInSeconds) throws IOException {    this.mediaLengthInKb = mediaLengthInKb;    this.mediaLengthInSeconds = mediaLengthInSeconds;    r = new Runnable() {      public void run() {        try {          Log.i("downloadAudioIncrement", "downloadAudioIncrement");          downloadAudioIncrement(mediaUrl);        } catch (IOException e) {          Log.e(getClass().getName(), "Unable to initialize the MediaPlayer for fileUrl=" + mediaUrl, e);          return;        }      }    };    playerThread = new Thread(r);    playerThread.start();    //new Thread(r).start();  }  /**   * Download the url stream to a temporary location and then call the setDataSource   * for that local file   */  public void downloadAudioIncrement(String mediaUrl) throws IOException {    URLConnection cn = new URL(mediaUrl).openConnection();    cn.addRequestProperty("User-Agent","NSPlayer/10.0.0.4072 WMFSDK/10.0");    cn.connect();    InputStream stream = cn.getInputStream();    if (stream == null) {      Log.e(getClass().getName(), "Unable to create InputStream for mediaUrl:" + mediaUrl);    }    downloadingMediaFile = new File(context.getCacheDir(),"downloadingMedia.dat");    // Just in case a prior deletion failed because our code crashed or something, we also delete any previously    // downloaded file to ensure we start fresh. If you use this code, always delete    // no longer used downloads else you'll quickly fill up your hard disk memory. Of course, you can also    // store any previously downloaded file in a separate data cache for instant replay if you wanted as well.    if (downloadingMediaFile.exists()) {      downloadingMediaFile.delete();    }    FileOutputStream out = new FileOutputStream(downloadingMediaFile);    byte buf[] = new byte[16384];    int totalBytesRead = 0, incrementalBytesRead = 0;    do {      int numread = stream.read(buf);      if (numread <= 0)        break;      out.write(buf, 0, numread);      totalBytesRead += numread;      incrementalBytesRead += numread;      totalKbRead = totalBytesRead/1000;      testMediaBuffer();        fireDataLoadUpdate();    } while (validateNotInterrupted());        stream.close();    if (validateNotInterrupted()) {        fireDataFullyLoaded();    }  }  private boolean validateNotInterrupted() {    if (isInterrupted) {      if (mediaPlayer != null) {        mediaPlayer.pause();        //mediaPlayer.release();      }      return false;    } else {      return true;    }  }  /**   * Test whether we need to transfer buffered data to the MediaPlayer.   * Interacting with MediaPlayer on non-main UI thread can causes crashes to so perform this using a Handler.   */  private void testMediaBuffer() {    Runnable updater = new Runnable() {      public void run() {        if (mediaPlayer == null) {          // Only create the MediaPlayer once we have the minimum buffered data          if ( totalKbRead >= INTIAL_KB_BUFFER) {            try {              startMediaPlayer();            } catch (Exception e) {              Log.e(getClass().getName(), "Error copying buffered conent.", e);            }          }        } else if ( mediaPlayer.getDuration() - mediaPlayer.getCurrentPosition() <= 1000 ){          // NOTE: The media player has stopped at the end so transfer any existing buffered data          // We test for < 1second of data because the media player can stop when there is still          // a few milliseconds of data left to play          transferBufferToMediaPlayer();        }      }    };    handler.post(updater);  }  private void startMediaPlayer() {    try {      File bufferedFile = new File(context.getCacheDir(),"playingMedia" + (counter++) + ".dat");      // We double buffer the data to avoid potential read/write errors that could happen if the      // download thread attempted to write at the same time the MediaPlayer was trying to read.      // For example, we can't guarantee that the MediaPlayer won't open a file for playing and leave it locked while      // the media is playing. This would permanently deadlock the file download. To avoid such a deadloack,      // we move the currently loaded data to a temporary buffer file that we start playing while the remaining      // data downloads.      moveFile(downloadingMediaFile,bufferedFile);      Log.e(getClass().getName(),"Buffered File path: " + bufferedFile.getAbsolutePath());      Log.e(getClass().getName(),"Buffered File length: " + bufferedFile.length()+"");      mediaPlayer = createMediaPlayer(bufferedFile);      // We have pre-loaded enough content and started the MediaPlayer so update the buttons & progress meters.      mediaPlayer.start();      startPlayProgressUpdater();      playButton.setEnabled(true);    } catch (IOException e) {      Log.e(getClass().getName(), "Error initializing the MediaPlayer.", e);      return;    }  }  public void pausePlayer(){    try {      getMediaPlayer().pause();    } catch (Exception e) {      e.printStackTrace();    }  }  public void startPlayer(){    getMediaPlayer().start();  }  public void stopPlayer(){    getMediaPlayer().stop();  }  /**   * 根據文件創建一個mediaplayer對象   */  private MediaPlayer createMediaPlayer(File mediaFile)  throws IOException {    MediaPlayer mPlayer = new MediaPlayer();    mPlayer.setOnErrorListener(        new MediaPlayer.OnErrorListener() {          public boolean onError(MediaPlayer mp, int what, int extra) {            Log.e(getClass().getName(), "Error in MediaPlayer: (" + what +") with extra (" +extra +")" );            return false;          }        });    // It appears that for security/permission reasons, it is better to pass a FileDescriptor rather than a direct path to the File.    // Also I have seen errors such as "PVMFErrNotSupported" and "Prepare failed.: status=0x1" if a file path String is passed to    // setDataSource(). So unless otherwise noted, we use a FileDescriptor here.    FileInputStream fis = new FileInputStream(mediaFile);    mPlayer.setDataSource(fis.getFD());    mPlayer.prepare();    return mPlayer;}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久伊人91精品综合网站| 亚洲精品福利免费在线观看| 亚洲激情第一页| 青青草原一区二区| 按摩亚洲人久久| 国产精品91在线观看| 亚洲精品日韩欧美| 91在线看www| 亚洲精品国产精品自产a区红杏吧| 疯狂做受xxxx欧美肥白少妇| 91中文字幕一区| 国产一区欧美二区三区| 高跟丝袜一区二区三区| 57pao成人永久免费视频| 日韩亚洲第一页| 日韩中文字幕不卡视频| 国产精品一二三在线| 欧美插天视频在线播放| 久久免费观看视频| 欧美成aaa人片在线观看蜜臀| 欧美日韩中文在线| 91在线观看免费高清| 亚洲精品少妇网址| 国产精品久久久久久久久久久久| 欧美精品福利在线| 欧美理论在线观看| 欧美黑人视频一区| 欧美丝袜一区二区三区| 亚洲精品videossex少妇| 欧美激情精品久久久久久| 北条麻妃99精品青青久久| 成人精品视频久久久久| 日韩美女免费线视频| 国产欧美日韩精品在线观看| 成人免费视频在线观看超级碰| 国产综合色香蕉精品| 亚洲女同精品视频| 国产成人在线一区| 久久成人精品电影| 国产精品久久综合av爱欲tv| 91在线|亚洲| 亚洲精品国产精品国产自| 国产精品黄页免费高清在线观看| 国产精品一区专区欧美日韩| 亚洲精品综合久久中文字幕| 精品亚洲永久免费精品| 亚洲欧美国内爽妇网| 欧美高清第一页| 最新91在线视频| 成人妇女淫片aaaa视频| 久久久久久久久久久av| 日本韩国欧美精品大片卡二| 久久久久久久一| 亚洲欧美日韩精品久久亚洲区| 亚洲成人精品视频在线观看| 日韩电影在线观看中文字幕| 亚洲成人激情视频| 亚洲国产另类 国产精品国产免费| 国产精品中文久久久久久久| 欧美三级欧美成人高清www| 岛国av一区二区三区| 国产91色在线|| 久久久久北条麻妃免费看| 国产精品网站入口| www.xxxx欧美| 久久精品国产一区二区电影| 国产精品久久久久久久久久免费| 国产精品va在线| 亚洲图片制服诱惑| 久久精品电影网| 日韩精品丝袜在线| 另类美女黄大片| 欧美性视频网站| 亚洲欧美在线免费观看| 国产精品91久久久| 懂色av一区二区三区| 国产日韩av在线播放| 成人av番号网| 日韩中文字幕欧美| 欧美日韩亚洲视频| 国产99视频精品免视看7| 欧美一区二区.| www.亚洲男人天堂| 国产精品久久91| 热久久免费国产视频| 久久伊人精品视频| 成人午夜一级二级三级| 欧美劲爆第一页| 成人福利在线视频| 国产精自产拍久久久久久| 国产精品久久久久久婷婷天堂| 欧美日韩视频在线| 日韩精品免费看| 欧美人成在线视频| 日韩一区二区精品视频| 欧美激情一区二区三区久久久| 欧美亚洲国产视频| 国产伦精品一区二区三区精品视频| 日韩精品中文字幕有码专区| 亚洲电影免费观看高清| 亚洲免费av片| 亚洲男人天堂手机在线| 亚洲国产成人av在线| 国产精品中文字幕久久久| 亚洲深夜福利视频| 91精品久久久久久久久久另类| 国产精品电影久久久久电影网| 日韩中文在线视频| 国内自拍欧美激情| 亚洲欧洲av一区二区| 欧美成人合集magnet| 亚洲一级黄色av| 亚洲精品在线91| 国产精品专区一| 欧美在线激情网| 日韩性xxxx爱| 日韩在线播放视频| 性日韩欧美在线视频| 高跟丝袜欧美一区| 8090理伦午夜在线电影| 亚洲精品欧美日韩| 亚洲美女视频网站| 91av在线免费观看| 精品夜色国产国偷在线| 久久在线观看视频| 亚洲综合第一页| 国产午夜一区二区| 日韩av中文字幕在线播放| 精品国产福利在线| 国产午夜一区二区| 亚洲女人天堂色在线7777| 91精品国产高清久久久久久| 亚洲高清一区二| 欧美成人午夜激情视频| 精品国产一区二区三区久久久| 国产91久久婷婷一区二区| 国产精品美女久久久免费| www.欧美精品一二三区| 国产一区二区激情| 蜜月aⅴ免费一区二区三区| 91中文在线视频| 亚洲老板91色精品久久| 日韩精品欧美激情| 国产精品网站视频| 欧美日韩国产中文精品字幕自在自线| 欧美黑人极品猛少妇色xxxxx| 亚洲电影免费观看高清完整版在线| 欧美精品免费播放| 日韩中文字幕视频| 久久精品色欧美aⅴ一区二区| 国产日本欧美一区二区三区在线| 日本欧美一二三区| 日韩视频亚洲视频| 97视频免费看| 亚洲国产天堂久久国产91| 亚洲欧美制服另类日韩| 亚洲女成人图区| 欧美中文字幕视频| 久久乐国产精品| 国产精品视频色| 亚洲国产精品人久久电影| 国产精品视频自在线| 亚洲 日韩 国产第一| 亚洲欧美日韩另类|