03.Bluetoothデバイスとの接続・切断の処理を作る
Bluetoothデバイスと接続する処理、Bluetoothデバイスとの接続を切断する処理を作成します。
解説
Bluetoothデバイスと接続するためにすべきことは、以下です。
- BluetoothAdapterオブジェクトを用いて、Bluetoothデバイスのオブジェクトを取得します。
(BluetoothDevice device = mBluetoothAdapter.getRemoteDevice( mDeviceAddress );)) - 取得したBluetoothデバイスオブジェクトを用いて、Bluetoothソケットオブジェクトを作成します。
(mBluetoothSocket = bluetoothdevice.createRfcommSocketToServiceRecord( UUID_SPP );) - 作成したBluetoothソケットオブジェクトを用いて、Bluetoothデバイスとの接続を試みます。
(mBluetoothSocket.connect();)
Bluetoothデバイスと切断するためにすべきことは、以下です。
- 作成したBluetoothソケットオブジェクトを閉じます。
(mBluetoothSocket.close();)
上記以外に、今回やっていることは、以下です。
- Bluetoothデバイスと通信する際に使用する処理をまとめた補助クラス「Bluetoothサービス」クラスを作成します。
- 「Connect」ボタンで接続、「Disconnect」ボタンで接続を切断します。
(onClick関数において、「Connect」ボタンの場合は、connect関数を呼び出します。「Disconnect」ボタンの場合は、disconnect関数を呼び出します。) - 「Bluetoothデバイス検出アクティビティ」から戻ってきた際には、自動で内部的に「Connect」ボタンをクリックします。
(onResume関数で、「Connect」ボタンオブジェクトのcallOnClick関数を呼び出します)
実装
プロジェクトを開く
02.で作成したプロジェクトを開きます。
文字列リソースの追加
必要な文字列定義を追加します。
「Project」ペインの「app > res > values > strings.xml」を開きます。
「Connect」ボタン用の文字列の定義と、「Disconnect」ボタン用の文字列の定義を追加します。
「strings.xml」全体としては、以下のようにします。
ファイルを上書き保存します。
レイアウトの編集
メインアクティビティのレイアウトを編集します。
「Project」ペインの「app > res > layout > activity_main.xml」を開きます。
デバイス名と、デバイスアドレスを表示するためのTextViewの下に、「Connect」ボタンと「Disconect」ボタンを設置します。
activity_main.xmlの内容を以下のようにします。
Bluetooth通信サービスクラスの作成
Bluetoothデバイスと通信する際に使用する補助クラス「Bluetoothサービス」クラスを作成します。
「MainActivity」クラスの先頭に、内部クラスとして「Bluetoothサービス」クラスを追加します。
「Cannot resolve symbol」エラーは、「Alt + Enter」で、必要なクラスをimportします。
(「Handler」は、「android.os.Handler;」をimportします)
リビルドし、エラー、警告がないことを確認します。
メインアクティビティクラスのメンバー変数の追加
メインアクティビティに、必要な定数宣言とメンバー変数宣言を追加します。
BluetoothServiceオブジェクト、「Connect」ボタンオブジェクト、「Disconnect」ボタンオブジェクトの変数宣言を追加します。
「BluetoothService」クラスの直後、onCreate関数の前の、定数、変数の宣言を、以下のようにします。
「Cannot resolve symbol」エラーは、「Alt + Enter」で、必要なクラスをimportします。
リビルドし、エラー、警告がないことを確認します。
メインアクティビティクラスのonCreate関数の編集
メインアクティビティのonCreate関数に、必要な処理を追加します。
「Connect」ボタン、「Disconnect」ボタンの取得とクリックリスナーの設定の処理を追加します。
onCreate関数を、以下のようにします。
メインアクティビティクラスにボタンのクリックリスナーの追加
ボタンのクリックリスナーを実装するために、メインアクティビティクラスに「implements View.OnClickListener」を追加します。
ボタンのクリックリスナーを実装します。
「MainActivity」クラスの末尾に、以下を追加します。
メインアクティビティクラスに接続・切断の関数の追加
接続・切断の関数を追加します。
「MainActivity」クラスの末尾に、以下を追加します。
メインアクティビティクラスにBluetoothサービスから情報を取得するハンドラの定義の追加
Bluetoothサービスから情報を取得するハンドラの定義を追加します。
接続完了したときの処理と、接続可能範囲から外れて切断されたときの処理を追加します。
「MainActivity」クラスのメンバ変数宣言の直後、onCreate関数の前に、以下を追加します。
「Cannot resolve symbol」エラーは、「Alt + Enter」で、必要なクラスをimportします。
リビルドし、エラー、警告がないことを確認します。
メインアクティビティクラスのonResume関数の編集
onResume関数を編集します。
初回表示時および復帰時には、「Connect」ボタン、「Disconnect」ボタンが無効となるように処理を追加します。
初回表示時および復帰時に、デバイスアドレスが空でなければ、接続ボタンが有効になるように処理を追加します。
初回表示時および復帰時には、「Connect」ボタンが自動で押されるように処理を追加します。
メインアクティビティクラスに、onPause関数、onDestroy関数の追加
メインアクティビティに、「別のアクティビティ(か別のアプリ)に移行したことで、バックグラウンドに追いやられた時」に呼ばれる関数である onPause関数と、「アクティビティの終了直前」に呼ばれる関数である
onDestroy関数を追加します。
onPause関数では、切断の関数を呼びます。
onDestroy関数では、BluetoothServiceクラスのオブジェクトを削除します。
onResume関数の直後に、以下を追加します。
実行
Bluetoothモジュールの準備。
「フィジカルコンピューティング > Arduino > Bluetooth通信する(Bluetoothモジュール RN-42 使用)」に従い、Bluetoothモジュールを準備しておきます。
Android端末では、Bluetoothモジュールとのペアリングをしておきます。
Android端末にて、動作確認。
ソフト起動後の画面。
「Connect」ボタンと「Disconnect」ボタンは無効となっています。
右上の「検出」アイコンをタップすると、「Bluetoothデバイス検出アクティビティ」に移行します。
検出されたBluetoothデバイスの名前をタップすると、「メインアクティビティ」に戻ります。
「Device Name」欄と「Device Addres」欄に、Bluetoothデバイスの名前とアドレスが表示されます。
「Connect」ボタンは自動で押され、Bluetoothデバイスに接続します。接続が完了すると「Disconnect」ボタンが有効となります。
「Disconnect」ボタンを押すと、Bluetoothデバイスとの接続が切断されます。切断が完了すると「Connect」ボタンが有効となります。
ダウンロード
サンプルプロジェクト
(github.com上のダウンロードページ)
関連ページ
前項目:02.Bluetoothデバイスを検出する処理を作る
次項目:04.Bluetoothデバイスから文字列を受信する処理を作る