Android - 确定短信限制

时间:2015-03-31 08:40:42

标签: java android sms

我正在使用共享(通过短信)功能开发营销应用。 我需要确定SMS的第一部分允许的最大字符数。通常限制为160个字符。

当我输入内容时,例如" ABC",它变为:

3 / 160

但是当我添加字符时,它应该变为:

4 / 70,而不是4 / 160

这不仅适用于特殊字符,也适用于中文字符。怎么做到这一点?

修改

到目前为止,我的代码如下:

mSMS = (EditText) findViewById(R.id.SMS);
    mSMS.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {

        }

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {

        }

        @Override
        public void afterTextChanged(Editable editable) {
            String SMSText = mSMS.getText().toString();
            String SMSLimit = "160";
            SmsManager manager = SmsManager.getDefault();
            ArrayList<String> messageParts = manager.divideMessage(SMSText);
            if(messageParts.size() > 1){
                if(messageParts.get(0).length() <= 70)
                    SMSLimit = "70";
            } mCounter.setText(String.valueOf(SMSText.length()) + " / " + SMSLimit);
        }
    });

但这是错误,因为它仅在达到短信限制时有效。我希望它在输入特殊字符时工作

2 个答案:

答案 0 :(得分:6)

也许你应该像这样修改你的代码?

我有同样的情况,并且这样解决了。 :)希望它有所帮助。

boolean isASCII(String str){
    for(int i=0;i<str.length();i++){
        if(str.charAt(i) >= 128)
            return false;
    }
    return true;
}

@Override
public void afterTextChanged(Editable editable) {
   String SMSText = mSMS.getText().toString();
   String SMSLimit = "160";
   SmsManager manager = SmsManager.getDefault();
   ArrayList<String> messageParts = manager.divideMessage(SMSText);
   if(messageParts.size() > 1){

     String smsStr = messageParts.get(0);
     if(!isASCII(smsStr)) SMSLimit = "70";
   }
   mCounter.setText(String.valueOf(SMSText.length()) + " / " + SMSLimit);
 }

<强>更新

第二个版本是

private static CharsetEncoder encoder = Charset.forName("US-ASCII").newEncoder();

boolean isASCII(String str){
   return encoder.canEncode(str);
}

我认为这也会遍历整个字符串,正如你所提到的那样,它很慢。

我认为如果您想要更快的性能,则需要覆盖beforeTextChangedonTextChanged,并获取用户添加或删除的字符。 如果用户删除所有unicode个字符,您可以假设您的字符串是ASCII,因此不需要在每次更改时遍历相同的字符串,只需要查看添加/删除的字符,即优化。

答案 1 :(得分:2)

因为♥不是标准的ASCII字符并且是Unicode!,并且每个Unicode字符是2个字节,但每个ASCII字符是1个字节。 standard ASCII