NativeScript Android 文件系统
此插件允许 Android 应用与外部/共享存储中的文件和文件夹一起工作,并且使用非常简单。它适用于所有 Android 版本,包括 11+。
npm i --save nativescript-android-fs

NativeScript Android 文件系统

此插件允许 Android 应用与外部/共享存储中的文件和文件夹一起工作,并且使用非常简单。它适用于所有 Android 版本,包括 11+。

功能

  • 保存到外部存储
  • 将文件导入到应用内部存储的文件中
  • 检查文件是否存在
  • 创建文本文件
  • 读取文本文件
  • 删除文件
  • 列出目录和文件
  • 检查修改文件的权限(Android 11)

安装

tns plugin add nativescript-android-fs

使用方法

let storage = require("nativescript-android-fs");

第一步

此插件通过在内部和外部存储之间复制文件来工作。您想保存到外部存储中文件夹内的所有文件都必须来自您的 /data/user/0/com.package.name/files。例如,如果您想将 "my-image.jpg" 转移到 /Pictures,该文件必须位于您的应用内部存储,位于 /data/user/0/com.package.name/files。您可以使用此方法获取应用文件目录的绝对路径:application.android.context.getFilesDir(),但您可以使用任何您想要的方法,只要它返回应用内部存储中文件文件夹的正确路径。当您将文件导入到应用中时,它们也会保存在该文件夹中。

Android 11

随着 Android 11 的推出,应用不需要请求权限即可使用公共文件夹,如文档、下载、图片、音乐等,但您的应用只能读取和修改它创建的文件。例如,如果有人安装了您的应用并在 /Documents/backup 中保存了备份,然后卸载了应用,当他再次安装时,该备份文件将无法再由应用使用。因此,请让您的用户了解这一重要细节。

此外,除了文档和下载外,只有适当的文件格式才能保存到图片(图像)、音乐(音频)、电影(视频)和其他公共文件夹中。

Android 10 及以下版本

在 Android 10 设备上,您可以通过向您的 AndroidManifest.xml 添加以下内容来禁用范围存储

<application android:requestLegacyExternalStorage="true">

对于 10 以下的所有其他版本,您还需要添加以下行

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="29"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="29"/>

当然,您需要在您的应用代码中请求用户权限。您可以使用 nativescript-permissions 插件来完成此任务。

参数列表

在介绍您可以在本插件中使用的功能之前,让我们先了解一下它们的参数。

folder

您想要保存文件的目录(带或不带子目录)。如果目录或子目录不存在,它将自动创建。在 Android 11 中,只能在根目录中创建公共目录。例如,如果您针对下载目录但该目录不存在,插件将创建它。

重要提示:不要将下载与下载混淆,因为它们不是同一个东西。在 Android 11 中,后者不会创建。

示例

"/Documents"
"/Documents/myfolder"
"/Pictures"

始终以斜杠 "/" 开头字符串,但不要在末尾包含斜杠。如果传递空字符串 "",则在 Android 10 和以下版本中,文件将保存在根目录中。在 Android 11 中,应用无法使用根目录。

fileName

当保存到外部存储时,它是位于 /data/user/0/com.package.name/files 的文件名。当导入到您应用程序的文件夹时,它是位于外部存储中的文件名。

示例

"myfile.txt"
"myimage.jpg"

文本

您希望使用 storage.create 函数创建的文件中写入的文本字符串。

类型

此参数仅在您希望使用 storage.content 函数检索文件或目录列表时使用。因此,您应指定您想要的是“文件”还是“目录”。

函数

storage.save

它将从 /data/user/0/com.package.name/files 复制文件到外部存储。

storage.save(folder, fileName);

示例

let file = storage.save("/Documents", "my-file.doc");

if (file) {

// File copied to external storage

}

如果目标文件夹中已存在同名文件,则在 Android 10 及以下版本中将被覆盖,但在 Android 11 中,如果您的应用程序不拥有该文件,则函数将失败。

storage.import

它将从外部存储复制文件到 /data/user/0/com.package.name/files

storage.import(folder, fileName);

示例

let file = storage.import("/Pictures", "my-picture.jpg");

if (file) {

// File successfully imported

}

在 Android 11 中,如果您的应用程序不拥有该文件,则不会导入任何文件。

storage.check

它检查文件是否存在。它将检查所有文件,包括不属于您的应用程序的文件。它非常有用,可以避免文件名冲突,因为在 Android 11 中,应用程序无法覆盖它未创建的文件。

storage.check(folder, fileName);

示例

let file = storage.check("/Download", "my-file.txt");

if (file) {

// File exists

}

storage.create

它创建一个文本文件。

storage.create(folder, fileName, text);

示例

let file = storage.create("/Documents", "new-file.txt", "Hey, this is my file!");

if (file) {

// File created

}

storage.read

它返回包含文本文件内容的字符串。

storage.read(folder, fileName);

示例

let text = storage.read("/Documents", "my-file.txt");

storage.content

它返回包含文件或目录列表的数组。在 Android 11 中,您只能检索由您的应用程序创建的文件。

storage.content(type, folder);

示例

let files = storage.content("file", "/Documents");
let directories = storage.content("directory", "/DCIM");

storage.delete

它在 Android 10 及以下版本中删除任何文件,并且在 Android 11 中只删除由您的应用程序创建的文件。

storage.delete(folder, fileName);

示例

let file = storage.delete("/Documents", "my-file.doc");

if (file) {

// File deleted

}

storage.permission(适用于 Android 11 及以上版本)

在您的应用程序可以在 Android 11 中对文件执行任何操作之前,它首先需要知道它是否有权限。例如,应用程序不能在没有成为文件所有者的前提下读取、替换或重命名文件。

storage.permission(folder, fileName); 

示例

let file = storage.permission("/Documents", "my-file.doc");

if (file) {

// Yes, I can work with that file.
}