Как сохранить файл в папке «Загрузить» на Android с помощью Expo?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как сохранить файл в папке «Загрузить» на Android с помощью Expo?

Сообщение Anonymous »

У меня есть приложение RN, созданное с помощью Expo 51.0.28, и я хочу сохранить PDF-файл в папке «Загрузить».
Вот код, который я ввел после нескольких поисков. :

Код: Выделить всё

import * as FileSystem from "expo-file-system";
import { shareAsync } from "expo-sharing";
import { Platform } from "react-native";

export async function saveFile (data, fileName, type) {
try {
const fr = new FileReader();

fr.onload = async () => {
const fileUri = `${FileSystem.documentDirectory}/file.${type}`;
await FileSystem.writeAsStringAsync(fileUri, fr.result.split(',')[1], {encoding: FileSystem.EncodingType.Base64});
saveToFolder(fileUri, fileName, 'application/pdf');
};
fr.readAsDataURL(data);
} catch (e) {
console.log(e);
}
};

async function saveToFolder(uri, filename, mimetype) {
if (Platform.OS === "android") {
const permissions = await FileSystem.StorageAccessFramework.requestDirectoryPermissionsAsync();

if (permissions.granted) {
const base64 = await FileSystem.readAsStringAsync(uri, { encoding: FileSystem.EncodingType.Base64 });
await FileSystem.StorageAccessFramework.createFileAsync(permissions.directoryUri, filename, mimetype)
.then(async (uri) => {
await FileSystem.writeAsStringAsync(uri, base64, { encoding: FileSystem.EncodingType.Base64 });
})
.catch(e => console.log(e));
} else {
shareAsync(uri);
}
} else {
shareAsync(uri);
}
};
На iOS он работает должным образом (при использовании устройства iPhone 16 в симуляторе). Однако на Android (эмулятор Android Studio с Android 15.0) похоже, что он не получает разрешения, в результате чего используется функция ShareAsync() из блока else.
Это вызывает несколько проблем:
  • Отказано в разрешении для папки «Загрузка», поэтому необходимо создать новую папку для сохранения файлов.
  • Ошибка с надписью «Невозможно подключиться к Metro...» после сохранения файл.
У меня ограниченный опыт работы с React Native, поэтому я буду очень признателен за любые предложения.
UPD: ошибка «Невозможно подключиться к Metro...» появляется только в том случае, если я в меню сохранения файлов перехожу к другой папке, отличной от той, которая создана для приложения.
UPD 2: Кажется, что разрешения фактически предоставлены, но только для вновь созданной папки, т. е. для текущего использования приложения. Если я попытаюсь использовать любую другую папку, я не смогу получить разрешение, а также получу указанную выше ошибку.

Подробнее здесь: https://stackoverflow.com/questions/792 ... -with-expo
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»