Flutter release apk权限失效:已配置相机网络权限仍无法使用
1. 修复Android明文网络请求限制
如果你的Web API使用HTTP协议而非HTTPS,Android 9(API 28)及以上版本默认禁止release包使用明文流量,debug模式默认允许所以不会出现问题。
解决方法:在android/app/src/main/AndroidManifest.xml的<application>标签中添加如下属性:
android:usesCleartextTraffic="true"
修改后的application标签示例:
<application android:label="File Tracking System" android:icon="@mipmap/ic_launcher" android:usesCleartextTraffic="true">
2. 配置代码混淆规则
Release构建默认开启R8代码压缩和混淆,你用到的qrscan、permission_handler等原生插件如果没有配置保留规则,会被错误优化导致功能无法调用。
操作步骤:
- 在
android/app目录下新建proguard-rules.pro文件(如果不存在),添加以下规则:
# Flutter核心类不混淆 -keep class io.flutter.app.** { *; } -keep class io.flutter.plugin.** { *; } -keep class io.flutter.util.** { *; } -keep class io.flutter.view.** { *; } -keep class io.flutter.** { *; } -keep class io.flutter.plugins.** { *; } # 扫码插件类不混淆 -keep class com.journeyapps.** {*;} # 权限处理插件类不混淆 -keep class com.baseflow.permissionhandler.** {*;} # 所有Flutter插件实现类不混淆 -keep class * implements io.flutter.embedding.engine.plugins.FlutterPlugin { *; }
- 打开
android/app/build.gradle,确认release构建配置中引用了上述混淆规则:
android { ... buildTypes { release { minifyEnabled true shrinkResources true // 增加下面这行配置 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } }
3. 补充运行时动态权限申请逻辑
相机、读写存储属于Android危险权限,仅在Manifest中声明不生效,必须在调用对应功能前主动向用户申请授权。你可以用已经引入的permission_handler库实现,示例代码:
// 调用扫码前先申请相机权限 var cameraStatus = await Permission.camera.request(); if (cameraStatus.isGranted) { // 权限已授权,执行扫码逻辑 } else { // 弹窗提示用户必须授予相机权限才能使用扫码功能 }
debug模式下测试时你可能已经手动授予过权限,卸载重装release包后权限会重置,没有主动申请逻辑就会导致功能失效。
4. 确认配置生效范围
确保你所有的权限声明都写在android/app/src/main/AndroidManifest.xml中,而不是debug或release子目录下的专属Manifest文件,只有main目录下的配置才会对所有构建类型生效。
同时确认android/app/build.gradle中的minSdkVersion不低于19,避免低版本系统不兼容你引入的第三方插件。
5. 升级老旧依赖
你使用的qrscan: ^0.2.22版本已经停止维护,和新版Flutter、Android SDK存在兼容风险,可以替换为目前维护更活跃的mobile_scanner扫码库,避免版本兼容导致的异常。
修改完所有配置后,先执行flutter clean清理项目缓存,再重新构建release包验证功能是否恢复。
内容的提问来源于stack exchange,提问作者parikshit tiwari

