Wednesday, September 8, 2010

Yahoo のリッチテキストメールと Mms.apk

以前 Gmailでの同様の問題に対応しました。
Yahooメールからのリッチテキストメールも文字化けするとTwitterで報告いただいたので調べました。


とりあえず、試しにiPhone宛に送ってみるとGmailのときと同様にまったく受信できませんでした。(異界送りになる)
これについてはSoftbankに報告したほうがいいかもしれません。
参考までに一般のメールアドレスに送ると、iso-2022-jpのHTMLになってますが、これはあまり参考になりません。(MMSはサーバで変換されるので)


さて、Yahooメールでリッチテキストメールを送ると、SoftbankのMMSサーバはShift_JISのHTMLメールとして端末へ送るようです。
Gmailのときと違い、ちゃんと文字コードが指定されているにもかかわらず、メッセージアプリでは文字化けしてしまいます。


いろいろ調べていると、frameworkのPduPersister(dbにメッセージを保存するクラス)がバグっておりました。
こいつは charsetを全く見ずに、バイトデータをDefault Encoding(UTF-8)のつもりでString化し、dbのTEXTフィールドにつっこんでます。
dbから読み取るときも同様に、UTF-8文字列としてバイトデータ化しています。
これを メッセージアプリは送られてきた元々のcharset情報により、Shift_JISのバイトデータとして複合しようとします。
まぁこんなことしてたら2バイトデータはぶっ壊れて文字化けします。


そんなわけで、手っ取り早く対応するにはShift_JISのHTMLパートをすててalternativeとしてくっついてるUTF-8のテキストパートを使う…
というのでもいいのですが、納得いかないのでAOSPにframeworkを修正するパッチを送りました。


Mms.apkではPersisterに渡る前にUTF-8に変換して、charset情報もUTF-8にしてしまうという手段を取りました。
これならframeworkの修正がなくても対応できます。
そもそも、Shift_JISのSoftbank絵文字はそのままUTF-8に変換できないので特別に変換関数を用意して自前で変換する必要があり、frameworkがなおっても必要なプロセスになります。
ともかく、これでHTML表現を維持しつつ文字化けが解消できました。


ついでに、Sense系ROMで報告いただいてるExceptionをできるかぎり潰したものを作りました。
テスト環境がないので動くかわかりませんが、お試しください。
ABSOLUTELY NO WARRANTY です。

ダウンロード (20100908)

21 comments:

Anonymous said...

HTC DESIREのsense ROM(PINKY DESIRE)で、やはりMms.apkが強制終了するみたいです。
Linuxとかのことはさっぱりわからないのでお役に立てないかもしれませんが、参考までにlogcatを長めにコピペしてみました。

http://pastebin.com/TcK4bx61

takuo said...

ありがとうございます。
このException回避を 20100908.01 で対処してみたのですが、これでもダメしょうか。

Anonymous said...

新しいのを見逃して試してました・・・すみません。
20100908.01のバージョンでは強制終了なく、送受信可能でした!
sense ROMでtakuoさんのMms.apkを使ってみたかったのですごく嬉しいです。
修正ありがとうございます。

k1777 said...

こんばんは。
早速試させて頂きましたところ、強制終了される事もなく送受信テストができています。
■環境
 ・ROM:Sense系「Roufianos-V6」
 ・MMSは「20100908.01」
 ・送受信相手はドコモとソフバンとPC
■MMSの入替は、先日の記事の通りadb shellにて実施
■実験状況
(1)ソフバン相手で電話番号MMSで本文+写真添付すると本文が消える。写真はOK。
(2)ドコモ相手に写真を添付すると、添付した画像ファイルが壊れてしまう。
(3)ソフバン、ドコモ共に添付ファイルの受信はOK。
(4)Yahoo!メールの場合、イタリック文字装飾は反映されず。文字色は反映された。

という状況です。私の利用状況ですと今回のアップデートで満足です。
参考に(2)の写真添付メールを送信した際のLogをアップさせて頂きます。
http://www.mediafire.com/?3bzvpq2q1qas043

takuo said...

みなさま、フィードバックありがとうございます。
まだ完璧といえる状態ではなさそうですが、とりあえず動いたようです。
いくつかログもいただいているのでもう少し調査してみます。

rdgate said...

gmailリッチテキスト絵文字無しの条件で文字化けするようです。(cm6版にて確認)
文字装飾有無には依存せず、絵文字有無で差異が見られました。
ご確認頂けたら幸いです。

takuo said...

rdgateさん

再現しませんでした。
当方でチェックしたのは
Gmailの設定でメール送信に使う文字列を
・デフォルト
・UTF-8
の双方による リッチテキスト で
・絵文字あり
・絵文字なし
です。4パターンすべてにおいて問題ありませんでした。

rdgate said...

ご確認ありがとうございます。不再現でしたか・・・

UTF-8送信にすれば文字化け解消しました。
当方ではデフォルトエンコードの絵文字無しのときだけ文字化けするようです。

ちなみにUTF-8で絵文字有り/無し&イタリック等のテキスト装飾有りメールを送ってみたところ
絵文字無し:テキスト装飾表現OK
絵文字有り:装飾部がアスタリスクで囲まれるだけ
という結果だったのですがこういう仕様でしょうか?

また、話が逸れるかもしれませんがYahooメールも「HTML表現を維持しつつ」とありますが、テキスト装飾無くplain textのままでした。

何か確認すべきところがあればよいのですが・・・
なお、当方環境は、cm6.0.1 stable for desire、mms-20100908-cm6です。

takuo said...
This comment has been removed by the author.
takuo said...

当方ではiPhoneの黒SIMで動作確認していますが、
もしかすると銀SIMだと違う情報が送られてきている可能性はありますね。

Gmailは絵文字を含んでいる場合HTML表現を維持するのは無理です。

Yahooメールでは絵文字の有無に関わらずHTML表現を維持できますが、20100908版をインストールした後に受信したものに限ります。

rdgate said...

コメントありがとうございます。
当方銀SIMでした。
とりあえず無理やり黒SIMのAPN,UAにして試してみましたが状況変わりませんでした。

その後デフォルトエンコード設定でいろいろ試してみたところ、

件名:テスト
本文:テスト
→文字化け

件名:test
本文:テスト
→文字化けせず

件名:test
本文:テストテスト
→文字化け

という面白い結果になってしまいました。(いずれも装飾無し、絵文字無し)
何度か試してみましたがこちらでは再現性有りです。

あとYahooメールについては、20100908版インストール後にテストしていますが、やはりイタリックやアンダーライン表現できていないですorz

takuo said...

Gmailの文字化けは再現して原因も特定できました。ありがとうございます。
件名:テスト
本文:テスト
で再現しました。
frameworkのバグに起因する文字化けなのでどうするかはこれから考えます。

Yahooのほうですが
http://takuo.jp/junk/temp/
にあるものをインストールして
adb logcatをみてもらえますでしょうか。

受信時に、
D/NotificationTransaction(29971): Charset: 106
D/NotificationTransaction(29971): Type: text/plain
D/NotificationTransaction(29971): Charset: 17
D/NotificationTransaction(29971): Type: text/html

のように出力されるのですがここの部分がわかればなんとかできるかもしれません。
出力されてなければ、別の箇所での問題なのでまた考えます。

rdgate said...

gmailの件、ありがとうございます。

Yahooメール受信時のlogcatは下記の通りです。
---
D/NotificationTransaction( 611): Content-Type: text/plain
D/NotificationTransaction( 611): Charset: 106
D/NotificationTransaction( 611): Content-Type: text/html
D/NotificationTransaction( 611): Charset: 17
---

takuo said...

お付き合いありがとうございます。

そうすると、そもそもHTML装飾がされてない気もします。
先程の場所に新しい版をアップしました。
これはHTML本文もログに出力されますので、同じように確認してください。

イタリック、ボールドはフォントの有無に左右されるので、色をつけてどうなるかみてもらえますでしょうか。
でもアンダーラインはフォントに依存しないはずなので考え違いかもしれませんが…。

ついでにGmailでの文字化けを対処してみましたので確認してみてください。

rdgate said...

色+アンダーラインでちゃんとHTMLはありますが相変わらず表示はplainです・・・
---
D/NotificationTransaction( 673): Content-Type: text/plain
D/NotificationTransaction( 673): Charset: 106
D/NotificationTransaction( 673): Content-Type: text/html
D/NotificationTransaction( 673): Charset: 17
D/dalvikvm( 673): GC_FOR_MALLOC freed 8986 objects / 466488 bytes in 52ms
D/dalvikvm( 673): GC_FOR_MALLOC freed 6623 objects / 261520 bytes in 51ms
D/dalvikvm( 673): GC_FOR_MALLOC freed 14145 objects / 557456 bytes in 51ms
D/NotificationTransaction( 673): Body: <span style="text-decoration: underline; color: rgb(255, 0, 0);">test</span>
D/NotificationTransaction( 673): <div style="line-height: 0; width: 0; height: 5px; clear: both;"> </div>
D/NotificationTransaction( 673): <p>
D/NotificationTransaction( 673):
D/NotificationTransaction( 673): <hr size=1><a href=http://pr.mail.yahoo.co.jp/gyao/ target="new">GyaO! - Anime, Dramas, Movies, and Music videos [FREE]</a><br>
---
(ここのコメントにSPANタグとか書けなかったので全角に変換しました)

gmailのほう、文字化け解消を確認しました。ありがとうございます。

takuo said...

CSSで表現されてますね。
これは修飾されないみたいです。

私の環境だと純粋なHTMLで送られてきています。bとかiとかのタグです。
Yahooの設定か、ブラウザで違うのかはわかりませんが…

CSSで送られてくるものはアプリではどうしようもないので対処できません。
webkit使うとか大掛かりな手段はありますが、まず無理です。

rdgate said...

ブラウザ依存だったようです。。
今までfirefoxを使っていましたが、IE8から送信したところテキスト装飾表現OKでした。

お忙しいところお時間割いていただきありがとうございました。

k1777 said...

こんばんは。
フライングで「update-mms-20100910-sense-froyo-signed.zip」を試させて頂きました。
Gmail、Yahoo!メールの文字装飾は問題なしでした。
残念ながらDoCoMo相手に写真付きメールを送ると写真データが壊れる現象は改善されずです。
Softbank相手に写真付きメールを送ると、写真は無事ですが、テキストが消え、smil.xmlが添付されます。これも9/8版と同じ状態です。
今更ですが、当方銀SIMでAPNはX06HTデフォ+mms-proxyをsmile、UAはiPhone という環境です。

takuo said...

おそらく、SBMが宛先や受信環境に応じて変換処理をしているのかと思いますが、
うまくいかない条件があるようですね。

PC宛やAndroid、iPhoneで受信するような条件では再現しないのでよくわかりません。

ponkan said...

ソフトバンクモバイルでHTC DesireのFroyo&MMS担当の
後藤誠二氏(@seijigo)にフィードバックしてみてはいかがでしょうか?
http://twitter.com/seijigo

セキュリティ上の理由などで微妙な反応に終わってしまうかもしれませんが
Takuo様とソフトバンクモバイル側双方に有益なやり取りが生じて
MMSに関する技術的困難が解消すればいいなと願います。

nokia6650 said...

official HTC FoYo ROM でandroid2.2にバージョンアップで動作は早くなりましたMMSですがつかわさせてもらってます。ありがとうございます。Wifiを使用中はMMSがうまく動作しないですね、Wifiを止めてから送受信すると普通に動作します。銀SIMを使用していますiPhone3GSのアンロック番でも同じ感じの現象がありましたね。銀SIMの仕様なのかもしれません。