import * as Haptics from 'expo-haptics'; import * as MediaLibrary from 'expo-media-library'; import React, { useRef } from 'react'; import { Alert, StyleSheet, TouchableOpacity, View } from 'react-native'; import QRCode from 'react-native-qrcode-svg'; import { captureRef } from 'react-native-view-shot'; export default function QRDownloadScreen(prop: { url: string }) { const qrViewRef = useRef(null); // 用于截图的引用 const [qrValue] = React.useState(prop.url); // 二维码内容 const saveQRToGallery = async () => { try { // 触发轻震,提升交互感 await Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); // 请求相册写入权限 const { status } = await MediaLibrary.requestPermissionsAsync(); if (status !== 'granted') { Alert.alert('权限被拒绝', '需要保存图片到相册的权限'); return; } if (!qrViewRef.current) return; // 截取二维码视图 const uri = await captureRef(qrViewRef, { format: 'png', quality: 1, result: 'tmpfile', // 返回临时文件路径 }); // 保存到相册 await MediaLibrary.saveToLibraryAsync(uri); Alert.alert('✅ 成功', '二维码已保存到相册!'); } catch (error) { console.error('保存失败:', error); Alert.alert('❌ 失败', '无法保存图片,请重试'); } }; return ( {/* 可截图的容器 */} ); } const styles = StyleSheet.create({ container: { // flex: 1, justifyContent: 'center', alignItems: 'center', }, qrContainer: { padding: 16, backgroundColor: '#fff', borderRadius: 12, }, tip: { marginTop: 20, color: '#666', fontSize: 14, }, });