近期混合應用開發須要下載和預覽的功能,選擇方案爲先下載到本地,再使用cordova-plugin-file-opener2
插件進行預覽。javascript
採用此預覽方案文件會被先下載到本地,cordova-plugin-file-opener2
插件其實能夠直接打開網絡地址來實現預覽,採用此方式是基於如下考慮:java
避免重複下載android
避免有文件格式解析錯誤的狀況,用戶能夠到本地再次進行查看ios
下載目錄可控git
項目採用 Cordova + Vue + MintUI
github
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('預覽成功');
}
},
);
}
複製代碼
在預覽文件的時候 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>
複製代碼