基本上,我有一个可以正常工作的应用程序,可以在收到短信后发送短信。
一切正常都可以正常工作,但是发送SMS 的SMS文本具有“特殊字符”,即“é,à,í,ç”等时,一切正常。
我已经尝试了很多事情,包括字符集转换,但我根本无法使其工作……msgText总是会出现字符集编码问题。
这是发送消息的部分: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();
}
}
这是我尝试(但无济于事)的字符集转换函数,该函数应用于msgText: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;
}
几乎无奈之下,我什至在这里尝试了unicode消息传递的解决方案(也无济于事):
http://since2006.com/blog/android-send-unicode-message/
无论如何,这是LogCat崩溃时(清理后的包为com.THE.APPLICATION,主要 Activity 为MAINACT)(当收到消息后尝试发送消息):
WARN/dalvikvm(28218):threadid = 1:线程以未捕获的异常退出(group = 0x4001d7f0)
错误/AndroidRuntime(28218):致命异常:主要
ERROR/AndroidRuntime(28218):java.lang.RuntimeException:在com.THE.APPLICATION.SMSReceiver@44acd880中接收广播 Intent {act = android.provider.Telephony.SMS_RECEIVED(has extras)}时出错
错误/AndroidRuntime(28218):位于android.app.ActivityThread $ PackageInfo $ ReceiverDispatcher $ Args.run(ActivityThread.java:905)
错误/AndroidRuntime(28218):位于android.os.Handler.handleCallback(Handler.java:587)
错误/AndroidRuntime(28218):位于android.os.Handler.dispatchMessage(Handler.java:92)
错误/AndroidRuntime(28218):位于android.os.Looper.loop(Looper.java:123)
错误/AndroidRuntime(28218):位于android.app.ActivityThread.main(ActivityThread.java:4627)
ERROR/AndroidRuntime(28218):位于java.lang.reflect.Method.invokeNative( native 方法)
错误/AndroidRuntime(28218):位于java.lang.reflect.Method.invoke(Method.java:521)
错误/AndroidRuntime(28218):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:868)
错误/AndroidRuntime(28218):位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
ERROR/AndroidRuntime(28218):位于dalvik.system.NativeStart.main( native 方法)
错误/AndroidRuntime(28218):由以下原因引起:java.lang.NullPointerException
错误/AndroidRuntime(28218):位于android.os.Parcel.readException(Parcel.java:1253)
错误/AndroidRuntime(28218):位于android.os.Parcel.readException(Parcel.java:1235)
错误/AndroidRuntime(28218):位于com.android.internal.telephony.ISms $ Stub $ Proxy.sendText(ISms.java:369)
错误/AndroidRuntime(28218):位于android.telephony.SmsManager.sendTextMessage(SmsManager.java:87)
错误/AndroidRuntime(28218):在com.THE.APPLICATION.MAINACT.sendMessage(MAINACT.java:214)
错误/AndroidRuntime(28218):在com.THE.APPLICATION.SMSReceiver.onReceive(SMSReceiver.java:24)
错误/AndroidRuntime(28218):位于android.app.ActivityThread $ PackageInfo $ ReceiverDispatcher $ Args.run(ActivityThread.java:892)
错误/AndroidRuntime(28218):...还有9个
带有问题的要发送的消息文本示例:
VERBOSE/debug_tag(28218):msgText是:possÃvel。
因此,当应为时,它会读取possÃvel
请一些开明的灵魂帮助我。他/她在我心中将有一个特殊的位置! :)
编辑:如果我心中的特殊地方不切实际,我愿意为一些可行的解决方案支付几美元...
最佳答案
好的,这似乎已经通过简单地使用sendMultipartTextMessage
而不是sendTextMessage
来解决了。
谁会想到...这样做是有道理的,因为Unicode字符比“普通”字符使用更多的“空格”。