Cordova+Vue 混合開發實現下載並預覽

1.前言

近期混合應用開發須要下載和預覽的功能,選擇方案爲先下載到本地,再使用cordova-plugin-file-opener2插件進行預覽。javascript

採用此預覽方案文件會被先下載到本地,cordova-plugin-file-opener2插件其實能夠直接打開網絡地址來實現預覽,採用此方式是基於如下考慮:java

  1. 避免重複下載android

  2. 避免有文件格式解析錯誤的狀況,用戶能夠到本地再次進行查看ios

  3. 下載目錄可控git

2.框架

項目採用 Cordova + Vue + MintUIgithub

3.操做

  • 下載
    • fileInfo提供下載地址、文件名稱、文件格式(或擴展名)
function downLoad(fileInfo) {
    Vue.$toast('正在下載,請稍等');
    new FileTransfer().download(
        encodeURI(FILES_HOST + "/" + fileInfo.fileid), //uri網絡下載路徑
        cordova.file.dataDirectory + fileInfo.fileid, //文件本地存儲路徑
        function (fileEntry) {
            preView(fileEntry, fileInfo);
        },
        function (error) {
            Vue.$toast('下載失敗');
            console.log(error);
        },
        false,
        {
            headers: {'Authorization': `Bearer ${localStorage.getItem('CFA0')}`},
        }
    );
}
複製代碼
  • 下載完成,預覽文件後端

    • 使用 cordova-plugin-file-opener2 打開文件網絡

    • mineType使用 mime-types獲取,提供擴展名便可獲取(若後端提供格式則不須要)。app

function preView(fileEntry, fileInfo) {
    Vue.$toast('開始預覽');
    let url;
    let platform = device.platform.toLowerCase();
    if (platform === 'android') {
        url = fileEntry.toInternalURL() //安卓預覽路徑
    } else {
        url = fileEntry.toURL() //ios 預覽路徑
    }
    console.log('路徑', url);
    cordova.plugins.fileOpener2.showOpenWithDialog(
        url,
        mime.lookup(fileInfo.fileType),
        {
            error: function (e) {
                Vue.$toast('預覽失敗');
            },
            success: function () {
                Vue.$toast('預覽成功');
            }
        },
    );
}
複製代碼

4. 可能遇到的坑

在預覽文件的時候 cordova-plugin-file-opener2有可能會報如下錯誤:框架

Attempt to invoke virtual method 'android.content.res.XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)' on a null object reference

尋找好久,應該是由於權限問題致使,解決辦法以下:

AndroidManifest.xmlapplication標籤內增長

<provider android:name="io.github.pwlin.cordova.plugins.fileopener2.FileProvider" android:authorities="${applicationId}.opener.provider" android:exported="false" android:grantUriPermissions="true">
<meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/opener_paths" />
</provider>
複製代碼
相關文章
相關標籤/搜索