phonegap附件下载及打开附件

眉间皱痕 提交于 2019-11-29 09:20:41

   【原创】转载请注明出处!    

   在开发web app并且使用phonegap的情况下,附件下载着实是一件令人头疼的事,什么window.open或者window.location.href在webview中都不起作用,网上查了许久,没有一篇完整讲述“phonegap附件下载及打开附件”的例子,现在分享一下。

    首先,如果你可以接受的话,可以使用一种极其简单的方式来完成,点击操作之后,跳入手机默认浏览器进行下载,代码如下
    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>


大功告成!
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!