React 本机图像选择器导致应用程序重新启动而不会出现错误

And*_*fiu 3 android react-native react-native-image-picker

我正在使用react-native-image-picker 2.3.1,react-native 0.63.3和react 16.3.1。当使用图像选择器启动相机时,在某些设备(三星设备、Android 10、平板电脑和手机)上,用户拍照后,react-native 应用程序将重新初始化自身,而不会出现任何错误或适当的警告。行为并不一致:有时,用户只能拍摄 1 张照片,应用程序会重新启动,有时会发生在拍摄第 33 张照片时。该行为无法在模拟器或一加或摩托罗拉等不同设备中重现。系统 logcat 日志仅显示一些相关细节,我可以缩小范围:

  • 15533-15533/?E/com.sfsdriver:runtime_flags 中设置的未知位:0x8000

  • E/InputDispatcher: 通道 'd0f2b6f com.sfsdriver/com.sfsdriver.MainActivity (server)' ~ 通道已不可恢复地损坏并将被处置!(可能在应用程序不再活动后发生)

  • E/memtrack:无法加载 memtrack 模块

还有这样的行: 7165-13038/com.sfsdriver I/ReactNativeJNI: Memory warning (Pressure level: TRIM_MEMORY_COMPLETE) returned by JS VM, running a GC 当应用程序在采取操作后成功返回到应用程序活动时都会发生这种情况图片以及应用程序何时重新启动。

我还尝试了以下react-native库:expo-image-picker、react-native-image-picker:v3.0.0-vnext.3

And*_*fiu 11

返回有关此问题的信息。完整的讨论历史可以在这里查看:https://github.com/react-native-image-picker/react-native-image-picker/issues/1502。摘要如下:该问题发生在所用内存接近最大可用内存的设备上,并且几乎所有为相机启动新活动的react-native库都会发生该问题(expo-image-picker、react-native-crop) -图像选择器等)。发生这种情况时,Android 操作系统能够终止后台任务以回收内存(某些 Android 专有版本可以比其他版本更积极地终止后台任务)。当用户发起打开相机的新意图时,主 React 本机应用程序将进入后台,并可能被 Android 操作系统终止(并在用户返回到初始应用程序时由 Android 操作系统重新创建)。当应用程序被终止时,所有信息都会丢失,除非您有一种在后台保持状态的机制。通常,Android 操作系统会将最后的 Activity 结果(在本例中为使用相机应用程序拍摄的图像)提供给调用应用程序,在本例中为 React Activity。不幸的是,当 React Context 被销毁并稍后重新创建时,React Native 如何处理此 onActivity 结果存在一个问题,可以在此处关注: https: //github.com/facebook/react-native/issues/30277

在该问题得到解决之前,此问题将持续存在,尤其是在内存不足的设备上。对于那些不寻找花哨的相机选项,只是想要拍照或开始视频录制的人来说,您可以使用 React Native 相机库(https://github.com/react-native-camera/react-native-camera)通过 Android 系统重新创建 Activity 来克服这个问题。不同之处在于 RNCamera 库不会启动新的 Android 活动(只是将相机嵌入到您指定的位置),这意味着您当前的 React 应用程序将保持活动状态,即使在拍照/录制视频时也是如此。