下载文件:
主要是打开一个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 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()+"-");
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);
mp.setOnCompletionListener(this);
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub
Log.v(tag, "onCompletion");
if(goon){
resetDataSource();
}
}
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();
}
}
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的方法以外边下载边播放的方法
大小: 40.5 KB
查看图片附件
|