Я пытался заставить это работать целую вечность и пробовал много разных способов заставить это работать. Я пытаюсь получить связанный ресурс в приложении для Android, созданный с помощью expo 50, закодируйте его в base64, чтобы я мог использовать его для создания PDF-файла. В разработке он работает нормально, но после сборки APK не загружается. Я не могу использовать активы из выставочных активов, так как я думаю, что это для SDK 51. Я нашел темы в других местах, в которых говорится, что нужно добавить file:/// или file:///android_asset или file:///android_res к идентификатору ресурса, который доступен из assets[0].localUri, но ни один из этих вариантов не работает, проблема не в том, что assets[0].localUri не определен, а в том, что я не знаю, как использовать этот идентификатор ресурса для доступа к ресурсу с помощью FileSystem. Я попытался разархивировать APK, чтобы просмотреть структуру файла, но он не похож на обычное приложение для Android. Я не вижу никаких упоминаний ни об одном изображении, которое пытаюсь использовать, однако есть и другие изображения, которые приложение использует, например заставка и т. д., и я тоже не могу их найти, хотя они работают. Вот минимальная версия экрана, которую я пытаюсь заставить работать. Буду рад любой помощи.
import { View, Text, StyleSheet, Alert, Button } from 'react-native';
import { useAssets } from 'expo-asset';
import * as FileSystem from 'expo-file-system';
import RNHTMLtoPDF from 'react-native-html-to-pdf';
const App = () => {
const [assets, error] = useAssets([require('./assets/images/your-image.png')]);
const [base64Image, setBase64Image] = useState(null);
useEffect(() => {
const loadBase64Image = async () => {
if (assets && assets[0]) {
try {
const asset = assets[0];
const uri = asset.localUri || asset.uri;
if (!uri) {
Alert.alert("Error", "Asset URI is not available.");
return;
}
const base64 = await FileSystem.readAsStringAsync(uri, {
encoding: FileSystem.EncodingType.Base64,
});
setBase64Image(base64);
} catch (e) {
Alert.alert("Error", `Exception in loadBase64Image: ${e.message}`);
}
}
};
loadBase64Image();
}, [assets]);
const generatePDF = async () => {
if (!base64Image) {
Alert.alert("Error", "Base64 image data is not available.");
return;
}
const htmlContent = `
PDF Document
Base64 Image PDF Example
[img]data:image/png;base64,${base64Image}[/img]
`;
const options = {
html: htmlContent,
fileName: 'test',
directory: 'Documents',
};
try {
const file = await RNHTMLtoPDF.convert(options);
Alert.alert('PDF Generated', `PDF saved to ${file.filePath}`);
} catch (e) {
Alert.alert("Error", `Failed to generate PDF: ${e.message}`);
}
};
return (
Base64 Image PDF Example
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
padding: 20,
},
});
export default App;
Подробнее здесь: https://stackoverflow.com/questions/788 ... uction-app
Как закодировать base64 ресурс PNG в приложении Expo 50 для Android ⇐ Android
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение