如何使用默认应用程序打开文件

How do I open a file with the default application

我正在从 DropBox 下载文件。

我可以通过使用 File.exists(filePath) 和 returns 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
}

A​​FAIK 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");
}

这是 iOS 的另一种可能解决方案,使用 utils.ios.openFile:

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);

文件打开后,您会看到一个带有默认应用程序的共享按钮。

因为 Android API 24+, Android 会抛出这个错误: android.os.FileUriExposedException: file:///storage/emulated/0/test.txt exposed beyond app through Intent.getData()

要克服此错误,您需要对 Android 清单文件进行一些更改并将另一个文件添加到 App_Resources。以下是步骤:

1) 在 App_Resoures/Android 下创建一个名为 xml 的文件夹。在其中创建一个名为 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 清单中的 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:authorities 应与您在第 2 步中提供的相同。