Как исправить чтение файла из папки «Загрузки» в приложении NativeScript? - PullRequest
0 голосов
/ 01 апреля 2020

Я пишу Android приложение на NativeScript.

Я определил необходимые разрешения в 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)

Ответы [ 2 ]

0 голосов
/ 01 апреля 2020

Итак, решение:

  1. Добавить в 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));
0 голосов
/ 01 апреля 2020

Я думаю, что для доступа к каталогу загрузок вам необходимо добавить также разрешение на запись в ваш манифест, т. Е. android.permission.WRITE_EXTERNAL_STORAGE

, после чего вы можете програматически построить путь к вашему файлу, используя

new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath()+"/7zoVG9uML7AyjwHl.png");
...