如何更正 NativeScript 应用程序中 "Downloads" 文件夹中的读取文件?
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)
我认为要访问下载目录,您还需要添加对清单的写入权限,即 android.permission.WRITE_EXTERNAL_STORAGE
然后您可以使用
程序化地构建文件路径
new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath()+"/7zoVG9uML7AyjwHl.png");
所以,解决方案是:
- 加入AndroidManifest.xml
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
- 加入AndroidManifest.xml
<application android:requestLegacyExternalStorage="true" ...>
- 通过字符串路径获取文件:
const file = fs.File.fromPath('/storage/emulated/0/Download/7zoVG9uML7AyjwHl.png');
file.readSync(e => console.log('ERROR ' + e));
- 加入AndroidManifest.xml:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application android:requestLegacyExternalStorage="true" ...>
- 使用 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
};
- 对于 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
- NPM 8.1.0
- Android11API30级
- "@nativescript/core": "~8.1.1",
- "@nativescript-community/ui-document-picker": "^1.1.7",
- "@nativescript/android": "8.1.1",
当打开文件选择器和 select 下载文件夹中的 PDF 文件时 file.readSync sayas 错误:
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。
谢谢
我在 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)
我认为要访问下载目录,您还需要添加对清单的写入权限,即 android.permission.WRITE_EXTERNAL_STORAGE
然后您可以使用
程序化地构建文件路径new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath()+"/7zoVG9uML7AyjwHl.png");
所以,解决方案是:
- 加入AndroidManifest.xml
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
- 加入AndroidManifest.xml
<application android:requestLegacyExternalStorage="true" ...>
- 通过字符串路径获取文件:
const file = fs.File.fromPath('/storage/emulated/0/Download/7zoVG9uML7AyjwHl.png');
file.readSync(e => console.log('ERROR ' + e));
- 加入AndroidManifest.xml:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application android:requestLegacyExternalStorage="true" ...>
- 使用 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
};
- 对于 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
- NPM 8.1.0
- Android11API30级
- "@nativescript/core": "~8.1.1",
- "@nativescript-community/ui-document-picker": "^1.1.7",
- "@nativescript/android": "8.1.1",
当打开文件选择器和 select 下载文件夹中的 PDF 文件时 file.readSync sayas 错误:
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。
谢谢