- 版本:1.3.0
- GitHub: https://github.com/pierreamgabriel/nativescript-android-fs
- NPM: https://npmjs.net.cn/package/nativescript-android-fs
- 下载
- 昨天: 2
- 上周: 8
- 上个月: 22
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.
}