如何使用默认应用程序打开文件
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
}
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");
}
这是 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 步中提供的相同。
我正在从 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
}
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");
}
这是 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 步中提供的相同。