目录结构
这里实现一个下载文件然后显示一个带进度条的对话框的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) {
//下载失败执行
});