职业IT人-IT人生活圈

 找回密码
 成为会员
搜索
查看: 435|回复: 2

关于ANDROID下载与音乐播放

[复制链接]
爱车车 发表于 2011-7-19 09:37 | 显示全部楼层 |阅读模式
下载文件:
主要是打开一个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
查看图片附件

钰云 发表于 2011-7-19 09:37 | 显示全部楼层
学习学习学习学习


话说我当年 发表于 2011-7-23 11:31 | 显示全部楼层
注:偶是女滴,千真万确,毋庸置疑!
您需要登录后才可以回帖 登录 | 成为会员

本版积分规则

QQ|手机版|小黑屋|网站帮助|职业IT人-IT人生活圈 ( 粤ICP备12053935号-1 )|网站地图
本站文章版权归原发布者及原出处所有。内容为作者个人观点,并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是信息平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽造成漏登,请及时联系我们,我们将根据著作权人的要求立即更正或者删除有关内容。

GMT+8, 2024-4-30 04:24 , Processed in 0.109810 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表