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

