React Native安卓项目InApp浏览器选文件后闪退(仅Chrome内核)
这个问题我之前在脱离Expo的React Native Android项目里也碰到过,核心原因是Google内核的InApp浏览器(比如Chrome Custom Tabs)处理文件上传时,需要特定的配置来接收文件选择的回调,而三星浏览器可能默认处理了这些逻辑。下面分步骤给你排查和解决:
1. 检查并添加必要的权限
首先,文件上传需要读取媒体文件的权限,在AndroidManifest.xml里添加对应权限:
<!-- Android 13+ --> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> <!-- 兼容Android 12及以下 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
同时,记得在App运行时动态请求这些权限(比如用权限管理库),不然文件管理器可能无法正常返回选中的文件。
2. 确认InAppBrowser相关Activity的配置
脱离Expo后,原来Expo自动配置的Activity需要手动添加到AndroidManifest.xml里,不同库的配置略有不同:
如果你用的是react-native-inappbrowser-reborn
添加以下Activity配置:
<activity android:name="com.proyecto26.inappbrowser.RNInAppBrowserActivity" android:launchMode="singleTop" android:noHistory="false"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="inappbrowser" /> </intent-filter> </activity>
重点注意launchMode设为singleTop,这样Activity在接收文件选择回调时不会被重新创建,避免直接关闭跳回应用。
如果你用的是expo-web-browser
添加Expo浏览器的Activity配置:
<activity android:name="expo.modules.webbrowser.WebBrowserActivity" android:launchMode="singleTop" android:theme="@style/Theme.Expo.FullScreen"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="expo-web-browser" /> </intent-filter> </activity>
同时确保你已经正确安装了expo-web-browser的依赖(脱离Expo后需要手动安装expo-modules-core等基础依赖)。
3. 启用InApp浏览器的文件访问权限
在调用openBrowserAsync时,需要显式开启文件访问相关的配置,确保Google内核允许处理文件上传:
对于react-native-inappbrowser-reborn
import InAppBrowser from 'react-native-inappbrowser-reborn'; async function openImgBB() { if (await InAppBrowser.isAvailable()) { await InAppBrowser.open('https://fr.imgbb.com/', { allowFileAccess: true, allowFileAccessFromFileURLs: true, allowUniversalAccessFromFileURLs: true, }); } }
对于expo-web-browser
import * as WebBrowser from 'expo-web-browser'; async function openImgBB() { await WebBrowser.openBrowserAsync('https://fr.imgbb.com/', { allowFileAccess: true, }); }
4. 确保Activity能正确处理回调(针对旧版Android)
如果你的项目还在使用onActivityResult(而非新的Activity Result API),需要在MainActivity.java里添加回调传递逻辑:
import com.proyecto26.inappbrowser.RNInAppBrowserModule; // 对应react-native-inappbrowser-reborn // import expo.modules.webbrowser.WebBrowserModule; // 对应expo-web-browser @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); RNInAppBrowserModule.onActivityResult(requestCode, resultCode, data); // WebBrowserModule.onActivityResult(requestCode, resultCode, data); }
这一步能确保文件选择的结果正确传递给InApp浏览器,而不是直接触发应用跳转。
最后验证
做完以上配置后,clean一下Android项目(./gradlew clean),重新打包安装,应该就能解决Google内核InApp浏览器上传文件后关闭的问题了。
内容的提问来源于stack exchange,提问作者laraisonduplusjuste

