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

Android Java发送SMS遇报错:静态上下文调用及API版本兼容问题

Android发送短信静态方法的问题分析与解决

第一个错误原因及解决

Non-static method 'getSystemService(java.lang.Class)' cannot be referenced from a static context

  • 问题本质:getSystemService是Context类的非静态方法,你在静态的sendSms方法里直接通过Context类名调用,这不符合Java语法规则——静态方法只能访问静态成员,无法直接调用非静态方法。
  • 解决办法:给sendSms静态方法添加一个Context类型的参数,通过传入的Context实例去调用getSystemService,而非直接用Context类名调用。

第二个错误原因及解决

Call requires API level 23 (current min is 21): android.content.Context#getSystemService

  • 问题本质:带Class参数的getSystemService(Class<T>)是Android API 23才新增的方法,你的项目最低兼容API 21,低版本系统不支持这个调用方式。
  • 解决办法:改用API 1就存在的旧版getSystemService(String)方法,传入Context.SMS_SERVICE作为参数,再将返回值强转为SmsManager,这样就能兼容API 21及以上版本。

修正后的代码示例

public static void sendSms(Context context, String phoneNumber, String message) {
    // 兼容低版本的SmsManager获取方式
    SmsManager smsManager = (SmsManager) context.getSystemService(Context.SMS_SERVICE);
    // 拆分长短信(短信内容过长时需要)
    ArrayList<String> messageParts = smsManager.divideMessage(message);
    for (String part : messageParts) {
        smsManager.sendTextMessage(phoneNumber, null, part, null, null);
    }
}

额外注意事项

  • 必须在AndroidManifest.xml中添加发送短信的权限:
    <uses-permission android:name="android.permission.SEND_SMS" />
    
  • 从Android 6.0(API 23)开始,SEND_SMS属于危险权限,仅靠清单声明不够,需要在代码中动态申请权限。

内容的提问来源于stack exchange,提问作者Zine eddine Boumaza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 05:15:27