Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 安卓-确定短信文本限制_Java_Android_Sms - Fatal编程技术网

Java 安卓-确定短信文本限制

Java 安卓-确定短信文本限制,java,android,sms,Java,Android,Sms,我正在开发一款具有分享(通过短信)功能的营销应用程序。 我需要确定SMS第一部分允许的最大字符数。通常限制为160个字符 当我键入某些内容时,例如“ABC”,它变成: 3/160 但是当我添加♥字符,应为: 4/70,而不是4/160 这不仅适用于特殊字符,也适用于汉字。如何做到这一点 编辑: 以下是我目前的代码: mSMS = (EditText) findViewById(R.id.SMS); mSMS.addTextChangedListener(new TextWatcher()

我正在开发一款具有分享(通过短信)功能的营销应用程序。 我需要确定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);
        }
    });
mSMS=(EditText)findViewById(R.id.SMS);
mSMS.addTextChangedListener(新的TextWatcher(){
@凌驾
更改前的公共无效(CharSequence CharSequence,int i,int i2,int i3){
}
@凌驾
public void onTextChanged(CharSequence CharSequence,int i,int i2,int i3){
}
@凌驾
public void PostTextChanged(可编辑){
字符串SMSText=mSMS.getText().toString();
字符串SMSLimit=“160”;
SmsManager manager=smsmsmanager.getDefault();
arraylistmessageparts=manager.divideMessage(SMSText);
如果(messageParts.size()>1){

if(messageParts.get(0).length()因为♥ 不是标准ASCII字符,是Unicode!且每个Unicode字符为2字节,但每个ASCII字符为1字节。
也许你应该这样修改你的代码

我也遇到过同样的情况,并这样解决了。:)希望能有所帮助

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);
 }
我认为这也会遍历整个字符串,正如您提到的,它的速度很慢

我认为,如果您想要更快的性能,您需要覆盖
beforeTextChanged
onTextChanged
并获取用户添加或删除的字符。
如果用户删除了所有的
unicode
字符,您可以假设您的字符串是
ASCII
,所以不需要每次更改都遍历相同的字符串,只需要查看添加/删除的字符,这就是优化。

我刚刚添加了代码。是的,我意识到它是unicode字符。但是检查unicode字符意味着每次调用afterTextChanged()方法时,我都要遍历整个文本。这不是很慢吗?我需要一种更有效的方法来确定SMS文本限制。谢谢你的回答!我很欣赏你的想法。不过,这意味着每次文本被更改时都要遍历整个字符串。如果可能的话,我希望避免遍历(出于性能原因)。谢谢!这正是我需要的。
private static CharsetEncoder encoder = Charset.forName("US-ASCII").newEncoder();

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