連載
» 2012年09月12日 00時00分 UPDATE

Androidで動く携帯Javaアプリ作成入門(35):Bluetoothを使ってAndroidアプリ同士で通信するには (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の提供する機能は、以下のように強化されています。

表 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によるリバーシ対戦ゲーム

 今回のサンプルは対戦ゲームの定番、リバーシ(オセロ)です。

ma_osero01.jpg

 サンプルコードは以下よりダウンロードしてください。

 このサンプルを題材に、Bluetoothの基本機能を解説していきます。

 詳しい解説の前に、簡単に遊び方を説明します。

  1. Android 2.0以降を搭載した端末2台にBtRevをインストール(エミュレータではBluetooth機能は確認できないため
  2. それぞれの端末でBtRevを起動。起動時にBluetoothがONになっていない場合はONに
  3. どちらかの端末でメニューを開いて[Discoverable]を選択。検出可能にするための許可が出るので[はい]を選択。その後、再びメニューを開き、[Start server]を選択。こちらの端末がサーバになる
  4. もう片方でメニューを開き、[Search server]を選択。見つかったサーバを選択。その後、再びメニューを開き、[Connect]を選択し、サーバを選択。こちらがクライアントになる
  5. 通信が始まり、ゲームが開始。クライアント側が黒

 コードを簡潔にするため、以下の処理が省略されています。

  • 勝敗判定
  • ターンスキップ判定
  • ゲーム中断処理

 それでは、解説に移ります。

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の被検出、検出、通信、プロトコル設計における注意点などを解説します。

       1|2 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

Focus

- PR -

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。