这里分为两部分:1、用phonegap下载文件到移动设备;2、下载到移动设备的文件在WEB端通过Phonegap打开。
首先,对于第一部分,可以通过已有的FileTransfer来实现,也可以自己写插件实现文件下载,这里我采用现成的,毕竟官方的代码写的相对比较完善;第二部分则需要自己实现打开文件的插件了,因为没有提供现成可用的。
OK!Let's Start!
html中引用的javascript代码如下:
window.appRootDirName = "download"; //定义文件下载后的存放目录 document.addEventListener("deviceready", onDeviceReady, false); function onDeviceReady() { console.log("device is ready"); window.requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem; window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, gotFS, fail); } function fail() { console.log("failed to get filesystem"); } function gotFS(fileSystem) { console.log("filesystem got"); window.fileSystem = fileSystem; fileSystem.root.getDirectory(window.appRootDirName, { create : true, exclusive : false }, dirReady, fail); } function dirReady(entry) { window.appRootDir = entry; console.log("application dir is ready"); } //下载文件 function download(path,fileName){ var fileTransfer = new FileTransfer(); var uri = encodeURI(path); var fileURL = "/mnt/sdcard/download/"+fileName; fileTransfer.onprogress = showUploadingProgress; navigator.notification.progressStart("", "当前下载进度"); fileTransfer.download( uri, fileURL, function(entry) { console.log("download complete: " + entry.fullPath); navigator.notification.progressStop(); alert("下载成功,文件位置:"+ entry.fullPath); if (!confirm("是否打开文件?")) { window.event.returnValue = false; }else{ OpenFile(entry.fullPath); } }, function(error) { console.log("download error source " + error.source); console.log("download error target " + error.target); console.log("upload error code" + error.code); navigator.notification.progressStop(); alert("下载文件错误!"); }, false, { headers: { "Authorization": "Basic dGVzdHVzZXJuYW1lOnRlc3RwYXNzd29yZA==" } } ); } // 显示上传进度 function showUploadingProgress(progressEvt) { if (progressEvt.lengthComputable) { navigator.notification.progressValue(Math .round((progressEvt.loaded / progressEvt.total) * 100)); } } //打开文件 function OpenFile(path){ // alert('OpenFile'); var openFilePlugin=cordova.require('com.gzx.open.OpenFile'); openFilePlugin.openFile("/mnt/sdcard"+path, {}, function (result) { alert(result); }, function (error) { alert("打开文件错误!"); }); }
cordova.define('com.gzx.hello.OpenFile', function(require, exports, module){ var exec = require("cordova/exec"); /** * Constructor. * */ function OpenFilePllugin() { }; OpenFilePllugin.prototype.openFile = function (fileUrl, params,successCallback, errorCallback) { alert("gafdfa"); if (errorCallback == null) { errorCallback = function (){ }; } if (typeof errorCallback != "function") { console.log("OpenFilePllugin failure: failure parameter not a function"); return; } if (typeof successCallback != "function") { console.log("OpenFilePllugin failure: success callback parameter must be a function"); return; } if (!errorCallback) successCallback = params; exec(successCallback, errorCallback, 'OpenFile', 'openFile',[fileUrl, params]); }; var openFilePllugin = new OpenFilePllugin(); module.exports = openFilePllugin; });对应的实现类OpenFile.java,如下:
package com.gzx.hello; import java.io.File; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaPlugin; import org.json.JSONArray; import org.json.JSONException; import android.content.Context; import android.content.Intent; import android.net.Uri; public class OpenFile extends CordovaPlugin { /* * (non-Javadoc) * * @see org.apache.cordova.CordovaPlugin#execute(java.lang.String, * org.json.JSONArray, org.apache.cordova.CallbackContext) */ @Override public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException { try { Context context = cordova.getActivity().getApplicationContext(); // 文件路径 String path = args.getString(0).toLowerCase(); int len = path.length(); String lastThree = path.substring(len - 3, len); String lastFour = path.substring(len - 4, len); // 判断文件类型 // doc if (lastThree.equals("doc") || lastFour.equals("docx")) { Intent i = this.getWordFileIntent(path); context.startActivity(i); } // excel else if (lastThree.equals("xls") || lastFour.equals("xlsx")) { Intent i = this.getExcelFileIntent(path); context.startActivity(i); } // ppt else if (lastThree.equals("ppt") || lastFour.equals("pptx")) { Intent i = this.getPptFileIntent(path); context.startActivity(i); } // pdf else if (lastThree.equals("pdf")) { Intent i = this.getPdfFileIntent(path); context.startActivity(i); } // 图片 else if (lastThree.equals("jpg") || lastThree.equals("png") || lastThree.equals("gif") || lastThree.equals("bmp") || lastFour.equals("jpeg")) { Intent i = this.getImageFileIntent(path); context.startActivity(i); } // 文本 else if (lastThree.equals("txt")) { Intent i = this.getTextFileIntent(path, true); context.startActivity(i); } // html else if (lastThree.equals("htm") || lastFour.equals("html")) { Intent i = this.getHtmlFileIntent(path); context.startActivity(i); } // chm else if (lastThree.equals("chm")) { Intent i = this.getChmFileIntent(path); context.startActivity(i); } // 音频 else if (lastThree.equals("mp3") || lastThree.equals("wav") || lastThree.equals("wma") || lastThree.equals("ogg") || lastThree.equals("ape") || lastThree.equals("acc")) { Intent i = this.getAudioFileIntent(path); context.startActivity(i); } // 视频 else if (lastThree.equals("avi") || lastThree.equals("mov") || lastThree.equals("asf") || lastThree.equals("wmv") || lastThree.equals("navi") || lastThree.equals("3gp") || lastThree.equals("ram") || lastThree.equals("mkv") || lastThree.equals("flv") || lastThree.equals("mp4") || lastFour.equals("rmvb") || lastThree.equals("mpg")) { Intent i = this.getVideoFileIntent(path); context.startActivity(i); } else { callbackContext.success("无法打开该文件!"); } // Intent i = getExcelFileIntent(path); // context.startActivity(i); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } return true; } // android获取一个用于打开Excel文件的intent public static Intent getExcelFileIntent(String param) { Intent intent = new Intent("android.intent.action.VIEW"); intent.addCategory("android.intent.category.DEFAULT"); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); Uri uri = Uri.fromFile(new File(param)); intent.setDataAndType(uri, "application/vnd.ms-excel"); return intent; } // android获取一个用于打开HTML文件的intent public static Intent getHtmlFileIntent(String param) { Uri uri = Uri.parse(param).buildUpon() .encodedAuthority("com.android.htmlfileprovider") .scheme("content").encodedPath(param).build(); Intent intent = new Intent("android.intent.action.VIEW"); intent.setDataAndType(uri, "text/html"); return intent; } // android获取一个用于打开图片文件的intent public static Intent getImageFileIntent(String param) { Intent intent = new Intent("android.intent.action.VIEW"); intent.addCategory("android.intent.category.DEFAULT"); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); Uri uri = Uri.fromFile(new File(param)); intent.setDataAndType(uri, "image/*"); return intent; } // android获取一个用于打开PDF文件的intent public static Intent getPdfFileIntent(String param) { Intent intent = new Intent("android.intent.action.VIEW"); intent.addCategory("android.intent.category.DEFAULT"); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); Uri uri = Uri.fromFile(new File(param)); intent.setDataAndType(uri, "application/pdf"); return intent; } // android获取一个用于打开文本文件的intent public static Intent getTextFileIntent(String param, boolean paramBoolean) { Intent intent = new Intent("android.intent.action.VIEW"); intent.addCategory("android.intent.category.DEFAULT"); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); if (paramBoolean) { Uri uri1 = Uri.parse(param); intent.setDataAndType(uri1, "text/plain"); } else { Uri uri2 = Uri.fromFile(new File(param)); intent.setDataAndType(uri2, "text/plain"); } return intent; } // android获取一个用于打开音频文件的intent public static Intent getAudioFileIntent(String param) { Intent intent = new Intent("android.intent.action.VIEW"); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); intent.putExtra("oneshot", 0); intent.putExtra("configchange", 0); Uri uri = Uri.fromFile(new File(param)); intent.setDataAndType(uri, "audio/*"); return intent; } // android获取一个用于打开视频文件的intent public static Intent getVideoFileIntent(String param) { Intent intent = new Intent("android.intent.action.VIEW"); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); intent.putExtra("oneshot", 0); intent.putExtra("configchange", 0); Uri uri = Uri.fromFile(new File(param)); intent.setDataAndType(uri, "video/*"); return intent; } // android获取一个用于打开CHM文件的intent public static Intent getChmFileIntent(String param) { Intent intent = new Intent("android.intent.action.VIEW"); intent.addCategory("android.intent.category.DEFAULT"); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); Uri uri = Uri.fromFile(new File(param)); intent.setDataAndType(uri, "application/x-chm"); return intent; } // android获取一个用于打开Word文件的intent public static Intent getWordFileIntent(String param) { Intent intent = new Intent("android.intent.action.VIEW"); intent.addCategory("android.intent.category.DEFAULT"); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); Uri uri = Uri.fromFile(new File(param)); intent.setDataAndType(uri, "application/msword"); return intent; } // android获取一个用于打开PPT文件的intent public static Intent getPptFileIntent(String param) { Intent intent = new Intent("android.intent.action.VIEW"); intent.addCategory("android.intent.category.DEFAULT"); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); Uri uri = Uri.fromFile(new File(param)); intent.setDataAndType(uri, "application/vnd.ms-powerpoint"); return intent; } }