我正在从DropBox下载文件。
我可以使用File.exists(filePath)
看到该文件存在,并返回true
。
但我无法使用File.fromPath(filePath)
或openUrl(filePath)
打开文件(使用默认应用程序)。
这是我的代码:
HomePage.prototype.getDownload = function() {
var filePath = fs.path.join(fs.knownFolders.currentApp().path, "MyFile");
httpModule.getFile({
url: "https://content.dropboxapi.com/2/files/download",
method: "POST",
headers: { "Content-Type": "", "Dropbox-API-Arg": JSON.stringify({"path": "/MyFolder/MyFile"}), "Authorization": "Bearer *********" },
}, filePath).then(function (response) {
console.log("file exists: "+fs.File.exists(filePath)); // This return true
// tried this
fs.File.fromPath(filePath); // Does nothing
// tried this
utilsutils.openUrl(filePath); // Does nothing
}
答案 0 :(得分:5)
AFAIK openUrl
仅适用于网络链接,不能用于打开本地文件。并且fs.File.fromPath(filePath);
只创建File的实例,并且不对其执行任何操作
要打开文件,您需要使用每个平台可用的本机API。例如对于android(假设您的文件是PDF):
try
{
var intent = new android.content.Intent(android.content.Intent.ACTION_VIEW);
intent.setDataAndType(android.net.Uri.fromFile(new java.io.File(filePath)), "application/pdf");
application.android.currentContext.startActivity(android.content.Intent.createChooser(intent, "Open PDF..."));
}
catch (e)
{
console.log("Missing PDF application");
}
答案 1 :(得分:2)
自Android API 24+起,Android会抛出此错误:android.os.FileUriExposedException: file:///storage/emulated/0/test.txt exposed beyond app through Intent.getData()
要克服此错误,您需要对Android清单文件进行一些更改,并将另一个文件添加到App_Resources。以下是步骤:
1)在xml
下创建名为App_Resoures/Android
的文件夹。在其中创建名为provider_paths.xml
的文件。将其粘贴到该文件中:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="external_files" path="."/>
</paths>
2)使用此代码打开文件:
try {
let intent = new android.content.Intent(android.content.Intent.ACTION_VIEW);
let mimeType = this.findExtension(file.extension); // The file here is the nativescript file object (fs.File)
let context = application.android.currentContext;
let nativeFile = new java.io.File(file.path);
let uri = android.support.v4.content.FileProvider.getUriForFile(context, 'com.your.appname.provider', nativeFile); // Here add ".provider" after your app package name
intent.setDataAndType(uri, mimeType);
intent.addFlags(android.content.Intent.FLAG_GRANT_READ_URI_PERMISSION);
application.android.currentContext.startActivity(android.content.Intent.createChooser(intent, 'Open File...'));
} catch (e) {
console.log(e);
}
3)前两步应该足够了。测试它是否正常工作。如果不能正常工作,请将其放入Android Manifest中的application
标记:
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.your.appname.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
请注意,android:authority应与您在步骤2中提供的相同。
答案 2 :(得分:1)
以下是使用utils.ios.openFile
的另一种可能的iOS解决方案:
import * as utils from 'utils/utils';
import * as fs from 'file-system';
...
let fileName = '/test.pdf';
let documents = fs.knownFolders.currentApp();
let file = this.documents.getFile(this.fileName);
let open = utils.ios.openFile(this.documents.path + this.fileName);
文件打开后,您有一个包含默认应用程序的“共享”按钮。