2010-11-20 20 views
8

Fondamentalement, j'ai une application de travail qui envoie un SMS après la réception d'un SMS.Android: problèmes Unicode/Charset lors de l'envoi d'un SMS (sendTextMessage)

Tout fonctionne bien, sauf si le texte SMS envoyer a "caractères spéciaux", soit "é, à, í, C", etc.

J'ai essayé beaucoup de choses, y compris charset conversion mais je ne peux tout simplement pas le faire fonctionner ... le msgText revient toujours avec des problèmes de codage charset.

est ici la partie où le message est envoyé:

if (msgText.length() > 160) { 
    ArrayList msgTexts = sm.divideMessage(msgText); 
    sm.sendMultipartTextMessage(PhoneNumber, null, msgTexts, null, null); 
} else { 
    try { 
     sm.sendTextMessage(PhoneNumber, null, msgText, null, null); 
    } catch (IllegalArgumentException e) { 
     e.printStackTrace(); 
    } 
}

est ici la fonction de conversion de charset j'ai essayé (mais n'a pas aidé), que j'ai appliqué sur texteMsg:

public static String formatCharset(String txtInicial) { 
    //-- Please notice this is just for reference, I tried every charset from/to conversion possibility. Even stupid ones and nothing helped. 

    /*try {//-- Seems simpler, it should do the same as below, but didn't help 
     msgText = new String(msgText.getBytes("UTF-8"), "ISO-8859-1"); 
     } catch (UnsupportedEncodingException e) { 
      e.printStackTrace(); 
    }*/ 

    Charset charsetOrigem = Charset.forName("UTF-8"); 
    CharsetEncoder encoderOrigem = charsetOrigem.newEncoder(); 
    Charset charsetDestino = Charset.forName("ISO-8859-1"); 
    CharsetDecoder decoderDestino = charsetDestino.newDecoder(); 

    String txtFinal = ""; 

    try { 
     ByteBuffer bbuf = encoderOrigem.encode(CharBuffer.wrap(txtInicial)); 
     CharBuffer cbuf = decoderDestino.decode(bbuf); 
     txtFinal = cbuf.toString(); 
    } catch (CharacterCodingException e) { 
     e.printStackTrace(); 
    } 

    if (txtFinal.length() == 0) txtFinal = txtInicial; 

    return txtFinal; 
}

Près de désespoir J'ai même essayé la solution pour la messagerie unicode ici (n'a pas aidé aussi bien):

http://since2006.com/blog/android-send-unicode-message/

Quoi qu'il en soit, voici le (nettoyé - paquet est com.THE.APPLICATION, l'activité principale est MAINACT) LogCat quand il se bloque (en essayant d'envoyer le message, après avoir reçu un):

WARN/dalvikvm(28218): threadid=1: thread exiting with uncaught exception (group=0x4001d7f0) 
ERROR/AndroidRuntime(28218): FATAL EXCEPTION: main 
ERROR/AndroidRuntime(28218): java.lang.RuntimeException: Error receiving broadcast Intent { act=android.provider.Telephony.SMS_RECEIVED (has extras) } in [email protected] 
ERROR/AndroidRuntime(28218):  at android.app.ActivityThread$PackageInfo$ReceiverDispatcher$Args.run(ActivityThread.java:905) 
ERROR/AndroidRuntime(28218):  at android.os.Handler.handleCallback(Handler.java:587) 
ERROR/AndroidRuntime(28218):  at android.os.Handler.dispatchMessage(Handler.java:92) 
ERROR/AndroidRuntime(28218):  at android.os.Looper.loop(Looper.java:123) 
ERROR/AndroidRuntime(28218):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
ERROR/AndroidRuntime(28218):  at java.lang.reflect.Method.invokeNative(Native Method) 
ERROR/AndroidRuntime(28218):  at java.lang.reflect.Method.invoke(Method.java:521) 
ERROR/AndroidRuntime(28218):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
ERROR/AndroidRuntime(28218):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
ERROR/AndroidRuntime(28218):  at dalvik.system.NativeStart.main(Native Method) 
ERROR/AndroidRuntime(28218): Caused by: java.lang.NullPointerException 
ERROR/AndroidRuntime(28218):  at android.os.Parcel.readException(Parcel.java:1253) 
ERROR/AndroidRuntime(28218):  at android.os.Parcel.readException(Parcel.java:1235) 
ERROR/AndroidRuntime(28218):  at com.android.internal.telephony.ISms$Stub$Proxy.sendText(ISms.java:369) 
ERROR/AndroidRuntime(28218):  at android.telephony.SmsManager.sendTextMessage(SmsManager.java:87) 
ERROR/AndroidRuntime(28218):  at com.THE.APPLICATION.MAINACT.sendMessage(MAINACT.java:214) 
ERROR/AndroidRuntime(28218):  at com.THE.APPLICATION.SMSReceiver.onReceive(SMSReceiver.java:24) 
ERROR/AndroidRuntime(28218):  at android.app.ActivityThread$PackageInfo$ReceiverDispatcher$Args.run(ActivityThread.java:892) 
ERROR/AndroidRuntime(28218):  ... 9 more 

échantillon du texte du message à envoyer des questions:

VERBOSE/debug_tag(28218): msgText is: possível.

Ainsi, il litpossÃvel quand il devrait être possivel

S'il vous plaît, une âme éclairée m'aide. Il/Elle aura une place spéciale dans mon coeur! :)

Edit: Si la place spéciale dans mon cœur ne coupe pas, je suis prêt à payer un peu d'argent pour une solution de travail ...

Répondre

8

Ok, cela semble avoir été résolu par en utilisant simplement sendMultipartTextMessage au lieu de sendTextMessage pour les messages. Qui aurait pensé ... cela a du sens parce que les caractères Unicode utilisent plus de "space" que de caractères "normaux".

0

Vous ne pouvez utiliser que 160 caractères s'il s'agit d'un codage 7 bits. Si vous utilisez 140 caractères, il devrait fonctionner sans sendMultipartTextMessage car vous utilisez des caractères de 8 bits (UTF-8).

+1

Ça a du sens, non? Mais cela ne fonctionne pas sans sendMultipartTextMessage avec des caractères de 8 bits (cela fonctionne évidemment pour les caractères de 7 bits sans cela). Je sens que quelque chose ne va pas vraiment bien là-dedans. –

2

J'ai utilisé ce code pour convertir des caractères UTF-8 en ASCII. Ensuite, l'envoi des œuvres SMS et je peux utiliser 160 caractères:

private static final String PLAIN_ASCII = "AaEeIiOoUu" // grave 
     + "AaEeIiOoUuYy" // acute 
     + "AaEeIiOoUuYy" // circumflex 
     + "AaOoNn" // tilde 
     + "AaEeIiOoUuYy" // umlaut 
     + "Aa" // ring 
     + "Cc" // cedilla 
     + "OoUu" // double acute 
; 

private static final String UNICODE = "\u00C0\u00E0\u00C8\u00E8\u00CC\u00EC\u00D2\u00F2\u00D9\u00F9" 
     + "\u00C1\u00E1\u00C9\u00E9\u00CD\u00ED\u00D3\u00F3\u00DA\u00FA\u00DD\u00FD" 
     + "\u00C2\u00E2\u00CA\u00EA\u00CE\u00EE\u00D4\u00F4\u00DB\u00FB\u0176\u0177" 
     + "\u00C3\u00E3\u00D5\u00F5\u00D1\u00F1" 
     + "\u00C4\u00E4\u00CB\u00EB\u00CF\u00EF\u00D6\u00F6\u00DC\u00FC\u0178\u00FF" 
     + "\u00C5\u00E5" + "\u00C7\u00E7" + "\u0150\u0151\u0170\u0171"; 

// remove accentued from a string and replace with ascii equivalent 
public static String convertNonAscii(String s) { 
    if (s == null) 
     return null; 
    StringBuilder sb = new StringBuilder(); 
    int n = s.length(); 
    for (int i = 0; i < n; i++) { 
     char c = s.charAt(i); 
     int pos = UNICODE.indexOf(c); 
     if (pos > -1) { 
      sb.append(PLAIN_ASCII.charAt(pos)); 
     } else { 
      sb.append(c); 
     } 
    } 
    return sb.toString(); 
} 
+0

merci très gentil poste utile –

1

J'utilise cette ligne de commande:

Html.fromHtml(new String(myString.getBytes("UTF-8"))).toString(); 

et mon message SMS est parfait.

+0

Salut, Christian. Je n'ai pas codé pour Android nativement depuis quelques années, mais il semble que ce soit une solution beaucoup plus propre qui n'existait peut-être pas à l'époque. –

0

J'ai le même problème avec les caractères spéciaux.Quand je change le message MAX_SMS_MESSAGE_LENGTH à 70 tout fonctionne bien. Regardez ce lien:

https://forums.macrumors.com/threads/special-characters-in-sms-turn-them-shorter-70-characters-old-issue-never-solved.1030577/

Ceci est mon code:

public static void sendSMS(String phoneNumber, String message, Context context) { 

    String SENT = "SMS_SENT"; 
    int MAX_SMS_MESSAGE_LENGTH = 70; 

    SmsManager smsManager = SmsManager.getDefault(); 
    PendingIntent sentPI; 
    sentPI = PendingIntent.getBroadcast(context, 0,new Intent(SENT), 0); 

    try { 
     if(message.length() > MAX_SMS_MESSAGE_LENGTH) { 
      ArrayList<String> messageList = SmsManager.getDefault().divideMessage(message); 
      smsManager.sendMultipartTextMessage(phoneNumber, null, messageList, null, null); 
     } else { 
      smsManager.sendTextMessage(phoneNumber, null, message, sentPI, null); 
     } 
    } catch (Exception e) { 
     Log.e("SmsProvider", "" + e); 
    } 
} 

Bien sûr, vous pouvez insérer un contrôleur qui vérifie si le message contient des caractères spéciaux, puis changer MAX_SMS_MESSAGE_LENGTH de 160 à 70. J'ai toujours des caractères spéciaux dans mon application.