Flutter中安卓12+设备设置壁纸时应用重启问题求助
解决Flutter在安卓12+设置壁纸时应用重启的问题
问题根源
你使用的wallpaper: ^1.1.0插件版本老旧,未适配安卓12(API 31)及以上的壁纸设置新规范。调用旧API时会触发系统配置变更(比如壁纸变更导致Activity重建),或是权限处理逻辑缺失,最终引发应用重启。
解决方案
1. 替换为适配安卓12+的维护型插件
放弃停止更新的wallpaper插件,改用适配新系统的插件,比如wallpaper_manager_flutter: ^2.0.0(当前维护状态良好)。在pubspec.yaml中更新依赖:
dependencies: wallpaper_manager_flutter: ^2.0.0 permission_handler: ^10.2.0 # 用于权限请求
2. 配置安卓权限
在android/app/src/main/AndroidManifest.xml中添加必要权限,覆盖安卓12+的新要求:
<uses-permission android:name="android.permission.SET_WALLPAPER" /> <uses-permission android:name="android.permission.SET_WALLPAPER_HINTS" /> <!-- 安卓12+壁纸设置流程依赖的精确闹钟权限 --> <uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
3. 先请求权限再执行壁纸设置
在Flutter代码中,先确保权限已授予,再执行壁纸设置操作,避免权限缺失引发的异常:
import 'package:permission_handler/permission_handler.dart'; import 'package:wallpaper_manager_flutter/wallpaper_manager_flutter.dart'; Future<void> setDeviceWallpaper(String imagePath) async { // 请求基础壁纸设置权限 final wallpaperPermStatus = await Permission.setWallpaper.request(); if (!wallpaperPermStatus.isGranted) { print("壁纸设置权限被拒绝"); return; } // 安卓12+额外请求精确闹钟权限 if (await Permission.scheduleExactAlarm.isDenied) { final alarmPermStatus = await Permission.scheduleExactAlarm.request(); if (!alarmPermStatus.isGranted) { print("精确闹钟权限被拒绝,可能影响壁纸设置"); } } // 执行壁纸设置 try { final result = await WallpaperManagerFlutter.setWallpaperFromFile( filePath: imagePath, wallpaperType: WallpaperManagerFlutter.BOTH_SCREENS, // 可选择HOME_SCREEN/LOCK_SCREEN/BOTH_SCREENS ); print("壁纸设置成功: $result"); } catch (e) { print("壁纸设置失败: $e"); } }
4. 临时兼容方案(不推荐)
如果暂时无法替换插件,可在安卓AndroidManifest.xml的主Activity中添加配置,避免Activity因系统配置变更重建:
<activity android:name=".MainActivity" android:configChanges="keyboardHidden|orientation|screenSize|smallestScreenSize|screenLayout" ...>
注意:这只是临时规避重启,无法解决插件本身的API适配问题,长期来看仍需替换插件
内容的提问来源于stack exchange,提问作者Prashant Vaddoriya
相关产品推荐
相关产品推荐

