スキップしてメイン コンテンツに移動

Android 端末をサーバーにする(ServerSocket)

所有しているAndroid端末が8台になりました・・・・
メールが来るたびに全部の端末が通知音を鳴らすのでうるさくて困ってます。

これを解決したい!

<------------------------>
試しに作りました。
http://www.youtube.com/watch?v=Zf2MzMLekeg&feature=youtube_gdata_player

<------------------------>




1台以外はサイレントモードにしておけばいいんですが、使っているうちに音量を上げてしまっています。

大きな問題でもないんですが、寝ている時に音がなると鬱陶しいので全部の端末を簡単にサイレントにしたいんです。

以前作ったアプリ(音量設定cVolume)はスケジュール機能があるので、決まった時間になると音量を自動で設定します。これで十分満足はしてます。

これは決まった時間になったら・・・しかもすべての端末に設定をしなければいけません。
面倒です。

ということで、1台の端末から全部の端末を制御してしまおうと思いました。

今回作ろうとしているものは電池消費が激しくなるとおもわれるのでマーケットへは公開しません。
「ただ作りたい」それだけです。

受け側(音量を設定される側)と送り側(音量操作をする側)に分けてアプリを作ります。実際はひとつのアプリで完結させます。

受け側7台をServerSocket を使って待機します。送り側1台で無線LAN内にある端末を検索してSocketを使って各端末に音量設定命令を送ります。受け側は命令受信、音量設定完了のメッセージを送り側に返信します。

これだけです。

ServerSocket

bind するポートは 8080 です。ドキュメントに書かれているのかどうかわかりませんが、このポート以外はバインドできませんでした。


IPアドレスを検索する

無線LAN内にある端末の検索は ping を送信して応答があったIPアドレスのリストを作成します。ソケット接続で応答があるものを残します。
IP アドレスはよく変わるので保存しません。所有している端末数はわかっているので検索に余分な時間がかからないように工夫します。さらに、無線LAN機器とかPCとかの台数もあるので考慮します。


受け側

接続待機をするための設定画面を用意します。
サービスを起動、終了するための画面を想定しています。
リブート対応やサービスの生死確認程度をします。
設定画面以外は不要だと思います。通知を出しておくかどうかは後ほど検討します。
マーケットに出さないから通知はいいかも?送り側に設定状況のデータを送ることができればいいし

送り側画面

端末リスト画面
受け側端末の現在の音量状況表示画面
送信用データ作成(音量設定)画面
接続中ダイアログ、送信中ダイアログ、送信完了ダイアログ

ここまで必要ないかもしれませんね

ついでに、着信音を再生させる機能をつければ・・・
端末どこにある?で探しやすいかも?何かの真似です。


今回からしばらくは技術調査記事を書こうと思います。

+1 を押してもらえば記事を書く速度が早くなるので是非おしてください。

+1 の数で作業の優先順位を決めてたりします(笑





コメント

このブログの人気の投稿

Android ロックアプリを作る -調査編 -

Android 端末のスクリーンがOFFになると端末がロックされて、
スクリーンがONになるとロック画面が表示されます。

ロック画面は指の軌跡かパスワードを入力することで解除できます。

このロック画面をアプリとして作ってみたいと思い調査を始めることにしました。

調査の方針としては


色々なロックアプリをダウンロードしてみる。それぞれのパーミッションを見てみる。

という感じです。


色々なアプリをダウンロードしてみる。

まずはロックアプリ特集とかを探してみます。

Google 先生に聞いてみよう > Android ロックアプリ
結構出てきますね。


WidgetLocker LockscreenLockBot ProFロックスクリーン



それぞれのパーミッションを見てみる。

WidgetLocker Lockscreen



android.permission.VIBRATEandroid.permission.DISABLE_KEYGUARDandroid.permission.RECEIVE_BOOT_COMPLETEDandroid.permission.EXPAND_STATUS_BARandroid.permission.GET_TASKSandroid.permission.REORDER_TASKSandroid.permission.SET_PREFERRED_APPLICATIONSandroid.permission.WRITE_SETTINGSandroid.permission.WAKE_LOCKandroid.permission.CALL_PHONEandroid.permission.READ_SYNC_SETTINGSandroid.permission.GET_ACCOUNTSandroid.permission.READ_LOGSandroid.permission.SYSTEM_ALERT_WINDOWandroid.permission.WRITE_EXTERNAL_STORAGEandroid.permission.INTERNETandroid.permission.ACCESS_NETWORK_STATEandroid.permission.ACCESS_WIFI_STATEcom.android.vending.CHECK_LICENSE
LockB…

携帯電話、タブレットの判定にピクセルではなくインチを使う

色々な案件に関わっていると、スマートフォンなのかタブレットなのかの判定をするためにピクセルを使用しているソースを見ることが多くあります。

幅、高さのそれぞれのピクセル数がある値を超えたらタブレットと判定する。


これはだめですよね

HTC j butterfly  はタブレットと判定されることが多くあります。




ディスプレイは約5インチ
w x h : 1080px x 1920px

5インチなので画面サイズが大きいということでタブレットという判定でもいいかもしれない・・・と思ったりしますが7インチ以上をタブレットと判定したい。。。




ピクセル数は画面のサイズ(インチ)とは違います。1080px x 1920px は5インチであるとは限りません。

i9220++ スマートフォン Android 4.0 3G GPS 5.2 インチ800万画素携帯(ブラック)

5.2インチ 画面解像度:960 x 540 pixels QHD screen


HTC j butterfly よりも画面サイズ(インチ)は大きいけれど、ピクセル数は少なくなってます。


ピクセル数で判定するのではなく、インチで判定したほうが正確ですね。



プログラムで画面サイズ(インチ)を計算してみましょう。

ディスプレイ情報を取得する ピクセル数(width, height)を取得するdpi (xdpi, ydpi) を取得する1インチあたりのピクセル数(dot per inch なのでドット数?) インチ(width, height) を計算する画面サイズ(インチ)を計算する
こんな流れになります。他に簡単に取得できる方法があれば教えていただけるとうれしいです。

Activity#onCreateに書きました

// ディスプレイ情報を取得する
final DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);

// ピクセル数(width, height)を取得する
final int widthPx = metrics.widthPixels;
final int heightPx = metrics.heightPixels;

// dpi (xdpi, yd…

Mac の ターミナルから アプリをアンインストールする adb uninstall

ant uninstall でもいいんだけれど、ant プロジェクトじゃないこともあるのでメモ

adb uninstall パッケージ名
cVolume next をターミナルからアンインストールする場合
パッケージ名は jp.caldroid.cvolume40 なので

adb uninstall jp.caldroid.cvolume40
となる