Do You PHP はてブロ

Do You PHPはてなからはてブロに移動しました

Google HangoutsでSoftBankのMMSを送受信する

何かと面倒くさいAndroidSoftBank MMSですが、Google HangoutsでもMMSを送受信できたのでメモ代わりに書いておきます。
あくまで検証なので動作保証はありません。また、何をやっているか分からない方はやめといた方が良いです。ご自分で試される際は自己責任で:-p

検証環境

概要

  • SoftBankのMMS網は、クライアントアプリのUser-Agentでアクセス制限をしている(らしい)
  • Google HangoutsのUser-Agentは当然上記にマッチしないので接続自体不可
  • 調べてみると、Google HangoutsのUser-Agentは、Android API Level 19から導入されたandroid.telephony.TelephonyManager#getMmsUserAgentを使っているっぽい
  • android.telephony.TelephonyManager#getMmsUserAgent自体はリソースからUser-Agent文字列を取得しているだけ
  • リソースはframework-res.apkに含まれているので、apktoolを使って一度バラしてUser-Agentなどを書き直し、再度framework-res.apkをbuildしてオリジナルと差し替える

手順

端末をリカバリモードで再起動し、USB接続後cygwinから以下の様な感じで。

$ export PATH=/path/to/jre7/bin:/path/to/android-sdk-windows/build-tools/19.0.0/:$PATH
$ 
$ adb shell mount -a
$ 
$ # fetch framework-res.apk
$ adb pull /system/framework/framework-res.apk
$ 
$ # backup
$ \cp -pf framework-res.apk framework-res.apk_
$ java -jar apktool_2.0.0b9.jar d -advance framework-res.apk 
$ 
$ # modify user-agent, uaprofile in resources
$ cp -p framework-res/res/values/strings.xml strings.org.xml
$ perl -i -p -s -e 's#http://www.google.com/oha/rdf/ua-profile-kila.xml#http://www.apple.com/mms/uaprof.rdf#g' framework-res/res/values/strings.xml
$ perl -i -p -s -e 's#<string name="config_mms_user_agent">CyanogenMod</string>#<string name="config_mms_user_agent">iPhoneOS/3.0 (7A341)</string>#g' framework-res/res/values/strings.xml
$ find . -iname \*.bak -delete
$ 
$ # install as 127.apk
$ java -jar apktool_2.0.0b9.jar if framework-res.apk_
$ 
$ # build framework-res.apk
$ java -jar apktool_2.0.0b9.jar b -advance framework-res 
$ 
$ # update resources.arsc only
$ cp -p framework-res/build/apk/resources.arsc .
$ 7z u -tzip -mx0 framework-res.apk resources.arsc
$ 
$ # push framework-res.apk
$ adb push framework-res.apk /system/framework/framework-res.apk
$ adb shell chmod 644 /system/framework/framework-res.apk
$ 

あとは端末を再起動し、HangoutsからMMSを送受信してみる。logcatで以下のような感じになっていれば多分大丈夫。

$ adb logcat | grep MmsConfig
V/MmsConfig( 3219): mnc/mcc: 44020
V/MmsConfig( 3219): tag: bool value: enabledMMS - true
V/MmsConfig( 3219): tag: int value: maxMessageSize - 307200
V/MmsConfig( 3219): tag: int value: maxImageHeight - 1944
V/MmsConfig( 3219): tag: int value: maxImageWidth - 2592
V/MmsConfig( 3219): tag: int value: defaultSMSMessagesPerThread - 10000
V/MmsConfig( 3219): tag: int value: defaultMMSMessagesPerThread - 1000
V/MmsConfig( 3219): tag: int value: minMessageCountPerThread - 10
V/MmsConfig( 3219): tag: int value: maxMessageCountPerThread - 5000
V/MmsConfig( 3219): tag: string value: uaProfUrl - http://www.apple.com/mms/uaprof.rdf
V/MmsConfig( 3219): tag: int value: recipientLimit - -1
V/MmsConfig( 3219): tag: bool value: enableMultipartSMS - true
V/MmsConfig( 3219): tag: bool value: enableSplitSMS - false
V/MmsConfig( 3219): tag: int value: smsToMmsTextThreshold - -1
V/MmsConfig( 3219): tag: bool value: enableSlideDuration - true
V/MmsConfig( 3219): tag: int value: maxMessageTextSize - -1
V/MmsConfig( 3219): tag: string value: userAgent - iPhoneOS/3.0 (7A341)||<
            :
$ 

その他

  • TelephonyManagerが返す値そのものを変更しているので、どこに影響が出るかは未検証;-)
  • 仕組み上、Hangoutsのstrings.xmlを書き直しても良いと思うんだけど、OS起動時のapkチェックで弾かれます。