2010-11-20 3 views
8

基本的には、SMSを受信した後にSMSを送信するアプリケーションがあります。Android:SMS(sendTextMessage)を送信するときのUnicode/Charsetの問題

すべてがなど、を送信するSMSテキストは「C、I、A、E」「特殊文字」、すなわちを持っている場合を除き、正常に動作します

私は、文字セットなど、多くのことを試してみました私はそれを動作させることはできません... 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(); 
    } 
}

ここで私は、私は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/

とにかく、ここにある - (1を受け取った後、メッセージを送信しようとしたときに)それがクラッシュしたときのためにLogCat(クリーンアップパッケージがcom.THE.APPLICATION、主な活動はMAINACTです):

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 

サンプルメッセージテキストの問題に送信する:それはpossívelあるべきとき

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

だから、それpossÃvel読み取り

啓発された魂が私を助けてください。彼/彼女は私の心の中に特別な場所を持っています! :)

編集:私の心の中で特別な場所はそれをカットしていない場合、私は実用的なソリューションのために数ドルを支払うことを喜ん...

答えて

8

[OK]を、これはによって解決されているようです単にメッセージとしてsendTextMessageの代わりにsendMultipartTextMessageを使用します。

誰かが思っていただろう...ユニコード文字は「通常の」文字よりも「スペース」が多いので、それは理にかなっています。

0

7ビットエンコーディングの場合は、160文字しか使用できません。 140文字を使用する場合は、8ビット文字(UTF-8)を使用しているため、sendMultipartTextMessageを使用しないと動作しません。

+1

意味がありますね。しかし、sendMultipartTextMessageを8ビット文字で使用しなければ動作しません(明らかに、7ビット文字なしで動作します)。私は何かが本当にそこに正しくないと感じる。 –

2

私はこのコードを使用して、UTF-8文字をASCIIに変換しました。そして、SMS作品の送信と私は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(); 
} 
+0

ありがとう非常に親切な助けの投稿 –

1

を:

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

と私のSMSメッセージが完璧に見えます。

+0

こんにちは、キリスト教。 私はAndroid用のコードを長年に渡ってネイティブでは作成していませんが、それは当時存在しなかったはるかにクリーンなソリューションだと思われます。 –

0

私は特殊文字で同じ問題を抱えています。メッセージMAX_SMS_MESSAGE_LENGTHを70に変更すると、すべてうまく動作します。 https://forums.macrumors.com/threads/special-characters-in-sms-turn-them-shorter-70-characters-old-issue-never-solved.1030577/

この

は私のコードです:そのリンクを見て、あなたがメッセージをいくつかの特殊文字が含まれているかどうかをチェックしますコントローラを挿入し、その後に160からMAX_SMS_MESSAGE_LENGTHを変更することができますもちろん

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.私はいつも私のアプリに特殊文字を持っています。

関連する問題