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

Flutter项目使用sms_advanced插件获取短信列表报错求助

问题原因与修复方案

可能原因

  • 插件版本兼容性问题:sms_advanced 1.0.2的Android端原生实现可能未正确注册MethodChannel,或与当前Flutter版本不匹配。
  • 权限配置不全:Android 6+需要动态申请危险权限,仅在AndroidManifest.xml声明静态权限不足以获取短信;Android 10及以上还需额外的QUERY_ALL_PACKAGES权限才能读取所有短信。
  • 项目构建缓存异常:flutter clean后重新构建时,原生代码可能未被正确编译集成。

修复步骤

1. 升级或更换插件

将pubspec.yaml中的sms_advanced: ^1.0.2替换为最新版本,执行flutter pub get更新依赖。若问题依旧,可尝试切换到更成熟的短信插件(如sms插件)。

2. 补全权限配置与动态申请

  • 完善AndroidManifest.xml权限声明:
    <uses-permission android:name="android.permission.READ_SMS"/>
    <uses-permission android:name="android.permission.SEND_SMS"/>
    <!-- Android 10+ 读取所有短信需添加 -->
    <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
    
  • 集成动态权限申请(使用permission_handler插件):
    先在pubspec.yaml添加依赖permission_handler: ^10.2.0,然后在代码中先申请权限再获取短信:
    import 'package:permission_handler/permission_handler.dart';
    import 'package:sms_advanced/sms_advanced.dart';
    
    Future<void> fetchSms() async {
      // 申请短信权限
      final permissionStatus = await Permission.sms.request();
      if (!permissionStatus.isGranted) {
        // 提示用户开启权限
        return;
      }
    
      // 获取短信列表
      final smsQuery = SmsQuery();
      try {
        final smsList = await smsQuery.getAllSms();
        // 处理短信数据
      } catch (e) {
        print(e.toString());
      }
    }
    

3. 彻底清理并重新构建项目

  1. 执行flutter clean清除构建缓存
  2. 删除项目根目录下的android/.gradle文件夹(解决gradle缓存异常)
  3. 执行flutter pub get重新拉取依赖
  4. 执行flutter run重新运行项目

4. 检查插件原生实现(可选)

若以上步骤无效,可手动检查sms_advanced插件的Android端代码,确认MethodChannel是否正确注册:

  • 查看插件的Android目录下的SmsAdvancedPlugin.java或SmsAdvancedPlugin.kt文件,确认是否存在plugins.elyudde.com/querySMS通道的注册代码,以及getInbox方法的实现。

内容的提问来源于stack exchange,提问作者Javad-M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 02:22:50