02.BLEデバイスを検出する処理の作成
BLEデバイスを検出する処理を作成します。
検出されたBLEデバイスを、リスト表示します。
解説
BLEデバイスを検出するためにすべきことは、以下です。
- BluetoothAdapterオブジェクトを用いて、BluetoothLeScannerオブジェクトを取得します。
- BluetoothLeScannerオブジェクトを用いて、スキャンコールバックオブジェクトを指定して、startScan関数を呼び出し、スキャンを開始します。
- スキャンコールバックオブジェクトの定義にて、BLEデバイスが検出されるたびに呼ばれるonScanResult関数を定義し、ソフトウェア固有の処理(BLEデバイスリストに追加等)を行います。
上記以外に、今回やっていることは、以下です。
- 「メインアクティビティ」とは別に、「BLEデバイス検出アクティビティ」を用意します。
- 検出されたBLEデバイスを、リスト表示します。
(デバイスリストを保持するデバイスリストアダプタクラスを作成します。
デバイスリストアダプタオブジェクトを、リストビューにセットします。
検出されたBLEデバイスをデバイスリストアダプタオブジェクトのデバイスリストに追加します。
デバイスリストアダプタクラスでは、リスト表示時に呼ばれるgetView関数を定義します。) - 「BLEデバイス検出アクティビティ」が起動すると、自動で、「BLEデバイスの検出」を開始します。
(onResume関数で、startScan関数呼び出します) - 「BLEデバイスの検出」は、10秒すると検出処理を終了します。
(startScan関数での、mHandler.postDelayed関数呼び出します) - オプションメニューから「BLEデバイスの検出」の開始、終了を行えるようにします。
(onOptionsItemSelected関数で、startScan関数、stopScan関数を呼び出します) - 「BLEデバイス検出アクティビティ」で、デバイス名をタップすると、「BLEデバイス検出アクティビティ」は終了し、「メインアクティビティ」に戻り、デバイス名と、デバイスアドレスを表示します。
実装
プロジェクトを開く
01.で作成したプロジェクトを開きます。
デバイス検出結果表示アクティビティの作成
デバイスを検出した結果のデバイスリストを表示する「デバイスリストアクティビティ」を作成します。
「Project」ペインの「app > java > ドメイン.blecommunicator」を右クリックします。
右クリックメニュー「New > Activity > Empty Activity」を選択します。
「Activity Name」に「DeviceListActivity」と入力します。
「Finish」ボタンを押します。
しばらく待ちます。
ビルドの結果、エラー、警告がないことを確認します。
「AndroidManifest.xml」に、作成したアクティビティが追加されていることを確認します。
「Project」ペインの「app > manifests > AndroidManifest.xml」を開きます。
「application」ノードの下に、
が追加されています。
「AndroidManifest.xml」全体としては、以下のようになります。
文字列リソースの追加
必要な文字列定義を追加します。
「Project」ペインの「app > res > values > strings.xml」を開きます。
以下のメインアクティビティのメニュー用とラベル用の文字列、デバイスリストアクティビティのトースト用とメニュー用のの文字列の定義を追加します。
「strings.xml」全体としては、以下のようにします。
ファイルを上書き保存します。
メニューリソースの作成
メインアクティビティのメニューリソースと、デバイスリストアクティビティのメニューリソースを作成します。
「Project」ペインの「app > res」を右クリックします。
右クリックメニュー「New > Android resource file」を選択します。
「File name」に「activity_main」と入力します。
「Resource type」を「menu」にします。
「OK」ボタンを押します。
activity_main.xmlが作成されます。
「BLEデバイスを検出するアクティビティを呼び出すためのメニュー項目」を1つ定義します。
activity_main.xmlの内容を以下のようにします。
メインアクティビティのメニューができました。続けて、デバイスリストアクティビティのメニューを作成します。
「Project」ペインの「app > res > menu」を右クリックします。
右クリックメニュー「New > Menu resource file」を選択します。
「File name」に「activity_device_list」と入力します。
「OK」ボタンを押します。
activity_device_list.xmlが作成されます。
「BLEデバイスを検出中かどうかを表す状況表示用のメニュー項目」
「BLEデバイスの検出を開始するためのメニュー項目」
「BLEデバイスの検出を中断するためのメニュー項目」
都合3つのメニュー項目を定義します。
activity_device_list.xmlの内容を以下のようにします。
デバイスリストアクティビティのメニューができました。
レイアウトの編集
メインアクティビティのレイアウトと、デバイスリストアクティビティのレイアウトを編集します。
「Project」ペインの「app > res > layout > activity_device_list.xml」を開きます。
「BLEデバイスの検出結果を表示するListView」を1つ設置します。
activity_device_list.xmlの内容を以下のようにします。
デバイスリストアクティビティのレイアウトができました。
続けて、メインアクティビティのレイアウトを編集します。
「Project」ペインの「app > res > layout > activity_main.xml」を開きます。
ルートレイアウトを「LinearLayout」に変更します。
デバイス名と、デバイスアドレスを表示するためのTextViewを設置します。
activity_main.xmlの内容を以下のようにします。
メインアクティビティのレイアウトができました。
リストアイテムのレイアウトの作成
BLEデバイスの検出結果をリスト表示する際のリストアイテムのレイアウトを作成します。
「Project」ペインの「app > res > layout」を右クリックします。
右クリックメニュー「New > Layout resource file」を選択します。
「File name」に「listitem_device」と入力します。
「OK」ボタンを押します。
listitem_device.xmlが作成されます。
LinearLayoutのlayout_heightを、wrap_contentに変えます。
デバイス名と、デバイスアドレスを表示するためのTextViewを設置します。
listitem_device.xmlの内容を以下のようにします。
デバイスリストのリストアイテムのレイアウトができました。
状況表示用のレイアウトの作成
「BLEデバイスを検出中かどうかを表す状況表示用のメニュー項目」で使用する状況表示用のレイアウトを作成します。
「Project」ペインの「app > res > layout」を右クリックします。
右クリックメニュー「New > Layout resource file」を選択します。
「File name」に「actionbar_indeterminate_progress」と入力します。
「OK」ボタンを押します。
actionbar_indeterminate_progress.xmlが作成されます。
ルートレイアウトを「FrameLayout」に変更します。
状況表示を表示するためのProgressBarを設置します。
actionbar_indeterminate_progress.xmlの内容を以下のようにします。
状況表示用のレイアウトができました。
デバイスリストアダプタクラスの作成
BLEデバイスを検出した結果をリスト表示する際に使用する補助クラス「デバイスリストアダプタ」クラスを作成します。
「DeviceListActivity」クラスの先頭に、内部クラスとして「デバイスリストアダプタ」クラスを追加します。
「DeviceListActivity」クラス全体としては、以下のようにします。
「Cannot resolve symbol」エラーは、「Alt + Enter」で、必要なクラスをimportします。
リビルドし、エラー、警告がないことを確認します。
デバイスリストアクティビティクラスの定数宣言とメンバー変数の追加
デバイスリストアクティビティに、必要な定数宣言とメンバー変数宣言を追加します。
「DeviceListAdapter」クラスの直後、onCreate関数の前に、定数の宣言とメンバー変数の宣言、デバイススキャンコールバックの定義を追加します。
「Cannot resolve symbol」エラーは、「Alt + Enter」で、必要なクラスをimportします。
(「Handler」は、「android.os.Handler;」をimportします)
リビルドし、エラー、警告がないことを確認します。
デバイスリストアクティビティクラスのonCreate関数の編集
デバイスリストアクティビティのonCreate関数に、必要な処理を追加します。
アクティビティの戻り値の初期化、リストビューの設定、UIスレッド操作ハンドラの作成、Bluetoothアダプタの取得、の処理を追加します。
onCreate関数を、以下のようにします。
デバイスリストアクティビティクラスにリストビューのクリックリスナーの追加
リストビューのクリックリスナーを実装するために、デバイスリストアクティビティクラスに「implements AdapterView.OnItemClickListener」を追加します。
リストビューのクリックリスナーを実装します。
「DeviceListActivity」クラスの末尾に、以下を追加します。
デバイスリストアクティビティクラスへのonResume関数、onPause関数、関連関数の追加
デバイスリストアクティビティに、「初回表示時、および、ポーズからの復帰時」に呼ばれる関数である onResume関数と、「別のアクティビティ(か別のアプリ)に移行したことで、バックグラウンドに追いやられた時」に呼ばれる関数である
onPause関数を追加します。
onResume関数、onPause関数で必要な関数も追加します。
「DeviceListActivity」クラスのonCreate関数の直後に、以下を追加します。
「Cannot resolve symbol」エラーは、「Alt + Enter」で、必要なクラスをimportします。
リビルドし、エラー、警告がないことを確認します。
デバイスリストアクティビティクラスへのメニュー関連関数の追加
デバイスリストアクティビティに、メニュー関連を追加します。
「DeviceListActivity」クラスの末尾に、以下を追加します。
「Cannot resolve symbol」エラーは、「Alt + Enter」で、必要なクラスをimportします。
リビルドし、エラー、警告がないことを確認します。
メインアクティビティクラスのメンバー変数の追加
メインアクティビティに、必要な定数宣言とメンバー変数宣言を追加します。
デバイスリフトアクティビティに移行する際に使用する「デバイス接続要求の識別コード」定数の宣言と、デバイスアドレス変数の宣言を追加します。
「MainActivity」クラスの定数、変数の宣言を以下のようにします。
「Cannot resolve symbol」エラーは、「Alt + Enter」で、必要なクラスをimportします。
リビルドし、エラー、警告がないことを確認します。
メインアクティビティクラスへのメニュー関連関数の追加
メインアクティビティクラスに、メニュー関連を追加します。
「MainActivity」クラスの末尾に、以下を追加します。
「Cannot resolve symbol」エラーは、「Alt + Enter」で、必要なクラスをimportします。
リビルドし、エラー、警告がないことを確認します。
メインアクティビティクラスのonActivityResult関数の編集
メインアクティビティクラスのonActivityResult関数に、必要な処理を追加します。
デバイスリストアクティビティから復帰したときの処理を追加します。
onActivityResult関数を、以下のようにします。
「Cannot resolve symbol」エラーは、「Alt + Enter」で、必要なクラスをimportします。
リビルドし、エラー、警告がないことを確認します。
実行
BLEモジュールの準備。
「フィジカルコンピューティング > RN4020 > Arduinoからのキャラクタリスティックの値の書き込み」に従い、BLEモジュールを準備しておきます。
Android端末にて、動作確認。
ソフト起動後の画面。
右上の「検出」アイコンをタップすると、「BLEデバイス検出アクティビティ」に移行します。
検出されたBLEデバイスの名前をタップすると、「メインアクティビティ」に戻ります。
「Device Name」欄と「Device Addres」欄に、BLEデバイスの名前とアドレスが表示されます。
ダウンロード
サンプルプロジェクト
(github.com上のダウンロードページ)
関連ページ
前項目:01.BLE通信が可能か確認する処理を作る
次項目:03.BLEデバイスとの接続・切断の処理を作る