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

Flutter中telephony依赖sendSms方法报错 求解决方案及Kotlin修改可行性

Flutter Telephony依赖短信发送异常的解决方案

先排查基础问题

  • 权限确认:检查AndroidManifest.xml是否添加了<uses-permission android:name="android.permission.SEND_SMS"/>,并且在代码里动态申请了该权限——没有权限的话,系统会直接拒绝获取SmsManager,导致报错。
  • 版本升级:尝试把telephony依赖升级到最新稳定版,部分旧版本确实存在sendSms方法的兼容bug,升级后可能直接解决问题。

自定义Kotlin实现短信发送(如果升级无效)

如果升级后还是无法使用sendSms方法,可以通过修改依赖的Kotlin代码或者自己实现MethodChannel来解决:

1. 修改telephony依赖的Kotlin源码

找到依赖中的TelephonyPlugin.kt文件(路径一般是android/src/main/kotlin/com/example/telephony/),替换原有的sendSms处理逻辑:

private fun sendSms(call: MethodCall, result: Result) {
    val phoneNumber = call.argument<String>("phoneNumber") ?: ""
    val message = call.argument<String>("message") ?: ""
    
    try {
        val smsManager = SmsManager.getDefault()
        smsManager.sendTextMessage(phoneNumber, null, message, null, null)
        result.success(true)
    } catch (e: Exception) {
        result.error("SEND_SMS_FAILED", "发送失败:${e.message}", null)
    }
}

然后在onMethodCall方法里确保sendSms方法被正确映射:

override fun onMethodCall(call: MethodCall, result: Result) {
    when (call.method) {
        // 保留原有其他方法的处理
        "sendSms" -> sendSms(call, result)
        else -> result.notImplemented()
    }
}

2. 自行实现MethodChannel(不修改依赖)

如果不想改动依赖源码,可以在自己项目的Android模块里新建一个Kotlin类,单独实现短信发送功能:

class SmsSenderPlugin(private val context: Context) : MethodCallHandler {
    companion object {
        fun registerWith(registrar: Registrar) {
            val channel = MethodChannel(registrar.messenger(), "custom_sms_sender")
            channel.setMethodCallHandler(SmsSenderPlugin(registrar.context()))
        }
    }

    override fun onMethodCall(call: MethodCall, result: Result) {
        when (call.method) {
            "sendSms" -> {
                val phoneNumber = call.argument<String>("phoneNumber") ?: ""
                val message = call.argument<String>("message") ?: ""
                try {
                    val smsManager = SmsManager.getDefault()
                    smsManager.sendTextMessage(phoneNumber, null, message, null, null)
                    result.success(true)
                } catch (e: Exception) {
                    result.error("SEND_FAILED", e.message, null)
                }
            }
            else -> result.notImplemented()
        }
    }
}

Flutter端调用这个自定义Channel:

final MethodChannel _smsChannel = MethodChannel('custom_sms_sender');

Future<bool> sendCustomSms(String phoneNumber, String message) async {
  try {
    return await _smsChannel.invokeMethod('sendSms', {
      'phoneNumber': phoneNumber,
      'message': message,
    });
  } on PlatformException catch (e) {
    print('短信发送失败:${e.message}');
    return false;
  }
}

额外注意

  • Android 12及以上版本,若发送短信后需要弹出通知,还需申请POST_NOTIFICATIONS权限,但单纯发送短信核心还是SEND_SMS权限。
  • 针对超长短信,可以把sendTextMessage换成sendMultipartTextMessage,系统会自动拆分短信并发送。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 22:20:47