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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 00:15:45