android 分段下载.docx
《android 分段下载.docx》由会员分享,可在线阅读,更多相关《android 分段下载.docx(10页珍藏版)》请在冰豆网上搜索。
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);
}
}
}
}