admin管理员组

文章数量:1122847

如何下载apk文件?这里介绍两种方式:一通过异步任务读取文件,二利用系统方法DownloadManager进行下载。

通过异步任务下载apk 文件

public String downloadAsApk(String fileName) {
        String filePath = FileUtil.getAvailableCacheDir() + "/gameApk/" + fileName + ".apk";
        BufferedInputStream bis = null;
        FileOutputStream fos = null;
        try {
            bis = new BufferedInputStream(urlcon.getInputStream());
            int fileLength = urlcon.getContentLength();
            File file = new File(filePath);
            if (file.exists()) {
                return filePath;
            } else {
                if (!file.getParentFile().exists()) {
                    file.getParentFile().mkdirs();
                }
                file.createNewFile();
            }
            fos = new FileOutputStream(file);
            byte data[] = new byte[4 * 1024];
            int count = 0;
            long total = 0;
            while ((count = bis.read(data)) != -1) {
                total+=count;
                if (fileLength > 0)
                    publishProgress((int) (total * 100 / fileLength));  //传递进度(注意顺序)
                fos.write(data, 0, count);
                fos.flush();
            }
            fos.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (bis != null) {
                try {
                    bis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        return filePath;
    }

如何调用呢?这里我使用了rxjava的方式。

  Observable.create(new Observable.OnSubscribe<String>() {
      @Override
      public void call(Subscriber<? super String> subscriber) {
          FileDownload fileDownload = new FileDownload(gameBean.getGameDownPath());
          String filePath = fileDownload.downloadAsApk(fileName);
          subscriber.onNext(filePath);
      }
      }).subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Subscriber<String>() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(String filePath) {
                Log.d("lixx", "filePath = " + filePath);
                Toast.makeText(getActivity(), "下载完成", Toast.LENGTH_SHORT).show();
                install(filePath);
            }
    });

如果需要显示下载进度的dialog请自行设计和显示哦。

利用系统方法DownloadManager进行下载

从Android 2.3(API level 9)开始Android用系统服务(Service)的方式提供了Download Manager来优化处理长时间的下载操作。Download Manager处理HTTP连接并监控连接中的状态变化以及系统重启来确保每一个下载任务顺利完成。
在大多数涉及到下载的情况中使用Download Manager都是不错的选择,特别是当用户切换不同的应用以后下载需要在后台继续进行,以及当下载任务顺利完成非常重要的情况(DownloadManager对于断点续传功能支持很好)。

分享一篇写的不错的文章哦。
Android中使用DownloadManager类来管理数据下载的教程

private void downloadApk(String downUrl, String fileName, String filePath) {
        //取得系统的下载服务
        DownloadManager downloadManager = (DownloadManager) getActivity()
                .getSystemService(Context.DOWNLOAD_SERVICE);
        //创建下载请求对象
        DownloadManager.Request request = new DownloadManager.Request(Uri.parse(downUrl));
        request.setTitle(fileName);
        request.setDescription("正在下载...");
        request.setMimeType("application/vnd.android.package-archive");
        request.allowScanningByMediaScanner();// 设置可以被扫描到;在默认的情况下,通过Download
        // Manager下载的文件是不能被Media Scanner扫描到的
        request.setVisibleInDownloadsUi(true);// 设置下载可见
        request.setAllowedOverRoaming(false);//可以用来阻止手机在漫游状态下下载
        request.setDestinationUri(Uri.fromFile(new File(filePath)));
        request.setNotificationVisibility(DownloadManager.Request.NETWORK_MOBILE
                | DownloadManager.Request.NETWORK_WIFI);
        request.setNotificationVisibility(DownloadManager.Request
                .VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
        downloadManager.enqueue(request);
    }

是不是很简单,以后再也不用写异步任务喽。

监听DownloadManager的下载完成事件

新建广播接收类:

  class DownLoadBroadcastReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            downloadSub.onCompleted();
        }
    }

注册广播监听:

 mDownloadReceiver = new DownLoadBroadcastReceiver();
        IntentFilter intentFilter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
        getActivity().registerReceiver(mDownloadReceiver, intentFilter);

别忘在onDestroy() 中关掉广播监听哦。

安装apk

 private void install(String filePath) {
        File file = new File(filePath);
        if (file != null) {
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
            getActivity().startActivity(intent);
        }
    }

注意:最后的最后要强调一点,注意设置权限!!!!!

本文标签: 并在进度文件通知Android