2015-03-31 68 views
3

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

当我输入某些东西时,例如“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); 
     } 
    }); 

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

回答

4

也许你应该修改你的代码?

我也有同样的情况,就这样解决了。 :) 希望能帮助到你。

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); 
} 

UPDATE

第二个版本是

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

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

我想,这也贯穿整串,当你提到它的速度慢。

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

+0

感谢您的回答!我很欣赏你的想法。尽管如此,这意味着每当文本发生变化时都会循环整个字符串。如果可能的话,我想避免循环(出于性能原因)。 – Harry 2015-04-01 02:26:19

+0

我更新了回复中的答案。 – 2015-04-01 07:56:11

+0

谢谢!这正是我需要的。 – Harry 2015-04-01 08:25:07

2

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

+0

我刚加了我的代码。是的,我意识到它是一个Unicode字符。但是检查Unicode字符意味着每次调用afterTextChanged()方法时都必须**遍历整个文本。不是那种缓慢吗?我需要一个更有效的方式来确定短信限制。 – Harry 2015-03-31 09:02:33