Google HangoutsでSoftBankのMMSを送受信する
何かと面倒くさいAndroid+SoftBank MMSですが、Google HangoutsでもMMSを送受信できたのでメモ代わりに書いておきます。
あくまで検証なので動作保証はありません。また、何をやっているか分からない方はやめといた方が良いです。ご自分で試される際は自己責任で:-p
検証環境
- HTC One (m7ul/n801)
- SoftBank nano SIM
- CyanogenMod 11 SNAPSHOT M3(cm-11-20140210-SNAPSHOT-M3)
- Google Hangouts 2.0.303(1004807-30)
- Windows XP+cygwin
- JRE 7u51
- apktool 2.0.0b9:http://code.google.com/p/android-apktool/
概要
- 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文字列を取得しているだけ
- TelephonyManagerのソースを参照。キーは"com.android.internal.R.string.config_mms_user_agent"
- UAProfileも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チェックで弾かれます。