java - Android - 确定短信文本限制

标签 java android 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);
        }
    });

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

最佳答案

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

我遇到了同样的情况,就这样解决了。 :) 希望对您有所帮助。

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,因此不需要在每次更改时遍历相同的字符串,只需要查看 added/删除字符,这是优化。

关于java - Android - 确定短信文本限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29364213/

相关文章:

android - 测试应用更新时,Android 版本构建签名的 APK 安装被静默阻止

Javascript 以 160 个字符拆分字符串并添加计数器?

Android:短信内容提供商的 'address' 列的空字符串问题

java - 程序不打印除 1 之外的整数

java - 使用 PrintWriter 通过 Java 套接字发送数据不起作用

java - 对准备好的语句设置超时

c# - 在同一时间发送短信

Java DOM XML 正在跳过 xmlns 属性

php - 我将如何防止在 MySQL 数据库上运行查询并以 JSON 格式输出的 PHP Web 服务脚本的热链接?

android - 注解必须调用super的接口(interface)函数