2010-11-20 23 views
8

Temelde bir SMS aldıktan sonra SMS gönderen bir çalışma uygulamasına sahibim.Android: Bir SMS gönderirken Unicode/Charset sorunları (sendTextMessage)

Her şey charset dahil birçok şeyi denedim

SMS metin vb "özel karakter", yani "I, A, E, C" vardır göndermek dışında, ince işleri dönüştürme işlemi ancak bunu yapamıyorum ... msgText her zaman karakter kodlama problemleriyle geri dönüyor. Ben msgText üzerinde uyguladığı, İşte

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

denedim (ama yardımcı olmadı) charset dönüşüm fonksiyonu var:

İşte ileti gönderildikten parçası çaresizlik civarında

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

Hatta burada bile unicode mesajlaşma için çözüm denedim (aynı zamanda yardımcı olmadı):

neyse, burada - (iletiyi göndermeye çalışırken bir aldıktan sonra) o kilitlendiğinde için LogCat (temizledik paket com.THE.APPLICATION, ana faaliyet MAINACT olan):

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 

Numune mesaj metninin konularla göndermek için: o possível olması gerekirken

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

Yani, possÃvel okur

Lütfen bazı aydınlanmış ruhlar bana yardımcı olun. Kalbimde özel bir yeri olacak! :)

Düzenleme: kalbimde özel bir yer kesmek yok, ben

cevap

8

Tamam, bundan çözülecek gibi görünüyor ... bir çalışma çözümü için birkaç dolar ödemeye hazırım Mesajlar için sendTextMessage yerine sendMultipartTextMessage kullanın.

Kim düşünürdü ki ... bu tür bir anlam ifade etmiyor çünkü unicode karakterleri "normal" olanlardan daha fazla "alan" kullanmaktadır.

0

Yalnızca 7 bit kodlama varsa 160 karakter kullanabilirsiniz. 140 karakter kullanırsanız, 8-bit karakterleri (UTF-8) kullandığınızdan sendMultipartTextMessage olmadan çalışmalıdır.

+1

Mantıklı, değil mi? Ama 8-bit chars ile sendMultipartTextMessage olmadan çalışmaz (belli ki o olmadan 7-bit chars için çalışır). Orada bir şeylerin gerçekten doğru olmadığını hissediyorum. –

2

Bu kodu UTF-8 karakterlerini ASCII'ye dönüştürmek için kullandım. Sonra SMS eserlerin gönderme ve ben 160 karakterler kullanılabilir: Bu komut satırını kullanıyorum

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

Teşekkürler çok güzel yardımcı gönderi –

1

:

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

ve benim SMS mesajı mükemmel görünüyor.

+0

Merhaba, Christian. Oldukça birkaç yıl içinde Android için kodlanmış değilim, ama o zaman belki de mevcut olmayan daha temiz bir çözüm gibi görünüyor. –

0

Aynı sorunu özel karakterlerle de yaşıyorum.MAX_SMS_MESSAGE_LENGTH - 70 arasındaki mesajı değiştirdiğimde her şey iyi çalışıyor. https://forums.macrumors.com/threads/special-characters-in-sms-turn-them-shorter-70-characters-old-issue-never-solved.1030577/

Bu

benim kodudur: bu bağlantı bak sen mesajı bazı özel karakter içeriyorsa kontrol edecek bir denetleyici eklemek ve daha sonra 160 MAX_SMS_MESSAGE_LENGTH değiştirebilir Tabii

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

70. Uygulamamda her zaman özel karakterlerim var.

İlgili konular