Android 4.0(IceCreamSandwich)からBluetoothのHealthデバイスのサポートが追加されました。
ヘルスデバイスとは
医療、フィットネス、健康器具
などヘルス分野の製品のことで、
Bluetooth Health Device Profile(HDP)
としてBluetoothでは通信を規格化しています。
4.0での対応により、AndroidからもHDP対応ヘルスデバイスを使えることになりました。Health Device Profile対応により、血圧計、歩数計や体重計など健康器具とのデータ交換が容易に行えます。
今回は、Bluetooth Health Deviceとの通信方法を紹介します。
android.bluetoothパッケージ
にBluetooth Health関連クラスが追加されています。
application configurationとは、ヘルスデバイスとの接続に利用されるアプリケーション設定で、サードパーティ、開発者がヘルスデバイスとBluetoothで通信するための状態通知コールバック設定、設定名などが格納されています。
接続するためのサンプルコードは以下のとおりです。
※Android 4.0およびヘルスデバイスを入手できていないため、本記事でのサンプルコードは、概要を理解するためのコードスニペットとお考えください。
実際に試すには修正が必要
です。
ヘルスデバイスの検出処理
以下はヘルスデバイスの検出と切断に合わせて、ヘルスデバイスを管理するためのBluetoothHealthインスタンスを取得するサンプルコードです。
ここでは、BluetoothAdapter(Bluetooth接続のためのアダプタ)から
ヘルスデバイス接続通知
を受け取り、BluetoothHealthインスタンスを取得します。
サンプルコード
BluetoothHealth mBluetoothHealth;
BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
// デフォルトアダプタからヘルスデバイスへの接続権を取得する
mBluetoothAdapter.getProfileProxy(context, mProfileListener, BluetoothProfile.HEALTH);
private BluetoothProfile.ServiceListener mProfileListener = new BluetoothProfile.ServiceListener() {
public void onServiceConnected(int profile, BluetoothProfile proxy) {
if (profile == BluetoothProfile.HEALTH) {
//ヘルスデバイスが検出された
mBluetoothHealth = (BluetoothHealth) proxy;
public void onServiceDisconnected(int profile) {
if (profile == BluetoothProfile.HEALTH) {
//ヘルスデバイスが切断された
mBluetoothHealth = null;
5行目:デフォルトアダプタの
getProfileProxyメソッド
をつかって、ヘルスデバイスの接続状態が変化した際に、通知するリスナーを登録します。
7行目:BluetoothProfile.ServiceListener(mProfileListenerインスタンス)を作成します。
9行目:接続されたprofileの種類がヘルスデバイスであれば、ヘルスデバイスが接続されたと判断します。
11行目:受け取ったproxyはBluetoothProfileクラスなので、
BluetoothHealthクラスにキャスト
して利用します。
17行目:もし、ヘルスデバイスが切断された場合は、インスタンスは失われるため、null代入して処理を終了します。
ヘルスデバイスとの接続
接続するためのアプリケーション設定
Bluetooth Health Device Profile(HDP)では、ヘルスデバイスと通信するための
DataType
が定められています。
これらデータタイプは表の通り、動作に制約があります。
SINKタイプ
であれば複数の
SOURCE(ヘルスデバイス側)
から情報を受け取ることができますが、その反対は出来ません。SOURCE側はあくまでデータを送出するためのデータタイプです。
実際に接続対象(例えば血圧計、歩数計など複数のデバイスが接続済みの際に血圧計を探す、など特定の)ヘルスデバイスと接続する際は、
BluetoothHealthクラスのregisterSinkAppConfigurationメソッド
を使って通信するための準備を行います。このメソッドでは接続状態など通信処理に必要なコールバックを受けるための設定を行います。
以下のサンプルコードをみて実際の処理を確認しましょう。
サンプルコード
private void registerHealthDevices(){
MyBluetoothHealthCallback mCallback = new MyBluetoothHealthCallback();
mBluetoothHealth.registerSinkAppConfiguration("HEALTH_DEVICES",BluetoothHealth.SINK_ROLE, mCallback);
class MyBluetoothHealthCallback extends BluetoothHealthCallback {
@Override
public void onHealthAppConfigurationStatusChange(
BluetoothHealthAppConfiguration config, int status) {
super.onHealthAppConfigurationStatusChange(config, status);
// TODO : 接続したいヘルスデバイス(3rdパーティ製品など)のconfigを覚える
mHealthConfig = config;
@Override
public void onHealthChannelStateChange(
BluetoothHealthAppConfiguration config, BluetoothDevice device,
int prevState, int newState, ParcelFileDescriptor fd, int channelId) {
super.onHealthChannelStateChange(config, device, prevState,
newState, fd, channelId);
// TODO: ヘルスデバイスの状態変更通知
mChannelId = channelId;
private void unregisterHealthDevices(){
mBluetoothHealth.unregisterAppConfiguration(mHealthConfig);
4行目:BluetoothHealthクラスの
registerSinkAppConfigurationメソッド
を使って、ヘルスデバイスに接続するための設定を行います。
11行目:
BluetoothHealthCallbackクラスのonHealthAppConfigurationStatusChangeメソッド
は、ヘルスデバイスとのアプリケーション設定情報の状態通知です。変更がある度、呼び出されることになります。statusは BluetoothHealth.APP_CONFIG_REGISTRATION_SUCCESS もしくは BluetoothHealth.APP_CONFIG_REGISTRATION_FAILURE が返却されます。
20行目:BluetoothHealthCallbackクラスの
onHealthChannelStateChangeメソッド
は、ヘルスデバイスとの接続状態通知です。ヘルスデバイスとの接続状況が変化すると呼び出されます。
prevState、newStateの値は以下の表に従います。
32行目:BluetoothHealthクラスのunregisterAppConfigurationメソッドを使ってアプリケーション設定mHealthConfigを破棄します。
ヘルスデバイスとの接続
ここまでくると、あとは今までに取得したBluetoothDevice情報、アプリケーション設定(mHealthConfig)を利用してヘルスデバイスとの接続・切断を行うだけです。
サンプルコード
private void connect(){
//Bluetoothデバイスに、コンフィグを使って接続する
mBluetoothHealth.connectChannelToSource(mBluetoothDevice, mHealthConfig);
private void disconnect(){
//ヘルスデバイスと切断
mBluetoothHealth.disconnectChannel(mBluetoothDevice, mHealthConfig, mChannelId);
3行目:BluetoothHealthクラスの
connectChannelToSourceメソッド
を使って、ヘルスデバイスに接続します。
ヘルスデバイスと接続できると、前述のBluetoothHealthCallbackクラスのonHealthChannelStateChangeメソッドが呼ばれます。onHealthChannelStateChangeメソッドの引数に
チャンネルID
が渡されますので、覚えておき、データ取得時、切断時に利用します。
8行目:
disconnectChannelメソッド
で接続を終了します。終了後に再接続したい場合は改めて、connectChannelToSourceメソッドを呼びだしてください。
すこし長くなりましたが、ヘルスデバイスに接続するまでをサンプルコード(コードスニペット)を利用して紹介しました。実際に利用する際はヘルスデバイスに応じてサンプルコードの修正が必要となりますので、十分注意してください。
以上、おつかれさまでした!