简体   繁体   English

Nativescript:如何将文件保存在外部存储(SD 卡)中

[英]Nativescript: How to save a file in external storage (SD card)

After a lot of googling, and a lot of tries with "out-of-context" code, I'm begging you to help me.经过大量的谷歌搜索和“上下文外”代码的大量尝试后,我恳求您帮助我。

I'm trying to figure out if it's possible to write on the external storage with Nativescript.我试图弄清楚是否可以使用 Nativescript 在外部存储上写入。 I'm not interested to write within the application context.我没有兴趣在应用程序上下文中编写。 So what the docs shows, it's not what i'm looking for.所以文档显示的内容不是我要找的。

I've managed to achieve this from a thread on the Nativescript forum:我设法从 Nativescript 论坛上的一个线程中实现了这一点:

android.os.Environment.getExternalStoragePublicDirectory(android.os.Environment.DIRECTORY_DOWNLOADS).toString();

It works, it gives me a path, but when I have this path I have no clue of what to do with it.它有效,它为我提供了一条路径,但是当我拥有这条路径时,我不知道如何处理它。 How to create a file inside that path, read it etc.如何在该路径内创建文件,读取它等。

What I need to achieve is to create a folder that both the user and the application can easily access.我需要实现的是创建一个用户和应用程序都可以轻松访问的文件夹。 The user should be able to access this folder with the builtin files explorer.用户应该能够使用内置文件资源管理器访问此文件夹。

The application runs on Angular.该应用程序在 Angular 上运行。

Do you know your external(sd card) path?您知道您的外部(SD 卡)路径吗? If it is like /storage/emulated/0, then you could try this to create a folder or file.如果它类似于 /storage/emulated/0,那么您可以尝试创建一个文件夹或文件。

import * as fs from "tns-core-modules/file-system";

  let externalPath= fs.path.join(android.os.Environment.getExternalStorageDirectory().getAbsolutePath().toString());
  //Create a folder with known path
  var folder: fs.Folder = fs.Folder.fromPath(sdCardPath+"/test");
  //Create a file 
  var testFile: fs.File = folder.getFile("test.txt");
  console.log("Path " + folder.path)

User should be able to access this fold and file.用户应该能够访问此折叠和文件。 It is in device internal storage which is "external" folder.它位于设备内部存储中,即“外部”文件夹。

I still try to figure out how to get access to sd card but hope above code work for you.我仍然试图弄清楚如何访问 SD 卡,但希望上面的代码对你有用。

I really struggled with this one on Android device and in the end it was due to:我真的在 Android 设备上遇到了这个问题,最终是由于:

  1. Not making sure the required permissions has been granted by the user in the app不确保用户在应用程序中授予了所需的权限
  2. Using "Android File Transfer" on my Macbook to verify the files have been created and to download them在我的 Macbook 上使用“Android 文件传输”来验证文件是否已创建并下载它们

tns info信息

nativescript 6.0.3
tns-core-modules 6.0.7
tns-android 6.0.2 

tns plugins tns 插件

nativescript-permissions 1.3.7

example code示例代码

        import * as fs from "tns-core-modules/file-system"

        ...

        // First get the required permissions
        // Note: this permissions should also be in your AndroidManifest.xml file as:
        //   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        const permissions = require('nativescript-permissions')
        permissions.requestPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
        .then(() => {
            console.log('Required Android permissions have been granted');
        })
        .catch(() => {
            console.error('Required Android permissions have been denied!');
        });

        // Get the publicly accessable Downloads directory path
        const sdDownloadPath = android.os.Environment.getExternalStoragePublicDirectory(android.os.Environment.DIRECTORY_DOWNLOADS).toString()
        console.log('sdDownloadPath: ' + sdDownloadPath)

        // Get a specific folder in that path (will be created if it does not exist)
        const myAppFolder = fs.Folder.fromPath(fs.path.join(sdDownloadPath, 'myApp'))
        console.log('myApp path: ' + myAppFolder.path)

        // Get a file in that path (will be created if it does not exist)
        // Note: In this case we try to get a unique file every time this code is run
        let date = new Date()
        date = date.toISOString().replace('.', '')
        const myFile = myAppFolder.getFile(`myfile_${date}.txt`) 
        console.log('myFile path: ' + myFile.path)

        // Write some data to this new file
        myFile.writeText('Hello duder 123')
        .then(() => {})
        .catch((err) => console.log(`Error writing to file: ${err}`))

        // Try and read back the data that was written
        myFile.readText()
        .then((res) => {
            console.log(`Text read back: ${res}`)
        }).catch((err) => {
            console.log(err.stack);
        });

        // List all files in the myApp folder
        myAppFolder.getEntities()
        .then((entities) => {
            // entities is array with the document's files and folders.
            entities.forEach((entity) => {
                console.log(entity)
            });
        }).catch((err) => {
            console.log(err.stack);
        });

android file transfer issue安卓文件传输问题

One problem I wasted a lot of time on was that I could see the files with getEntities() but could not see them when using the 3rd party tool "Android File Transfer (AFT)" on Mac.我浪费了很多时间的一个问题是,我可以使用getEntities()看到文件,但在 Mac 上使用第 3 方工具“Android 文件传输 (AFT)”时却看不到它们。 I eventually stumbled across "Android Studio's -> Device File Explorer" and could see all my created files and folders with it so realised the issue is with AFT.我最终偶然发现了“Android Studio 的 -> 设备文件资源管理器”,可以看到我创建的所有文件和文件夹,因此意识到问题出在 AFT 上。

I now make use of Airdroid to browse and download device files.我现在使用Airdroid浏览和下载设备文件。

applicable reference适用参考

https://docs.nativescript.org/angular/ng-framework-modules/file-system (angular docs but relevant to nativescript-vue as well) https://docs.nativescript.org/angular/ng-framework-modules/file-system (角度文档,但也与 nativescript-vue 相关)

我有同样的问题,最后通过在 AndroidManifest.xml 文件中添加android:requestLegacyExternalStorage="true"来解决它,请按照此处的线程进行操作

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM