这里分为两部分: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("打开文件错误!");
});
}
下面是,需要引入的打开文件的js,openFile.js
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;
}
}
对于,配置文件等操作,请参照之前的博文。