Java调用sendMultipartTextMessage发长短信报Context类型转换错误
错误原因
报错核心为参数类型不匹配:
PendingIntent.getBroadcast()方法的第一个入参要求传入Android系统的Context(上下文)实例- 代码中传入的
this指向当前的SendSMSModule类实例,该类为自定义原生模块类,未继承自Context,无法被识别为合法上下文参数,因此触发类型转换报错。
修复方案
- 第一步:在
SendSMSModule类中持有可用的上下文实例。React Native原生模块默认会在构造方法中传入ReactApplicationContext,将其存为类成员变量即可:
public class SendSMSModule extends ReactContextBaseJavaModule { // 新增上下文成员变量 private final ReactApplicationContext reactContext; // 模块构造方法 public SendSMSModule(ReactApplicationContext reactContext) { super(reactContext); this.reactContext = reactContext; } // 其余原有业务方法 }
- 第二步:将
sendDirect方法内所有PendingIntent.getBroadcast()调用处传入的this,全部替换为上一步保存的reactContext。 - 第三步:兼容Android 12(API 31)及以上版本:该版本及以上系统创建PendingIntent必须指定可变性标识,否则会触发运行时崩溃,需要根据系统版本拼接正确的flag参数。
修正后可直接使用的sendDirect方法代码
private void sendDirect(ReadableMap options, Callback callback) { String msg = options.hasKey("body") ? options.getString("body") : ""; String SENT = "SMS_SENT"; String DELIVERED = "SMS_DELIVERED"; // 适配多版本的PendingIntent标志 int pendingIntentFlags = PendingIntent.FLAG_UPDATE_CURRENT; if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) { pendingIntentFlags = PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT; } ReadableArray recipients = options.hasKey("recipients") ? options.getArray("recipients") : null; if (recipients == null || recipients.size() == 0) { sendCallback(false, false, true); return; } for (int i = 0; i < recipients.size(); i++) { String phoneNo = recipients.getString(i); try { SmsManager smsManager = SmsManager.getDefault(); if (msg.length() > 160) { ArrayList<String> parts = smsManager.divideMessage(msg); ArrayList<PendingIntent> sentPIarr = new ArrayList<>(); ArrayList<PendingIntent> deliveredPIarr = new ArrayList<>(); for (int m = 0; m < parts.size(); m++) { sentPIarr.add(PendingIntent.getBroadcast(reactContext, 0, new Intent(SENT), pendingIntentFlags)); deliveredPIarr.add(PendingIntent.getBroadcast(reactContext, 0, new Intent(DELIVERED), pendingIntentFlags)); } smsManager.sendMultipartTextMessage(phoneNo, null, parts, sentPIarr, deliveredPIarr); } else { PendingIntent sentPI = PendingIntent.getBroadcast(reactContext, 0, new Intent(SENT), pendingIntentFlags); PendingIntent deliveredPI = PendingIntent.getBroadcast(reactContext, 0, new Intent(DELIVERED), pendingIntentFlags); smsManager.sendTextMessage(phoneNo, null, msg, sentPI, deliveredPI); } } catch (Exception ex) { ex.printStackTrace(); sendCallback(false, false, true); return; } } sendCallback(true, false, false); }
补充说明:原代码中定义的发送、送达状态PendingIntent在短消息发送分支未被使用,修正后已补全传入,避免状态监听失效;同时新增了收件人列表为空的判空逻辑,避免空指针崩溃。
内容的提问来源于stack exchange,提问作者kunle
相关产品推荐
相关产品推荐

