phonegap下载文件并打开

这里分为两部分: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;

	}

}

对于,配置文件等操作,请参照之前的博文。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值