1.前言
近期混合應用開發需要下載和預覽的功能,選擇方案為先下載到本地,再使用cordova-plugin-file-opener2
外掛進行預覽。
採用此預覽方案檔案會被先下載到本地,cordova-plugin-file-opener2
外掛其實可以直接開啟網路地址來實現預覽,採用此方式是基於以下考慮:
-
避免重複下載
-
避免有檔案格式解析錯誤的情況,使用者可以到本地再次進行檢視
-
下載目錄可控
2.框架
專案採用 Cordova + Vue + MintUI
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
獲取,提供副檔名即可獲取(若後端提供格式則不需要)。
-
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.xml
中application
標籤內增加
<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>
複製程式碼