Cordova插件实现文件下载对话框

目录结构

这里实现一个下载文件然后显示一个带进度条的对话框的demo,用来下载一个apk并安装
首先建立一个cordova插件的目录结构:

- Downloader
    - plugin.xml
    - src
        - android
            - Downloader.java

    - www
        - Downloader.js

plugin.xml

<plugin id="com.keytask.updater.cordova" version="0.0.1"
    xmlns="http://apache.org/cordova/ns/plugins/1.0"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <name>Downloader</name>
    <description>更新应用</description>
    <js-module name="Downloader" src="www/Downloader.js">
        <clobbers target="cordova.plugins.Downloader"/>
    </js-module>
    <platform name="android">
        <config-file parent="/*" target="res/xml/config.xml">
            <feature name="Downloader">
                <param name="android-package" value="com.example.downloader.cordova.Downloader"/>
            </feature>
        </config-file>
        <source-file src="src/android/Downloader.java" target-dir="src/com/example/downloader/cordova"/>
    </platform>
</plugin>

Downloader.js

var exec = require('cordova/exec');

exports.downloadWithUrl = function(url,success, error) {
  exec(success, error, "Downloader", "doDownload", [{url:url}]);
  //这里传入一个json,里面是数组,装着要下载的apk地址
};

Downloader.java

public class Downloader extends CordovaPlugin {

    File rootDir = Environment.getExternalStorageDirectory();

    //以下载apk为例
    String fileName="example.apk";

    ProgressDialog mProgressDialog;


    Activity activity;



    public boolean execute(String action, JSONArray args, final CallbackContext callbackContext)
            throws JSONException {
        activity = this.cordova.getActivity();
        if (action.equals("doDownload")) {


            String url = args.getJSONObject(0).getString("url");//在主程序中传进的是一个json,里面有apk的下载地址



        //创建一个进度条对话框
            mProgressDialog = new ProgressDialog(activity);
            mProgressDialog.setMessage("Downloading file...");
            mProgressDialog.setIndeterminate(false);
            mProgressDialog.setMax(100);
            mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            mProgressDialog.setCancelable(false);//默认不可取消
            mProgressDialog.show();

        //后台下载apk
            new AsyncTask<String, String, Boolean>(){


                @Override
                protected void onPreExecute() {
                    super.onPreExecute();



                }

                @Override
                protected Boolean doInBackground(String... aurl) {
                    try {
                        //连接地址
                        URL u = new URL(aurl[0]);


                        HttpURLConnection c = (HttpURLConnection) u.openConnection();
                        c.setRequestMethod("GET");
                        c.setDoOutput(true);
                        c.connect();

                        //计算文件长度
                        int lenghtOfFile = c.getContentLength();


                        File destDir = new File(rootDir + "/example/");
                          if (!destDir.exists()) {
                           destDir.mkdirs();
                          }

                        FileOutputStream f = new FileOutputStream(new File(destDir, fileName));

                        InputStream in = c.getInputStream();

                        //下载的代码
                        byte[] buffer = new byte[1024];
                        int len1 = 0;
                        long total = 0;

                        while ((len1 = in.read(buffer)) > 0) {
                            total += len1; //total = total + len1
                            publishProgress("" + (int)((total*100)/lenghtOfFile));
                            f.write(buffer, 0, len1);
                        }
                        f.close();

            //打开这个apk
                        Intent intent = new Intent(Intent.ACTION_VIEW);
                        intent.setDataAndType(Uri.fromFile(new File(destDir, fileName)), "application/vnd.android.package-archive");
                        activity.startActivity(intent);

                    } catch (Exception e) {
                        e.printStackTrace();
                        return false;
                    }

                    return true;
                }

                protected void onProgressUpdate(String... progress) {
                    mProgressDialog.setProgress(Integer.parseInt(progress[0]));
                }

                @Override
                protected void onPostExecute(Boolean isSuccess) {
                    //dismiss the dialog after the file was downloaded

                    mProgressDialog.dismiss();

                    if (isSuccess){
                        callbackContext.success("成功");
                    }else {
                        callbackContext.error("失败");
                    }
                }

            }.execute(url);



            return true;
        }


        return false;
    }





}

主程序的调用插件

   var testUrl = "http://dl.app.snail.com/snail/panda/20150928/product_officialnew(1.1.10)09-22Ad220.apk";

var downloader = cordova.require('com.example.downloader.cordova.Downloader');
downloader.downloadWithUrl(testUrl, function (success) {
          //下载成功执行
        }, function (error) {
          //下载失败执行
        });

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值