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

时间:2018-04-15 04:07:49

标签: android nativescript sd-card

经过大量的谷歌搜索,以及大量尝试“超出上下文”的代码,我求你帮助我。

我正在试图弄清楚是否可以使用Nativescript在外部存储上写入。我对在应用程序上下文中编写不感兴趣。那么文档显示的内容并不是我想要的。

我已经设法通过Nativescript论坛上的一个帖子实现了这个目标:

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

它有效,它给了我一条路,但是当我有这条路时,我不知道如何处理它。如何在该路径中创建文件,阅读它等。

我需要创建的是创建一个用户和应用程序都可以轻松访问的文件夹。用户应该能够使用内置文件资源管理器访问此文件夹。

该应用程序在Angular上运行。

3 个答案:

答案 0 :(得分:2)

我在Android设备上确实为此苦苦挣扎,最终归因于:

  1. 不确定用户是否已在应用中授予所需的权限
  2. 在Macbook上使用“ Android File Transfer”来验证文件是否已创建并下载

tns信息

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

tns插件

nativescript-permissions 1.3.7

示例代码

        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文件传输问题

我浪费大量时间的一个问题是我可以使用getEntities()查看文件,但是在Mac上使用第三方工具“ Android File Transfer(AFT)”时看不到它们。我最终偶然发现了“ Android Studio的->设备文件资源管理器”,并且可以看到我创建的所有文件和文件夹,因此意识到问题出在AFT。

我现在使用Airdroid浏览和下载设备文件。

适用参考

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

答案 1 :(得分:1)

我遇到了同样的问题,最后通过在AndroidManifest.xml文件中添加android:requestLegacyExternalStorage="true"来解决了这个问题 遵循线程here

答案 2 :(得分:0)

你知道你的外部(SD卡)路径吗? 如果它类似于/ 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)

用户应该能够访问此折叠和文件。它位于设备内部存储器中,即“外部”文件夹。

我仍然试图找出如何访问SD卡,但希望上面的代码适合你。