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

Flutter HTTP请求在最新Android设备无响应问题排查求助

Flutter跨平台应用在最新Galaxy设备上HTTP请求无响应问题排查

问题描述

我用Flutter开发跨平台应用时,遇到仅Galaxy S23 Ultra、Galaxy S24+等最新Android设备上HTTP请求无响应的问题,后端确认未收到任何请求,定位为客户端问题。该请求在iOS设备、旧款Android设备(如Galaxy Tab A7 Lite)及Android Studio的Android 14模拟器上均可正常工作。

注册接口代码

Future<int> register(
    String name, 
    String password, 
    String phoneNo, 
    String birthday, 
    String gender
    ) async {
      var pref = await SharedPreferences.getInstance();
      var token = pref.getString(SharedPreferencesKeys.fcmToken) ?? '';
      Map data = {
        'username': name,
        'userbirth': birthday,
        'gender': gender,
        'phoneno': phoneNo,
        'password': password,
        'fcm': token,
      };
      var url = Uri.parse(Url.getSignupUrl());
      var body = json.encode(data);
      try {
        var response = await http.post(
          url,
          headers: {
            'Content-Type': 'application/json',
          },
          body: body,
        ).timeout(const Duration(seconds: 10));
        
        if (response.statusCode == 200) {
          Map<String, dynamic> decodedJson = json.decode(response.body); // for future use
          String accessToken = decodedJson['result']['tokens']['accessToken']['accessToken'];
          int accessTokenTimeout = decodedJson['result']['tokens']['accessToken']['timeout'];
          String refreshToken = decodedJson['result']['tokens']['refreshToken']['refreshToken'];
          int refreshTokenTimeout = decodedJson['result']['tokens']['refreshToken']['timeout'];
          String userId = decodedJson['result']['userId'];
          const storage = FlutterSecureStorage(
              aOptions: AndroidOptions(
                encryptedSharedPreferences: true,
              )
            );
          print('register: $userId, $name, $phoneNo, $birthday, $sex');
          storage.write(key: SecureStorageKeys.userId, value: userId);
          storage.write(key: SecureStorageKeys.name, value: name);
          storage.write(key: SecureStorageKeys.phoneNo, value: phoneNo);
          storage.write(key: SecureStorageKeys.birthday, value: birthday);
          storage.write(key: SecureStorageKeys.sex, value: sex);
          await pref.setString(SharedPreferencesKeys.accessToken, accessToken); 
          await pref.setString(SharedPreferencesKeys.refreshToken, refreshToken);
          await pref.setInt(SharedPreferencesKeys.accessTokenTimeout, accessTokenTimeout);
          await pref.setInt(SharedPreferencesKeys.refreshTokenTimeout, refreshTokenTimeout);
          return(response.statusCode);
        } else {
          return(-1);
        }
      } catch (e) {
          return(-1);
      }
  }

API端点

http://WW.XXX.YYY.ZZZ:3000/my/route

网络安全配置(network_security_config.xml)

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">WW.XXX.YYY.ZZZ</domain>
    </domain-config>
</network-security-config>

AndroidManifest配置

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <application
        android:label="mylabel"
        android:name="${applicationName}"
        android:extractNativeLibs="true"
        android:networkSecurityConfig="@xml/network_security_config"
        android:usesCleartextTraffic="true"
        android:icon="@mipmap/ic_launcher">
        <activity
            android:name=".MainActivity"
            android:exported="true"
            android:launchMode="singleTop"
            android:taskAffinity=""
            android:theme="@style/LaunchTheme"
            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
            android:hardwareAccelerated="true"
            android:windowSoftInputMode="adjustResize"
            android:showWhenLocked="true"
            android:turnScreenOn="true"
            >
            <meta-data
              android:name="io.flutter.embedding.android.NormalTheme"
              android:resource="@style/NormalTheme"
              />
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <activity 
            android:name=".VerificationActivity"
            android:theme="@style/Theme.AppCompat.Light.NoActionBar"
        />
        <meta-data
            android:name="flutterEmbedding"
            android:value="2" />

            <receiver
                android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationReceiver"
                android:exported="false" />
            <receiver
                android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationBootReceiver"
                android:exported="false" >
                <intent-filter>
                    <action android:name="android.intent.action.BOOT_COMPLETED" />
                    <action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
                    <action android:name="android.intent.action.QUICKBOOT_POWERON" />
                    <action android:name="com.htc.intent.action.QUICKBOOT_POWERON" />
                </intent-filter>
            </receiver>
    </application>
    <queries>
        <intent>
            <action android:name="android.intent.action.PROCESS_TEXT"/>
            <data android:mimeType="text/plain"/>
        </intent>
    </queries>
    <uses-feature android:name="android.hardware.bluetooth_le" android:required="false" />

    <uses-permission android:name="android.permission.BLUETOOTH"/>
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.BLUETOOTH_SCAN"/>
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT"/>
    <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE"/>
    <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.ACCESS_MEDIA_LOCATION" />
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
    <uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />
    <uses-permission android:name="android.permission.USE_CREDENTIALS" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" android:maxSdkVersion="28" />
</manifest>

Flutter环境信息

[✓] Flutter (Channel stable, 3.24.0, on macOS 14.2 23C64 darwin-arm64, locale ko-KR)
[✓] Android toolchain - develop for Android devices (Android SDK version 34.0.0)
[✓] Xcode - develop for iOS and macOS (Xcode 15.4)
[✓] Chrome - develop for the web
[✓] Android Studio (version 2024.1)
[✓] VS Code (version 1.94.2)
[✓] VS Code (version 1.91.1)
[✓] Network resources

排查建议

  • 检查目标设备网络:确认设备连接正常网络,切换Wi-Fi/蜂窝数据测试
  • 完善错误日志:在catch块中打印具体错误信息,请求前打印URL和请求体,验证参数正确性
  • 替换HTTP库测试:尝试用dio库替代http库,排查库兼容性问题
  • 验证Android 14+网络限制:检查设备系统隐私设置、厂商安全软件是否拦截目标域名请求
  • 调整cleartext配置:在network_security_config.xml中添加<base-config cleartextTrafficPermitted="true"/>作为兜底配置
  • 检查FCM Token:确认最新设备上FCM Token是否正常获取,避免异常Token导致请求失败
  • 简化请求测试:发送无参数的基础POST请求到目标端点,排除请求体参数问题

内容的提问来源于stack exchange,提问作者Runnan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 16:52:02