【原创】转载请注明出处! javascript
在开发web app而且使用phonegap的状况下,附件下载着实是一件使人头疼的事,什么window.open或者window.location.href在webview中都不起做用,网上查了许久,没有一篇完整讲述“phonegap附件下载及打开附件”的例子,如今分享一下。 html
首先,若是你能够接受的话,能够使用一种极其简单的方式来完成,点击操做以后,跳入手机默认浏览器进行下载,代码以下 navigator.app.loadUrl(encodeURI(url), { openExternal:true}); 注意,参数必定要加{ openExternal:true}参数,这个参数表明在另外的浏览器打开。 若是你不知足于这种方式,能够使用如下方法: phonegap附件下载,使用的方法是phonegap自带的下载附件的方式,而打开附件用到的是phonegap插件,最终由安卓原生代码来完成,很少说,代码以下: 1. html文件(cordova.js是phonegap的库文件) <html> <head> <meta charset="UTF-8"> <title>phonegap文件下载</title> <script type="text/javascript" src="cordova.js"></script> <script type="text/javascript"> window.appRootDirName = "download_test"; document.addEventListener("deviceready", onDeviceReady, false); function onDeviceReady() { console.log("device is ready"); 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"); } downloadFile = function(){ alert("start"); var fileTransfer = new FileTransfer(); var uri = encodeURI("http://12.130.30.22:8080/uploadImagetest.xls"); var filePath = window.appRootDir.fullPath + "/test.xls"; alert(window.appRootDir.fullPath); fileTransfer.download( uri, filePath, function(entry) { alert("success"); alert(entry.fullPath); //此处调用打开文件方法 OpenFile(entry.fullPath); //window.location.href = window.appRootDir.fullPath; console.log("download complete: " + entry.fullPath); }, function(error) { alert("error"); alert(JSON.stringify(error)); console.log("download error source " + error.source); console.log("download error target " + error.target); console.log("upload error code" + error.code); } ); } function OpenFile(path){ try { alert('OpenFile'); var array = []; array[0] = path; alert(array[0]); cordova.exec(function(message) { }, null, 'OpenFilePlugin', 'haha', array); } catch(e) { alert(e.message); } } </script> </head> <body> <a href="#" onclick="downloadFile()">Download File</a> </body> </html> 2. java文件 import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import org.apache.cordova.api.CallbackContext; import org.apache.cordova.api.CordovaPlugin; import org.apache.cordova.api.PluginResult; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Environment; import android.util.Log; public class OpenFilePlugin extends CordovaPlugin { @Override public boolean execute(String action, JSONArray args, CallbackContext callbackContext) { 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, false); 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; } } 3. config.xml <plugins> <plugin name="OpenFilePlugin" value="yourPackage.OpenFilePlugin"/> </plugins> 大功告成!