[英]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)
所以,解決辦法是:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application android:requestLegacyExternalStorage="true" ...>
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");
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application android:requestLegacyExternalStorage="true" ...>
Permissions.requestPermissions(
[
android.Manifest.permission.READ_EXTERNAL_STORAGE,
android.Manifest.permission.WRITE_EXTERNAL_STORAGE
]).then(() => {
//your code
};
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"
早上好,
我的系統詳細信息:
當打開 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.