このページについて
このページはサンプルアプリを利用、並びに改造するための情報を提供します。java言語やAndroid開発について基本的な知識をお持ちの方を前提に記述しています。
スマートリモコンの外観や仕様についてはこちらのページを参照してください。
ダウンロード
===【動作環境】===
サンプルアプリのソースはEclipse3 + Android SDK がインストールされている環境を想定しています。Android Version2.3.3 (API LEVEL 10)以上でないと動きません。また実機(タブレット端末を推奨)が必要です。
(USBケーブルと実機に対応したドライバが有ればUSBを介してダウンロード、実行できます)
携帯端末ではボタンが全て表示されない場合があります。その場合にはレイアウトファイル(main.xml)を改造してください。
サンプルアプリの使用法
開発環境を利用して行う場合
- サンプルアプリソースをダウンロードして解凍します。
- Eclipseを起動してワークスペースを解凍先ディレクトリに設定します。
(上手く構築できない場合には新たにAndroidプロジェクトをEclipse上で作成して手動でソース、並びにリソース(res)を解凍したファイルの中からコピー&ペーストして作成してください) - Eclipseではソースは自動でビルドされます。
- プログラム本体は「RemoteControl.apk」と言う名前です。
- プログラム本体をUSBを経由してインストールするか、Web上にアップロードしてブラウザを利用してダウンロード&インストールします。
- プログラムを実行します
ソース解説
ツリー構成
/ -------------- プロジェクトルート
|
|-- AndroidManifest.xml マニフェスト
|-- .project プロジェクトファイル
|-- .classpath クラス階層
|-- assets
|
|-- bin コンパイル後のバイナリ格納(自動生成)
|
|-- gen コンパイル後のリソースバイナリ格納(自動生成)
|
|-- res リソースファイル群(表示文字などのリソース)
|
|-- src
|
|-- jp
|
|-- systec
|
|-- android
|
|-- RemoteControl
|
|-- RemoteControl.java --- メインウィンドウ
|
|-- DeviceListActivity.java --- 機器接続ダイアログウィンドウ
|
|-- FileReadWrite.java --- 主にストレージの読み書きを処理
|
|-- RemoteControlService.java --- デバイスとの通信処理
各ファイルの機能
- RemoteControl.java:メイン処理、ユーザーインターフェイスを担当
- DeviceListActivity.java:BlueToothペアリング処理を担当
- FileReadWrite.java:学習したデータの読み書きを担当
- RemoteControlService.java:BlueToothデバイスとの通信処理
処理流れ
大まかな流れと処理担当部分は以下の通りです。
操作 呼び出される関数 備考
起動 RemoteControl::OnCreate --- 初期化
↓ この時に外部ストレージがあるかどうかを判別します
↓ 存在する場合には、タイトルの右に(*)マークが付きます
↓
↓ RemoteControl::OnStart --- 既存ペアリングデバイスの検出と確認ダイアログ表示
↓
↓ 「はい」でデバイス接続後通常起動
↓ 「いいえ」で接続しないで通常起動
↓
↓
接続 RemoteControl::connectExistingDevice --- 接続処理
↓
↓
↓← ※1
↓
↓
学習モード切り替え (オプションメニュー→モード切替)
↓
↓
(学習) (該当ボタンをタッチ)
↓ RemoteControl::button_event()
↓ RemoteControl::button_event2()
↓ |
↓ sendMessage() ---- 学習コマンド送信ご待機状態
↓
(リモコンボタン押下)
(コマンド受信)RemoteControl::mHandler
↓ |
↓ |
↓ handleMessage(Message msg) --- ここでデバイスから読み込み処理を実施
↓ | 同時に外部ストレージにデータを保存処理
↓ |(MESSAGE_READ)
↓ data2ExtStrage() --- 学習データをストレージに保存(外部、内部は自動判定されます)
↓
↓
赤外線送信 RemoteControl::button_event(), RemoteControl::button_event2()
↓ |
↓ |
↓ sendMessage() --- ここでストレージから保存したデータを
↓ 読み出して送信
↓ 学習されていないボタンを実行すると
↓ 「学習されていないボタンがタッチされました」メッセージが出ます。
↓
↓
↓ いいえ
(終了?)→→→→→ ※1
↓はい
↓
↓
終了 RemoteControl::onDestroy() --- 接続の切断
レジューム状態に入り、復帰したときには※1の状態になります。
通常はこのモードで操作します
新たに学習させたいときにはこのモードで操作します
ボタン対応表(既定)
ボタン変数 | キャプション | 保存ファイル名 |
---|---|---|
mButton1 | 地デジ | data2_1 |
mButton2 | BS | data2_2 |
mButton3 | CS | data2_3 |
mButton4 | 未使用 | data2_5 |
mButton5 | 未使用 | data2_5 |
mButton6 | 番組表 | data2_6 |
mButton7 | 未使用 | data2_7 |
mButton8 | メニュー | data2_8 |
mButton9 | (青) | data2_9 |
mButton10 | (赤) | data2_10 |
mButton11 | (緑) | data2_11 |
mButton12 | (黄) | data2_12 |
mButton13 | 1 | data2_13 |
mButton14 | 2 | data2_14 |
mButton15 | 3 | data2_15 |
mButton16 | CH+ | data2_16 |
mButton17 | 音声+ | data2_17 |
mButton18 | 未使用 | data2_18 |
mButton19 | (上) | data2_19 |
mButton20 | 未使用 | data2_20 |
mButton21 | (先頭) | data2_21 |
mButton22 | ≪ | data2_22 |
mButton23 | ≫ | data2_23 |
mButton24 | (末尾) | data2_24 |
mButton25 | 4 | data2_25 |
mButton26 | 5 | data2_26 |
mButton27 | 6 | data2_27 |
mButton28 | CH- | data2_28 |
mButton29 | 音声- | data2_29 |
mButton30 | < | data2_30 |
mButton31 | 決定 | data2_31 |
mButton32 | > | data2_32 |
mButton33 | (巻き戻し) | data2_33 |
mButton34 | (再生) | data2_34 |
mButton35 | 未使用 | data2_35 |
mButton36 | (早送り) | data2_36 |
mButton37 | 7 | data2_37 |
mButton38 | 8 | data2_38 |
mButton39 | 9 | data2_39 |
mButton40 | 未使用 | data2_40 |
mButton41 | 未使用 | data2_41 |
mButton42 | 未使用 | data2_42 |
mButton43 | (下) | data2_43 |
mButton44 | 未使用 | data2_44 |
mButton45 | (録音) | data2_45 |
mButton46 | (停止) | data2_46 |
mButton47 | 未使用 | data2_47 |
mButton48 | (一時停止) | data2_48 |
mButton49 | 10 | data2_49 |
mButton50 | 11 | data2_50 |
mButton51 | 12 | data2_51 |
mButton52 | 入力 | data2_52 |
mButton53 | 消音 | data2_53 |
mButton54 | 戻る | data2_54 |
mButton55 | 未使用 | data2_55 |
mButton56 | 終了 | data2_56 |
mButton57 | 予備1 | data2_57 |
mButton58 | 予備2 | data2_58 |
mButton59 | 予備3 | data2_59 |
mButton60 | 電源 | data2_60 |
変数名やファイル名などはソースを変更することにより自由に変えることができます。
ファイルの保存先ディレクトリは通常、/mnt/sdcard/Android/data/(プロジェクト名)/files です(端末によって異なります)
改造について
改造について
●サンプルソースは自由に改変してかまいません(改造後のソースを非公開も可です)
●このサンプルでは音声などの調整などボタンの継続押し(押しっぱなしによる連続コマンド送信)には対応していません。
●短い間の連続タップ(ダブルクリック、トリプルクリックなど)操作を行うとリモコンが追従しないことがあります。
その場合には マクロ定数 INHIBIT_TIME をお使いのアンドロイド端末にあわせて調整してください。
●この機能が不要な場合にはボタンイベント処理部分(button_event(),button_event2())の次の文を削除してください。
inObj.setEnabled(false); //無効にする
if(mTimer == null){
//タイマーの初期化処理
timerTask = new ButtonTimerTask();
mTimer = new Timer(true);
mTimer.schedule( timerTask, INHIBIT_TIME);
if(D){Log.d(TAG, "button_event() --- Timer is Enabled.");}
}
●学習したリモコンデータは内部、または外部ストレージに保存されますが、Android端末によってはアプリをアンインストールするとデータが削除される場合もありますので、アンインストールする場合には外部のSDカード等にバックアップをとっておくと安心です。(外部メディアがあるかどうかは RemoteControl.java isExternalStorageAvailable() で行っています)
外部のSDカードを直接指定して保存したい場合には、onCreate() 内、mExternalDirectory に SDカードのディレクトリを指定してください。(指定例: mExternalDirectory ="/mnt/sdcard")
画面のレイアウト(ボタンサイズを変更など)は main.xml を変更してください。
画面下部の送受信データウィンドウにデータを表示したくない場合には DWIN 変数を false にしてください。(既定ではfalseに設定)
●この他の処理についてはソース内コメントを見てください。