簡體   English   中英

如何從 NativeScript 應用程序的“下載”文件夾中更正讀取文件?

[英]How to correct read file from "Downloads" folder in NativeScript app?

我在 NativeScript 上編寫了一個 Android 應用程序。

我在App_Resources/Android/AndroidManifest.xml定義了所需的權限:

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

我知道這不足以訪問存儲,所以我在運行時請求了權限並在系統設置中檢查它。

通過瀏覽器將一些圖像下載到下載文件夾后,我想在我的應用程序中閱讀它。 最初我通過nativescript-mediafilepicker獲得了一個文件路徑,但我使用以下代碼段:

console.log(fs.File.exists('/storage/emulated/0/Download/7zoVG9uML7AyjwHl.png'));
const file = fs.File.fromPath('/storage/emulated/0/Download/7zoVG9uML7AyjwHl.png');
file.readSync(e => console.log('ERROR ' + e));

在控制台打印:

JS: true
JS: ERROR Error: java.io.FileNotFoundException: /storage/emulated/0/Download/7zoVG9uML7AyjwHl.png: open failed: EACCES (Permission denied)

我做錯了什么?

更新我添加了WRITE_EXTERNAL_STORAGE權限,但沒有效果:

permissions.requestPermissions(p).then(async () => {
  const publicDirectory = android.os.Environment.getExternalStoragePublicDirectory(android.os.Environment.DIRECTORY_DOWNLOADS).getAbsolutePath();
  const fullPath = `${publicDirectory}/7zoVG9uML7AyjwHl.png`;
  const file = fs.File.fromPath(fullPath);
  file.readSync(e => console.log('ERROR ' + e));
});
JS: ERROR Error: java.io.FileNotFoundException: /storage/emulated/0/Download/7zoVG9uML7AyjwHl.png: open failed: EACCES (Permission denied)

所以,解決辦法是:

  1. 在 AndroidManifest.xml 中添加
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  1. 在 AndroidManifest.xml 中添加
<application android:requestLegacyExternalStorage="true" ...>

  1. 通過字符串路徑獲取文件:
const file = fs.File.fromPath('/storage/emulated/0/Download/7zoVG9uML7AyjwHl.png');
file.readSync(e => console.log('ERROR ' + e));

我認為要訪問下載目錄,您還需要向清單添加寫入權限,即android.permission.WRITE_EXTERNAL_STORAGE

然后你可以使用 progamatically 構建文件的路徑

new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath()+"/7zoVG9uML7AyjwHl.png");
  1. 在 AndroidManifest.xml 中添加:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application android:requestLegacyExternalStorage="true" ...>
  1. 使用 nativescript-permissions 插件: https ://www.npmjs.com/package/nativescript-permissions 示例:
Permissions.requestPermissions(
            [
                android.Manifest.permission.READ_EXTERNAL_STORAGE,
                android.Manifest.permission.WRITE_EXTERNAL_STORAGE
            ]).then(() => {
               //your code
            };
  1. 對於 Android 10 API 29,您不能使用getExternalStorageDirectory()因為它已被棄用。 更多信息: https : //developer.android.com/reference/android/os/Environment#getExternalStorageDirectory()

代替:

const file = fs.File.fromPath('/storage/emulated/0/Download/7zoVG9uML7AyjwHl.png');

用:

import {Utils} from '@nativescript/core';

const file = Utils.ad.getApplicationContext().getExternalFilesDir(null).getAbsolutePath() +"/7zoVG9uML7AyjwHl.png"

早上好,

我的系統詳細信息:

  • 插件: @nativescript-community/ui-document-picker
  • Ubuntu 20.04.3 LTS
  • NativeScript CLI 8.1.4
  • NVM 0.35.3
  • 節點 v16.13.0
  • 新產品管理 8.1.0
  • Android 11 API 級別 30
  • "@nativescript/core": "~8.1.1",
  • "@nativescript-community/ui-document-picker": "^1.1.7",
  • "@nativescript/android": "8.1.1",

當打開 filepicker 並從下載文件夾中選擇一個 PDF 文件時,file.readSync 提示錯誤:

Error: java.io.FileNotFoundException: /storage/emulated/0/Download/Test.pdf: open failed: EACCES (Permission denied)

當調用 file.read 時說錯誤:

Error: ReadTask returns no result.

這只發生在 targetSdkVersion 設置為 30 而不是 29 時,但現在在 Google App Store 中發布和應用程序需要 targetSdkVersion 30。

謝謝

我有完全相同的問題。 從下載目錄我可以讀取 JPG 文件但不能讀取 PDF 文件(權限被拒絕)

@Xavier Palacin Ayuso,您找到解決方案了嗎?

謝謝

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM