You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Flutter Android App真机无网络访问权限问题排查:模拟器正常但真机无法打开链接、加载网络图片

解决Flutter APK真机无网络访问问题

我来帮你排查下这个困扰你的问题——模拟器正常但真机APK没网络的情况,通常和release打包的配置细节脱不了干系,以下是几个常见原因和对应的解决办法:

1. 确认INTERNET权限的配置位置

你提到已经加了<uses-permission android:name="android.permission.INTERNET"/>,但要仔细检查这个权限是不是加在了正确的文件和位置

  • 正确路径是:android/app/src/main/AndroidManifest.xml,别误加到debug目录下的配置文件里(那个只在模拟器/debug模式生效)。
  • 权限标签必须放在<manifest>根标签下,不能嵌套在<application>标签内部,示例如下:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.your.package.name">
    <!-- 权限要写在这里 -->
    <uses-permission android:name="android.permission.INTERNET"/>

    <application ...>
        ...
    </application>
</manifest>

2. 处理Release模式的代码混淆

Flutter的release打包默认会开启代码混淆,如果混淆规则没配置好,可能会把url_launcher、网络请求相关的类给“搅乱”,导致功能失效。

打开android/app/proguard-rules.pro,添加以下规则保护相关依赖:

# 保护url_launcher插件的代码不被混淆
-keep class io.flutter.plugins.urllauncher.** { *; }
# 保护网络异步任务相关类
-keepclassmembers class * extends android.os.AsyncTask {
    public <init>();
}

添加后重新打包APK:flutter build apk --release

3. 适配Android 9+的网络安全限制

从Android 9(API 28)开始,系统默认禁止明文HTTP请求(只允许HTTPS)。如果你的社交链接、网络图片用的是HTTP协议,真机就会直接拒绝加载。解决办法有两个:

  • 优先把所有链接替换成HTTPS(这是最合规的方案);
  • 如果必须用HTTP,就配置网络安全策略:
    1. android/app/src/main/res/xml目录下新建network_security_config.xml(没有xml目录就手动创建),内容如下:
    <?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
        <base-config cleartextTrafficPermitted="true" />
    </network-security-config>
    
    1. AndroidManifest.xml<application>标签里添加引用:
    <application
        ...
        android:networkSecurityConfig="@xml/network_security_config">
        ...
    </application>
    

4. 检查APK的打包方式

如果你用的是flutter build appbundle生成App Bundle再安装,可能会出现split APK的权限异常(这种情况不多见,但可以排查)。先尝试生成完整APK测试:

flutter build apk --release --split-per-abi=false

把这个完整APK安装到真机,看看网络功能是否恢复。

5. 排查真机的网络环境

有时候问题不在应用本身,而是真机的网络限制:

  • 先确认真机的WiFi/移动数据能正常访问外部链接(比如用浏览器打开你的社交链接试试);
  • 检查有没有开启VPN、代理或者公司内网防火墙,这些可能会阻断应用的网络请求;
  • 部分定制ROM(比如小米、华为)有手动控制应用网络权限的开关,虽然INTERNET属于正常权限无需动态申请,但可以去系统设置里确认下你的应用没被禁止联网。

另外,关于url_launcher的跳转问题,你也可以确认下AndroidManifest里是否添加了scheme支持(模拟器正常的话大概率没问题,但可以补充):

<activity ...>
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <!-- 支持http/https链接跳转 -->
        <data android:scheme="http" />
        <data android:scheme="https" />
    </intent-filter>
</activity>

试试以上这些方法,应该能解决你的问题。

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

火山引擎 最新活动