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
相关产品推荐
相关产品推荐

