Bluetoothを使ってAndroidアプリ同士で通信するには:Androidで動く携帯Javaアプリ作成入門(35)(1/2 ページ)
Androidで使えるBluetoothの種類や設定の仕方、ペアリングや通信の行い方などを通信対戦ゲームのサンプルを交えて解説
Androidで使えるBluetoothの種類
本連載第12回「SurfaceViewならAndroidで高速描画ゲームが作れる」で予告した、Bluetoothの解説記事を楽しみにしていた方、大変お待たせしました。今回から2回に分けて、Bluetoothの使用方法を解説します。
BluetoothはAndroid 1.0のころからハードウェアおよびネイティブスタックが搭載されてはいたものの、Java API提供としては見送られ、Android 2.0でようやくAPIが提供されました。
最新版のバージョンがAndroid 4.1(API Level 16)となっている現時点では、Android 2.0(API Level 5)の当時と比べ、Bluetooth APIの提供する機能は、以下のように強化されています。
Androidバージョン | プロファイル |
---|---|
API Level 5(Android 2.0) | SDP、RFCOMM |
API Level 11(Android 3.0) | A2DP |
API Level 14(Android 4.0) | HDP |
SDPとは、「Service Discovery Protocol」の略で、サービスを検出するプロトコルです。Bluetoothのコア仕様内で規定されており、Bluetoothの必須プロトコルです。
RFCOMMとは、BluetoothでRS232Cによるシリアル通信をエミュレートするプロトコルで、Serial Port Profile(SPP)をはじめとする、多くのプロファイルから利用されています。
A2DPとは、「Advanced Audio Distribution Profile」の略で、ステレオ音質のオーディオ配信を行います。いわゆるAndroidとヘッドセット間の通信プロファイルです。
HDPとは、「Health Device Profile」の略で、歩数計、体重計、血圧計などの健康機器と通信を行うためのプロファイルです。
今回はRFCOMMを使用したAndroid間での通信を解説します。
Bluetoothによるリバーシ対戦ゲーム
今回のサンプルは対戦ゲームの定番、リバーシ(オセロ)です。
サンプルコードは以下よりダウンロードしてください。
このサンプルを題材に、Bluetoothの基本機能を解説していきます。
詳しい解説の前に、簡単に遊び方を説明します。
- Android 2.0以降を搭載した端末2台にBtRevをインストール(エミュレータではBluetooth機能は確認できないため)
- それぞれの端末でBtRevを起動。起動時にBluetoothがONになっていない場合はONに
- どちらかの端末でメニューを開いて[Discoverable]を選択。検出可能にするための許可が出るので[はい]を選択。その後、再びメニューを開き、[Start server]を選択。こちらの端末がサーバになる
- もう片方でメニューを開き、[Search server]を選択。見つかったサーバを選択。その後、再びメニューを開き、[Connect]を選択し、サーバを選択。こちらがクライアントになる
- 通信が始まり、ゲームが開始。クライアント側が黒
コードを簡潔にするため、以下の処理が省略されています。
- 勝敗判定
- ターンスキップ判定
- ゲーム中断処理
それでは、解説に移ります。
Bluetoothを使うためのパーミッション定義
AndroidでBluetoothを使用する場合、AndroidManifest.xmlに以下のパーミッションが必要です。
<uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
android.permission.BLUETOOTHは、Bluetoothを使用するためのパーミッション、android.permission.BLUETOOTH_ADMINは、Bluetoothを管理(Bluetooth ON、ディスカバリ)するためのパーミッションです。
Bluetoothを使用する場合はandroid.permission.BLUETOOTHは必須で、今回のアプリではBluetooth ONとディスカバリも行うため、両方定義しています。どの機能がどちらのパーミッションを必要とするかは、Android Bluetoothの各メソッドのJavadocに記載されているため、そちらを参照してください。
Bluetoothのサポート判定
Bluetoothがサポートされていない端末の判定は、以下のように行います。
if (BluetoothAdapter.getDefaultAdapter() == null) { // Bluetoothはサポートされていない }
今回のサンプルのように、Bluetoothありきのアプリが“Bluetoothがサポートされていない端末”で起動された場合、メッセージを表示後、終了させてしまってよいでしょう。今回のサンプルではサポート判定は行っていないので、注意してください。
BluetoothをONにする
今回のサンプルではアプリ起動時にBluetoothがONになっていなければONにします。
if (!mBluetoothAdapter.isEnabled()) { Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); mActivity.startActivityForResult(intent, REQUEST_ENABLE_BT); }
上記の方法以外で、BluetoothをONにするにはBluetoothAdapter#enable()を使用する方法もあります。
mBluetoothAdapter.enable();
アプリ起動時にBluetoothがONになっていなければONにする方法では、Intentをブロードキャストしてユーザーに許可を求めます。一方、BluetoothAdapter#enable()を使用する方法はユーザーに許可を求めません。ユーザーに許可を求めない後者のような方法は、「パワーマネジメント」などのアプリ以外では推奨されていません。
次ページでは、Bluetoothの被検出、検出、通信、プロトコル設計における注意点などを解説します。
Copyright © ITmedia, Inc. All Rights Reserved.