下载文件:
主要是打开一个URL的INPUTSTREAM,还有一个本地文件OUTPUTSTREAM,然后就读一段写进去一段.是另外启了个线程进行的
主要代码如下:
URL url=null; URLConnection conn=null; InputStream is=null; OutputStream os=null; try { url=new URL(getUrl()); conn=url.openConnection(); file_size=conn.getContentLength()+""; cur_size="0"; updateRecord(); is=conn.getInputStream(); os=new FileOutputStream(save_path+save_name); byte[] buffer=new byte[4096]; int ct=is.read(buffer); int iCur=Integer.parseInt(cur_size); while(ct>-1 && "1".equals(state)){ Log.v("downloadFilePo", "download "+ct+" bytes"); os.write(buffer, 0, ct); iCur+=ct; cur_size=iCur+""; ct=is.read(buffer); } is.close(); os.close();
另外还有断点下载,主要实现原理就是记录下上次下载到哪个字节,然后打开URL的输入流时
conn.setRequestProperty("User-Agent", "NetFox"); conn.setRequestProperty("RANGE", "bytes="+getCur_size()+"-");表示从getCur_size()个字符开始发送数据.
即可.
顺便做了个页面来管理所有下载的内容,

这里使用的是listview,每一个格子是个自定义的VIEW.
更新UI的时候有个问题,就是只能在UI主线程中更新,所以在自定义的VIEW中定义了一个handler,新启动一个线程轮询,然后handler.sendMessage();
音乐播放:
播放本地文件的话没有问题,直接set好path后 prepare(),再start().
对于网上的音乐的话,边播放边下载时有点问题.我想到的方法是另起个线程下载音乐文件,一开始先缓冲一段数据,开始播放.
实现MediaPlayer的OnCompletion方法,表示在音乐播放完成后做出动作,因为是边播放边下载,所以第一次所加载的很快就会播放完,
mp.setOnCompletionListener(this);
public void onCompletion(MediaPlayer mp) { // TODO Auto-generated method stub Log.v(tag, "onCompletion"); if(goon){ resetDataSource(); } }
public void resetDataSource() { try { int cur=mp.getCurrentPosition(); mp.reset(); mp.setDataSource(path); mp.prepare(); mp.seekTo(cur); mp.start(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalStateException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
这种方法的话由于prepare()耗费资源过大,播放会卡一下.
不知道哪位知道除了直接给Mediaplayer设置网络url的方法以外边下载边播放的方法
1 楼 kkvsyy 2011-06-02
学习学习学习学习