From 515f408c678cae3363dade71266233eb569c53fa Mon Sep 17 00:00:00 2001 From: 3dtours Date: Mon, 7 Sep 2026 19:20:33 +0700 Subject: [PATCH] fix(camera): drop unused expo-camera; viewfinder crash-safe on Android - remove expo-camera dep (autolink forced CameraX 1.6.0 over vision-camera 4.7.3's pinned 1.5.0-alpha03, breaking device enumeration on Xiaomi) - Android: disable Skia frame processor in viewfinder - devices w/o hardware-buffered ImageAnalysis frames (Xiaomi 14 Ultra) crash in frame.getNativeBuffer(); live filter stays on iOS, filters still apply at capture/export --- package.json | 1 - src/components/Viewfinder.tsx | 7 +++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index efcf640..51e1b89 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,6 @@ "babel-preset-expo": "~57.0.0", "expo": "~57.0.7", "expo-asset": "~57.0.5", - "expo-camera": "~57.0.2", "expo-dev-client": "~57.0.6", "expo-file-system": "~57.0.1", "expo-font": "~57.0.1", diff --git a/src/components/Viewfinder.tsx b/src/components/Viewfinder.tsx index eed4d05..466c0e4 100644 --- a/src/components/Viewfinder.tsx +++ b/src/components/Viewfinder.tsx @@ -1,5 +1,5 @@ import React, { useEffect, useState } from 'react'; -import { View, Text, StyleSheet, Dimensions, TouchableOpacity } from 'react-native'; +import { View, Text, StyleSheet, Dimensions, TouchableOpacity, Platform } from 'react-native'; import { Camera, useCameraDevice, useSkiaFrameProcessor, type CameraDevice } from 'react-native-vision-camera'; import { useSharedValue } from 'react-native-reanimated'; import { @@ -283,7 +283,10 @@ export default function Viewfinder({ style={StyleSheet.absoluteFill} device={device} isActive={true} - frameProcessor={frameProcessor} + // Android: Skia frame processor crashes on devices w/o hardware-buffered + // ImageAnalysis frames (e.g. Xiaomi 14 Ultra). Keep raw preview there; + // filters still apply on capture/export. iOS keeps live filtered preview. + frameProcessor={Platform.OS === 'android' ? undefined : frameProcessor} /> {renderCameraOverlays()}