android 分段下载.docx

上传人:b****5 文档编号:28876054 上传时间:2023-07-20 格式:DOCX 页数:10 大小:15.99KB
下载 相关 举报
android 分段下载.docx_第1页
第1页 / 共10页
android 分段下载.docx_第2页
第2页 / 共10页
android 分段下载.docx_第3页
第3页 / 共10页
android 分段下载.docx_第4页
第4页 / 共10页
android 分段下载.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

android 分段下载.docx

《android 分段下载.docx》由会员分享,可在线阅读,更多相关《android 分段下载.docx(10页珍藏版)》请在冰豆网上搜索。

android 分段下载.docx

android分段下载

/**

*Android提供的接口仍然是不能直接通过流创建Player,但是Android提供了很全面的文件系统接口,现在用一种新的方法来解决:


*<1>,把下载下来的数据先写到临时的文件中

*<2>,用临时文件创建Player

*todo:


*<1>,清理没有用的临时文件。


*<2>,暂停逻辑的优化。

---抛出异常。


*<3>,分段下载的逻辑处理,这和<2>有关系。


*<4>,整体优化

*

*@authorshenrenkui

*

*/

publicclassAudioPlayerimplementsOnErrorListener,OnBufferingUpdateListener,

MediaPlayer.OnCompletionListener{

privatestaticfinalStringTAG="AudioPlayer";

privateMediaPlayermPlayer;

privateStringcurrent;

privatestaticfinalintMIN_BUFF=100*1024;

privateinttotalKbRead=0;

privateHandlerhandler=newHandler();

privateFileDLTempFile;

privateFileBUFFTempFile;

privatefinalStringTEMP_DOWNLOAD_FILE_NAME="tempMediaData";

privatefinalStringTEMP_BUFF_FILE_NAME="tempBufferData";

privatefinalStringFILE_POSTFIX=".dat";

privatefinalintPER_READ=1024;

privatebooleanpause;

privatebooleanstop;

privatefinalintUNKNOWN_LENGTH=-1;

privateHandlermHandler=null;

publicvoidsetHandler(Handlerhandler){

mHandler=handler;

}

publicvoidplay(finalStringpath){

downloadOver=false;

totalKbRead=0;

try{

Log.v(TAG,"playing:

"+path);

if(path.equals(current)&&mPlayer!

=null){

mPlayer.start();

return;

}

current=path;

mPlayer=null;

newPlayThread(current).start();

}catch(Exceptione){

}

}

privatevoidsetListener(){

if(mPlayer!

=null){

mPlayer.setOnErrorListener(this);

mPlayer.setOnBufferingUpdateListener(this);

mPlayer.setOnCompletionListener(this);

}

}

/**

*下载数据,分段下载

*todo:

联网方式和分段

*@parammediaUrl

*@paramstart

*@paramend

*/

privatevoidplayFromNet(StringmediaUrl,intstart,intend){

URLConnectioncn=null;

FileOutputStreamout=null;

InputStreamis=null;

try{

cn=newURL(mediaUrl).openConnection();

cn.connect();

is=cn.getInputStream();

intmediaLength=cn.getContentLength();

if(is==null){

return;

}

deleteTempFile(true);

DLTempFile=File.createTempFile(TEMP_DOWNLOAD_FILE_NAME,

FILE_POSTFIX);

out=newFileOutputStream(DLTempFile);

bytebuf[]=newbyte[PER_READ];

intreadLength=0;

while(readLength!

=-1&&!

stop){

if(pause){

try{

Thread.sleep(1000);

}catch(InterruptedExceptione){

e.printStackTrace();

}

continue;

}

readLength=is.read(buf);

if(readLength>0){

try{

out.write(buf,0,readLength);

totalKbRead+=readLength;

}catch(Exceptione){

Log.e(TAG,e.toString());

}

}

dealWithBufferData();

}

if(totalKbRead==mediaLength){

downloadOver=true;

dealWithLastData();

//删除临时文件

if(DLTempFile!

=null&&DLTempFile.exists()){

DLTempFile.delete();

}

}

}catch(MalformedURLExceptione){

Log.e(TAG,e.toString());

}catch(IOExceptione){

Log.e(TAG,e.toString());

}finally{

if(out!

=null){

try{

out.close();

}catch(IOExceptione){

e.printStackTrace();

}

}

if(is!

=null){

try{

is.close();

}catch(IOExceptione){

e.printStackTrace();

}

}

}

}

privatebooleandownloadOver=false;

privatebooleanwasPlayed=false;

privatevoiddealWithBufferData(){

if(mPlayer==null||!

wasPlayed){

if(totalKbRead>=MIN_BUFF){

try{

startMediaPlayer();

}catch(Exceptione){

}

}

}elseif(mPlayer.getDuration()-mPlayer.getCurrentPosition()<=1000){

deleteTempFile(true);

transferBufferToMediaPlayer();

}

}

privatevoidstartMediaPlayer(){

try{

deleteTempFile(true);

BUFFTempFile=File.createTempFile(TEMP_BUFF_FILE_NAME,

FILE_POSTFIX);

FileSystemUtil.copyFile(DLTempFile,BUFFTempFile);

mPlayer=newMediaPlayer();

setListener();

mPlayer.setDataSource(BUFFTempFile.getAbsolutePath());

mPlayer.prepare();

mPlayer.start();

wasPlayed=true;

}catch(IOExceptione){

}

}

privatevoidtransferBufferToMediaPlayer(){

try{

booleanwasPlaying=mPlayer.isPlaying();

intcurPosition=mPlayer.getCurrentPosition();

mPlayer.pause();

BUFFTempFile=File.createTempFile(TEMP_BUFF_FILE_NAME,

FILE_POSTFIX);

FileSystemUtil.copyFile(DLTempFile,BUFFTempFile);

mPlayer=newMediaPlayer();

mPlayer.setDataSource(BUFFTempFile.getAbsolutePath());

mPlayer.prepare();

mPlayer.seekTo(curPosition);

booleanatEndOfFile=mPlayer.getDuration()

-mPlayer.getCurrentPosition()<=1000;

if(wasPlaying||atEndOfFile){

mPlayer.start();

}

}catch(Exceptione){

}

}

privatevoiddealWithLastData(){

Runnableupdater=newRunnable(){

publicvoidrun(){

transferBufferToMediaPlayer();

}

};

handler.post(updater);

}

publicvoidonCompletion(MediaPlayermp){

if(mHandler!

=null){

mHandler.sendEmptyMessage(Preferences.MEDIA_ENDED);

}

}

publicbooleanonError(MediaPlayermediaPlayer,intwhat,intextra){

if(mediaPlayer!

=null){

mediaPlayer.stop();

mediaPlayer.release();

}

if(mHandler!

=null){

mHandler.sendEmptyMessage(Preferences.MEDIA_ERROR);

}

returntrue;

}

publicvoidonBufferingUpdate(MediaPlayerarg0,intpercent){

Log.d(TAG,"onBufferingUpdatecalled--->percent:

"+percent);

if(mHandler!

=null){

mHandler.sendEmptyMessage(Preferences.EMDIA_BUFF_CHANGE);

}

}

privateclassPlayThreadextendsThread{

privateStringurl;

PlayThread(Stringurl){

this.url=url;

}

publicvoidrun(){

if(!

URLUtil.isNetworkUrl(url)){

mPlayer=newMediaPlayer();

setListener();

try{

//if(url.startsWith("content:

//")){

//mPlayer.setDataSource(MediaPlayService.this,Uri

//.parse(url));

//}else{

mPlayer.setDataSource(url);

//}

mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

setVolume(0f);

mPlayer.prepare();

mPlayer.start();

}catch(IllegalArgumentExceptione){

Log.e(TAG,e.toString());

}catch(IllegalStateExceptione){

Log.e(TAG,e.toString());

}catch(IOExceptione){

Log.e(TAG,e.toString());

}

}else{

playFromNet(url,0,UNKNOWN_LENGTH);

}

}

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 英语

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1