You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native安卓项目InApp浏览器选文件后闪退(仅Chrome内核)

解决Google内核InApp浏览器上传文件后关闭跳转回应用的问题

这个问题我之前在脱离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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 16:23:12