5
回答
做下载程序 下载完成后APK文件自动安装 偶尔提示解析包错误
终于搞明白,存储TCO原来是这样算的>>>   

我在做一个下载程序

有时下载APK文件完成,程序自动安装,偶尔会出现解析包错误

我验证过的:

服务器上的APK没有问题,能成功安装

并且下载得到的文件与服务器上的文件比对大小一样

我记得我通过机锋市场下载也应用偶尔也会出现这样的问题,搞不懂求大牛解决下,

 下面是我写的下载文件的函数 大家帮帮看看你有没错

 /**
     * 下载文件
     * 
     * @param url
     * @param path
     *            只需要指定目录
     * @throws IOException
     */
    public void down_file(String url, String path) throws IOException {
        
        filename = url.substring(url.lastIndexOf("/") + 1);
        int fileSize;
        int downloadFileSize;
        // 获取文件名
        URL myURL = new URL(url);
       
        URLConnection conn = myURL.openConnection();
        conn.setConnectTimeout(timeout);
       
        conn.connect();        
        InputStream is = conn.getInputStream();
        fileSize = conn.getContentLength();// 根据响应获取文件大小
        if (fileSize <= 0)
            throw new RuntimeException("无法获知文件大小 ");
        if (is == null)
            throw new RuntimeException("stream is null");
        FileUtils fileUtil = new FileUtils();
        fileUtil.isCreateFileDir(path);
        // 系统目录+自定义目录+文件
        FileOutputStream fos = new FileOutputStream(fileUtil.PATH + path + filename);
        // 把数据存入路径+文件名
        byte buf[] = new byte[1024];
        downloadFileSize = 0;// /当前下载大小
        int downloadPercentage = 0;// 百分比
        // 开始下载
        sendMsg(Constants.DOWNLOAD_BEGIN, downloadPercentage);

        do {
            // 循环读取
            int numread = is.read(buf);
            if (numread == -1 || cancelDownload) {// 如果下载完成或取消下载就跳出
                break;
            }
            fos.write(buf, 0, numread);
            downloadFileSize += numread;
            int tempPercentage = downloadFileSize * 100 / fileSize;
            // 避免通知栏吃紧 每增加1个百分点刷新一次
            if (tempPercentage - 1 >= downloadPercentage) {
                Log.i(TAG, " tempPercentage" + tempPercentage);
                downloadPercentage = tempPercentage;
                sendMsg(Constants.DOWNLOAD_UPDATE, downloadPercentage);// 更新进度
            }
        } while (true);
        if (cancelDownload) {// 判断是否取消了下载
            Log.i(TAG, "取消下载");
            is.close();
        } else {
            downloadPercentage = 100;
            sendMsg(Constants.DOWNLOAD_SUCCEED, downloadPercentage);// 通知下载完成
        }
        try {
            is.close();
        } catch (Exception ex) {
            Log.e(TAG, "error: " + ex.getMessage(), ex);
        }

    }

 

 

举报
补全
发帖于5年前 5回/4K+阅
共有5个答案 最后回答: 5年前

引用来自“hanzhankang”的答案

你为什么用do循环?下载应该不难吧,也可以用Java提供的RandomAccessFile机制,挺方便的。。。

用do循环 不行吗.? 

引用来自“hanzhankang”的答案

可以呀。。。不过没有while()循环方便吧。它们是有区别的。

 

我用do循环 功能是实现了, 但是偶尔下载完APK文件后,安装APK会出现解析包错误,

hanzhankang有遇到过这样的吗

--- 共有 1 条评论 ---
hanzhankang我下载完后调用系统的方法,让用户安装。。。。不是自动安装。。不过没有出现问题。。。只要能安就说明已经下载完全。 5年前 回复

FileOutputStream是写入档案用的类别,其建构式有四个:
Public FileOutputStream(String strFilename) throws FileNotFoundException
Public FileOutputStream(File fOut) throws FileNotFound Exception
Public FileOutputStream(FileDescriptor fdObj)
public FileOutputStream(String name, boolean append) throws FileNotFoundException
第四个和第一个的差别只在於当档案存在时,第一个会将原来的档案内容覆盖,第四个则可以选择覆盖或将新内容接在原内容後面。范例2以建构式一讲解如何写入一个档案…在这个范例中要注意的是,fIn每个读10个bytes,但是最後一次不一定会读10个bytes,因此,fOut在write时,要指明要写几个bytes到档案中,否则最後一次仍会写入10个bytes,因Java在new byte时会先将内容先填0,所以後面的几个bytes会是0。

是否会出现这样的的问题  但我大多数时间都能下载完成.

顶部