基本上我有一个工作的应用程序,在收到短信后发送短信。
一切正常,除非短信发送有“特殊字符”,即“é,à,í,ç”等。
我尝试了很多东西,包括charset转换,但我根本无法使它工作...... msgText总是带回charset编码问题。
以下是发送消息的部分:
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();
}
}
这是我尝试的charset转换函数(但没有帮助),我在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/
无论如何,这里(清理 - 包是com.THE.APPLICATION,主要活动是MAINACT)LogCat用于崩溃时(尝试发送消息时,收到消息后):
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 com.THE.APPLICATION.SMSReceiver@44acd880 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
要发送问题的消息文本示例:
VERBOSE/debug_tag(28218): msgText is: possÃvel.
因此, 可能 可能 可能
请一些开明的灵魂帮助我。他/她在我心中会有一个特殊的位置! :) 编辑:如果我心中的特殊地方没有削减它,我愿意花几块钱购买解决方案......
答案 0 :(得分:9)
好的,只需使用sendMultipartTextMessage
代替sendTextMessage
即可解决此问题。
谁会想到......这有点意义,因为unicode角色比“普通”角色使用更多“空间”。
答案 1 :(得分:2)
我已使用此代码将UTF-8字符转换为ASCII。然后发送短信工作,我可以使用160个字符:
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();
}
答案 2 :(得分:1)
我正在使用此命令行:
Html.fromHtml(new String(myString.getBytes("UTF-8"))).toString();
我的短信看起来很完美。
答案 3 :(得分:0)
如果是7位编码,则只能使用160个字符。如果使用140个字符,它应该在没有sendMultipartTextMessage的情况下工作,因为你使用的是8位字符(UTF-8)。
答案 4 :(得分:0)
我对特殊字符有同样的问题。当我将消息MAX_SMS_MESSAGE_LENGTH更改为70时,一切正常。看看那个链接:
这是我的代码:
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);
}
}
当然你可以插入一个控制器来检查消息是否包含一些特殊字符,然后将MAX_SMS_MESSAGE_LENGTH从160更改为70.我的应用程序中总是有特殊字符。