Android Cordova插件短信太大短信错误

Android Cordova插件短信太大短信错误,android,cordova,Android,Cordova,我正在使用Cordova插件短信,它工作正常。 我可以发送短信,但我不能超过标准140-70个字符的每条短信。 我需要发送像默认短信应用程序一样的2合1短信。 对于超出大小的短信,它会发出successCallback,但不会发送短信 谢谢,查看该插件的,您可以看到它使用了smsmsmanager#sendTextMessage()方法。此方法仅处理单个部分的消息,如果您向其传递的消息超出了所用字母表中单个部分的字符限制,则此方法将以静默方式失败。但是,您仍然会得到successCallbac

我正在使用Cordova插件短信,它工作正常。 我可以发送短信,但我不能超过标准140-70个字符的每条短信。 我需要发送像默认短信应用程序一样的2合1短信。 对于超出大小的短信,它会发出successCallback,但不会发送短信

谢谢,

查看该插件的,您可以看到它使用了
smsmsmanager#sendTextMessage()
方法。此方法仅处理单个部分的消息,如果您向其传递的消息超出了所用字母表中单个部分的字符限制,则此方法将以静默方式失败。但是,您仍然会得到
successCallback
,因为没有抛出任何
异常
,插件本身也没有使用其他确认方法。解决方案是修改代码以利用
sendMultipartTextMessage()
方法

在原始源代码中,第206行到第212行(含)处理消息发送,这是我们需要替换的。也就是说,这些行:

PendingIntent sentIntent = PendingIntent.getBroadcast((Context)this.cordova.getActivity(),
    (int)0, (Intent)new Intent("SENDING_SMS"), (int)0);
SmsManager sms = SmsManager.getDefault();
for (int i = 0; i < n; ++i) {
    String address;
    if ((address = addressList.optString(i)).length() <= 0) continue;
    sms.sendTextMessage(address, null, text, sentIntent, (PendingIntent)null);
}

该插件中的传入消息处理不正确,将导致多部分消息显示为多个单独的消息。需要修改两个代码部分来修复此问题。第一个是第350到354行,包括:

for (int i = 0; i < pdus.length; ++i) {
    SmsMessage sms = SmsMessage.createFromPdu((byte[])((byte[])pdus[i]));
    JSONObject json = SMSPlugin.this.getJsonFromSmsMessage(sms);
    SMSPlugin.this.onSMSArrive(json);
}
private JSONObject getJsonFromSmsMessage(SmsMessage sms) {
    JSONObject json = new JSONObject();

    try {
        json.put( ADDRESS, sms.getOriginatingAddress() );
        json.put( BODY, sms.getMessageBody() );
        json.put( DATE_SENT, sms.getTimestampMillis() );
        json.put( DATE, System.currentTimeMillis() );
        json.put( READ, MESSAGE_IS_NOT_READ );
        json.put( SEEN, MESSAGE_IS_NOT_SEEN );
        json.put( STATUS, sms.getStatus() );
        json.put( TYPE, MESSAGE_TYPE_INBOX );
        json.put( SERVICE_CENTER, sms.getServiceCenterAddress());

    } catch ( Exception e ) {
        e.printStackTrace();
    }

    return json;
}
接下来,我们需要修改
getJsonFromSmsMessage()
方法;第447行至第466行,包括:

for (int i = 0; i < pdus.length; ++i) {
    SmsMessage sms = SmsMessage.createFromPdu((byte[])((byte[])pdus[i]));
    JSONObject json = SMSPlugin.this.getJsonFromSmsMessage(sms);
    SMSPlugin.this.onSMSArrive(json);
}
private JSONObject getJsonFromSmsMessage(SmsMessage sms) {
    JSONObject json = new JSONObject();

    try {
        json.put( ADDRESS, sms.getOriginatingAddress() );
        json.put( BODY, sms.getMessageBody() );
        json.put( DATE_SENT, sms.getTimestampMillis() );
        json.put( DATE, System.currentTimeMillis() );
        json.put( READ, MESSAGE_IS_NOT_READ );
        json.put( SEEN, MESSAGE_IS_NOT_SEEN );
        json.put( STATUS, sms.getStatus() );
        json.put( TYPE, MESSAGE_TYPE_INBOX );
        json.put( SERVICE_CENTER, sms.getServiceCenterAddress());

    } catch ( Exception e ) {
        e.printStackTrace();
    }

    return json;
}
此方法现在将如下所示。请注意,该方法的参数类型已更改,
JSONObject
BODY
键的值也已更改

private JSONObject getJsonFromSmsMessage(Object[] pdus) {
    SmsMessage sms = null;
    StringBuilder sb = new StringBuilder();
    JSONObject json = new JSONObject();

    for (int i = 0; i < pdus.length; i++) {
        sms = SmsMessage.createFromPdu((byte[]) pdus[i]);
        sb.append(sms.getMessageBody());
    }

    try {
        json.put(ADDRESS, sms.getOriginatingAddress());
        json.put(BODY, sb.toString());
        json.put(DATE_SENT, sms.getTimestampMillis());
        json.put(DATE, System.currentTimeMillis());
        json.put(READ, MESSAGE_IS_NOT_READ);
        json.put(SEEN, MESSAGE_IS_NOT_SEEN);
        json.put(STATUS, sms.getStatus());
        json.put(TYPE, MESSAGE_TYPE_INBOX);
        json.put(SERVICE_CENTER, sms.getServiceCenterAddress());

    } catch (Exception e) {
        e.printStackTrace();
    }

    return json;
}
私有JSONObject GetJSONFromSMMessage(Object[]PDU){
SmsMessage sms=null;
StringBuilder sb=新的StringBuilder();
JSONObject json=新的JSONObject();
对于(int i=0;i
查看该插件的示例,您可以看到它使用了
smsmsmanager#sendTextMessage()
方法。此方法仅处理单个部分的消息,如果您向其传递的消息超出了所用字母表中单个部分的字符限制,则此方法将以静默方式失败。但是,您仍然会得到
successCallback
,因为没有抛出任何
异常
,插件本身也没有使用其他确认方法。解决方案是修改代码以利用
sendMultipartTextMessage()
方法

在原始源代码中,第206行到第212行(含)处理消息发送,这是我们需要替换的。也就是说,这些行:

PendingIntent sentIntent = PendingIntent.getBroadcast((Context)this.cordova.getActivity(),
    (int)0, (Intent)new Intent("SENDING_SMS"), (int)0);
SmsManager sms = SmsManager.getDefault();
for (int i = 0; i < n; ++i) {
    String address;
    if ((address = addressList.optString(i)).length() <= 0) continue;
    sms.sendTextMessage(address, null, text, sentIntent, (PendingIntent)null);
}

该插件中的传入消息处理不正确,将导致多部分消息显示为多个单独的消息。需要修改两个代码部分来修复此问题。第一个是第350到354行,包括:

for (int i = 0; i < pdus.length; ++i) {
    SmsMessage sms = SmsMessage.createFromPdu((byte[])((byte[])pdus[i]));
    JSONObject json = SMSPlugin.this.getJsonFromSmsMessage(sms);
    SMSPlugin.this.onSMSArrive(json);
}
private JSONObject getJsonFromSmsMessage(SmsMessage sms) {
    JSONObject json = new JSONObject();

    try {
        json.put( ADDRESS, sms.getOriginatingAddress() );
        json.put( BODY, sms.getMessageBody() );
        json.put( DATE_SENT, sms.getTimestampMillis() );
        json.put( DATE, System.currentTimeMillis() );
        json.put( READ, MESSAGE_IS_NOT_READ );
        json.put( SEEN, MESSAGE_IS_NOT_SEEN );
        json.put( STATUS, sms.getStatus() );
        json.put( TYPE, MESSAGE_TYPE_INBOX );
        json.put( SERVICE_CENTER, sms.getServiceCenterAddress());

    } catch ( Exception e ) {
        e.printStackTrace();
    }

    return json;
}
接下来,我们需要修改
getJsonFromSmsMessage()
方法;第447行至第466行,包括:

for (int i = 0; i < pdus.length; ++i) {
    SmsMessage sms = SmsMessage.createFromPdu((byte[])((byte[])pdus[i]));
    JSONObject json = SMSPlugin.this.getJsonFromSmsMessage(sms);
    SMSPlugin.this.onSMSArrive(json);
}
private JSONObject getJsonFromSmsMessage(SmsMessage sms) {
    JSONObject json = new JSONObject();

    try {
        json.put( ADDRESS, sms.getOriginatingAddress() );
        json.put( BODY, sms.getMessageBody() );
        json.put( DATE_SENT, sms.getTimestampMillis() );
        json.put( DATE, System.currentTimeMillis() );
        json.put( READ, MESSAGE_IS_NOT_READ );
        json.put( SEEN, MESSAGE_IS_NOT_SEEN );
        json.put( STATUS, sms.getStatus() );
        json.put( TYPE, MESSAGE_TYPE_INBOX );
        json.put( SERVICE_CENTER, sms.getServiceCenterAddress());

    } catch ( Exception e ) {
        e.printStackTrace();
    }

    return json;
}
此方法现在将如下所示。请注意,该方法的参数类型已更改,
JSONObject
BODY
键的值也已更改

private JSONObject getJsonFromSmsMessage(Object[] pdus) {
    SmsMessage sms = null;
    StringBuilder sb = new StringBuilder();
    JSONObject json = new JSONObject();

    for (int i = 0; i < pdus.length; i++) {
        sms = SmsMessage.createFromPdu((byte[]) pdus[i]);
        sb.append(sms.getMessageBody());
    }

    try {
        json.put(ADDRESS, sms.getOriginatingAddress());
        json.put(BODY, sb.toString());
        json.put(DATE_SENT, sms.getTimestampMillis());
        json.put(DATE, System.currentTimeMillis());
        json.put(READ, MESSAGE_IS_NOT_READ);
        json.put(SEEN, MESSAGE_IS_NOT_SEEN);
        json.put(STATUS, sms.getStatus());
        json.put(TYPE, MESSAGE_TYPE_INBOX);
        json.put(SERVICE_CENTER, sms.getServiceCenterAddress());

    } catch (Exception e) {
        e.printStackTrace();
    }

    return json;
}
私有JSONObject GetJSONFromSMMessage(Object[]PDU){
SmsMessage sms=null;
StringBuilder sb=新的StringBuilder();
JSONObject json=新的JSONObject();
对于(int i=0;i
对于sms concat,我使用了这个:(我使用这个是因为1对1聊天)


它基本上会在第一个“onsmsarrive”事件后等待1秒来解析所有接收到的短信(因为每条短信都需要>1s才能发送)。对于我使用的短信解析,它应该可以工作:(我使用它是因为1对1聊天)


它基本上在第一个“onsmsarrive”事件后等待1秒,以确认所有接收到的短信(因为每个短信发送都需要>1s),它应该可以工作

问题似乎出在:

safesmsExport.sendSMS = function(address, text, successCallback, failureCallback) {

    var numbers;
    if( Object.prototype.toString.call( address ) === '[object Array]' ) {
        numbers = address;
    } else if(typeof address === 'string') {
        numbers = [ address ];
    } else {
        if(typeof failureCallback === 'function') {
            failureCallback("require address, phone number as string, or array of string");
        }
        return;
    }

    cordova.exec(successCallback, failureCallback, 'SMS', 'sendSMS', [numbers, text]);

};

这不是从smsPlugin.java调用函数sendSMS。即使smsPlugin sendSMS被评论,在SMS send上也是独立的。

问题似乎出在:

safesmsExport.sendSMS = function(address, text, successCallback, failureCallback) {

    var numbers;
    if( Object.prototype.toString.call( address ) === '[object Array]' ) {
        numbers = address;
    } else if(typeof address === 'string') {
        numbers = [ address ];
    } else {
        if(typeof failureCallback === 'function') {
            failureCallback("require address, phone number as string, or array of string");
        }
        return;
    }

    cordova.exec(successCallback, failureCallback, 'SMS', 'sendSMS', [numbers, text]);

};

这不是从smsPlugin.java调用函数sendSMS。即使smsPlugin sendSMS被评论,在SMS send上也是独立的。

我选择更改插件。我让这一个工作发送大短信:,问题是这一个没有startwatch。我正在尝试添加它(正如您所看到的,我对插件和JS是新手)

我选择更改插件。我让这一个工作发送大短信:,问题是这一个没有startwatch。我正在尝试添加它(我是插件和JS方面的新手,你可以看到)

如果你查看该插件的代码,你会发现它使用了
smsmsmsmanager#sendTextMessage()
方法,如果消息超过字符限制,它会自动失败,并触发一个成功的回调,因为不会引发异常