ハッシュタグ「#WX04SH」を見たら気になる発言が。
@jorte_jp うぬぬ、ジョルテ Version 1.6.5 も「ネットワークに接続されていません。」と言っておる。PHS 接続を「接続なし」として処理するアプリは意外に多いのかも。 #WX04SH
— Nagae Hidetake (@NagaeHidetake) 2013, 10月 9
そういえば自分も「PHSのW-OAM通信でUstreamはどれだけ見られるのか」をテストしようとして失敗していた。
では、果たしてAndroidのAPIセットでこの端末が「PHS通信をしているかどうか」を判別することは出来るのだろうか?と思ってちょっと調べてたのでメモメモ。
結論(いきなり)
結論から言うと、「たぶんできない」。
実際にはたぶん不可能ではないのですが、やるにはAQUOS PHONE es(WX04SH)独自の非公開APIを呼び出して確認を行う必要がある。実際にそこまでを広くAndroid向けに公開しているアプリに期待するのはおよそ現実的ではないと思うし、たぶんいつまで経っても対応アプリが出てくることはないでしょう。仮に今後PHS通信対応のAndroid端末がWILLCOMから出たとしても・・・。
では、前述のような問題はなぜ出るのか、というと、「PHS通信を行っている」という状態は、APIから見ると「データ通信を一切行っていない」状態になるから。
うーん。まさかと思って調べてみたけどAndroidのAPIセットには「PHS通信」という状態が存在しない。端末としては「ソフトバンク3G端末扱い」になり、TelephonyManagerのDataActivityの値は3G通信の値に依存する。 #WX04SH
— 高見ちえたん[14] (@TakamiChie) 2013, 10月 9
Androidでは、Wi-Fiに在圏していないときに、携帯電話網に繋がっているかどうかを確認するには、TelephonyManagerというクラスを使います。
これは、各種getXXX()メソッドでインターネット接続状態を確認したり、監視することが出来るメソッドを実装しているAPI。ここで見ると、WX04SHは「ソフトバンクの3G端末」という扱いになります。PHS通信については完全に「TelephonyManagerからは見えない」状態。
「PHS通信のみ」で通信をしていると、DataActivityの値は「DATA_ACTIVITY_NONE」DataStateの値は「DATA_DISCONNECTED」となる。
よってAPIをマジメに使うと、PHS通信中は「ネットワークに接続していない」扱いに #WX04SH
— 高見ちえたん[14] (@TakamiChie) 2013, 10月 9
PHS通信を行っているとき、公開APIで取得出来る値を見ると、一見「Wi-Fiネットワークにも3Gネットワークにも繋がっていない」状態となります。そのため、この時点でマジメにネットワーク状態を見て警告を表示するようなアプリは「データ通信ができない状態」と判断して処理を中断してしまいます。
で、この状態ではアプリは動かせないのか
もちろんインターネット通信が出来ないわけではなく、ネットワーク接続系のAPIをたたけばおそらくすんなり動く状態です。PHS通信は400kbpsと動作こそ遅いですが、遅延が少ないので案外まともに動きます。少なくともTwitterやfoursquare程度であればそれほどストレスなく使えるレベル。
なので「データ通信の状態を気にする前に、とりあえず通信してみて上手くいったから問題ない」として動作するようなアプリは、これでも問題なく動きます。
ただ、もちろんそうでないアプリも多いので、そういう「データ通信状態を先に確認してから通信をする」ようなアプリは全滅 ということになります。
影響しているアプリ
とりあえず自分が見た限りでは、以下のアプリが対象
- Ustream(起動はするが、動画が見られない・配信が出来ない)
- ジョルテ(同期が出来ない)
- Play ミュージック(オフライン扱いとなり、端末にキャッシュされてない曲が聴けない)
- Yahoo音声アシスト(音声認識に失敗する)
逆に、以下のアプリは確認したところ問題なし
- ブラウザ(オフラインキャッシュを見てしまう場合があるかも)
- WeatherNow
- Evernote(同期も出来る)
- Dropbox
- Sugarsync
- Playストア
- Amazon apps
- Amazonアプリ
- foursquare
- TwitCasting
今のところ動かないほうがどちらかというと少ない。
アプリの問題なのか?
アプリについて、どっちの実装が良いのか?というのは、個人的にはどうとも言えません。
「通信の状態を見ずにとりあえずネットワーク通信しようとする」と、このように変則的な接続方法には対応出来ますが、その代わり「本当にネットワークに繋がっていない」ことを確認するのに時間がかかってしまいます。
「通信の状態を見て処理を分ける」ようにすれば少なくとも今までは上手くいっていたわけで、むしろどちらかというと問題に対処すべきは「アプリよりもWX04SH自体」という気がしないでもないです(まあ、配信中チャンネルリストの取得は出来て、動画の閲覧が出来ないというUstreamの不可解な動作は、それはそれでなんとかした方がいいんじゃないの? な気はしますが)。
対応するとしたらどうする?
本件アプリ側の個別対応というのはおよそ期待出来ない。
期待すべきは端末側の対応だなあ。例えばTelephonyManager#getDataActivity(),#getDataState()がPHS通信の状態も見てくれれば問題は解消する。ただインパクトでかそう。 #WX04SH
— 高見ちえたん[14] (@TakamiChie) 2013, 10月 9
というわけで、TelephonyManagerで「3G通信はしていないけど3G通信しているかのように見せる」必要がありそう。
なにしろ「PHSデータ通信が出来る端末」というのは今までのAndroidフレームワーク上想定されていなかった状態なわけで・・・(見落としでなければ「PHS在圏である」という状態を示す定数も存在しない)。
ただ、「3G通信してないのになぜか3G通信してることになってる」ということになるので、なんだか副作用が大きそうです。PHSデータ通信がすごくまともになる代わりに端末が不安定になったりしたらいやだなあ。
いまアプリ作者が出来ることは
とりあえず、「データ通信が出来るかどうかというチェックをしない」ことしかない。データ通信出来るかどうかの値にかかわらず、「とりあえず通信してみて上手く出来たら通信出来るものとみなす」ということ。
もちろん、「WX04SHに対応する」ことを目的としてやるのなら、WX04SHの独自非公開APIを使うという手もありますが、現実性はたぶんない。
なんとなく不安定な方法ではありそうですが、ひとまずこのへんしかないのかなあ。
今後アプリ作者が考えるべきことは
カオスなAndroid。このような実装でも互換性テストを通過してしまうのだし、いくらでも変態実装の端末はあり得ます(ナビゲーションバーを隠してしばらく操作ができるような端末だって認可されるくらいだし)。
まあ、できるのは「情報収集は忘れずに」ということと、「設定値や○○Managerの値はあまり信用せずに出来るなら別の方法を試す」くらいでしょうか…。
ただ、今回のことは運用対処で済ませればそれで良いとかそういうレベルの問題ではなさそうですし、落ち着き次第しかるべき方法で報告してみようかなあ と思います。忘れてなければ、ですが。
たまには、開発日誌らしきことを書いてみたり。