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

时间:2016-04-07 07:38:31

标签: nativescript

我正在从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
}

3 个答案:

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

文件打开后,您有一个包含默认应用程序的“共享”按钮。