Androidプログラマへの道 〜 Moonlight 明日香 〜 - Bluetoothデバイスを探す
周辺のBluetoothデバイスを探すには, BluetoothAdapterクラスを利用する.



Bluetoothデバイスのスキャン

  • Bluetooth01.java
    • デバイスが見つかった通知を受け取るブロードキャストレシーバを定義する.
      • インテントのアクションが, ACTION_FOUNDか判定する.
      • Intent#getParcelableExtraメソッドで, BluetoothDeviceオブジェクトを取得する.
      • BluetoothDevice#getNmae, getAddressメソッドで, デバイス名やアドレスを取得する.
    • インテントフィルタを作成する.
    • registerReceiverメソッドで, ブロードキャストレシーバを登録する.
    • BluetoothAdapter#getDefaultAdapterメソッドで, BluetoothAdapterのインスタンスを取得する.
    • BluetoothAdapter#startDiscoveryメソッドで, Bluetoothデバイスのスキャンを開始する.
    • デバイスの検索中なら, BluetoothAdapter#cancleDiscoveryメソッドで, Bluetoothデバイスのスキャンを中止する.
    • unregisterReceiverメソッドで, ブロードキャストレシーバの登録を解除する.
package com.moonlight_aska.android.bluetooth01;

import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.widget.TextView;

public class Bluetooth01 extends Activity {
  private BluetoothAdapter mBtAdapter;
  private TextView mResultView;
  private String mResult = "";
  // ブロードキャストレシーバの定義
  private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
      String action = intent.getAction();
      if (BluetoothDevice.ACTION_FOUND.equals(action)){
        // 見つけたデバイス情報の取得
        BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
        mResult += "Device : " + device.getName() + "/" + device.getAddress() + "\n";
        mResultView.setText(mResult);
      }
    }
  };

  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    mResultView = (TextView)findViewById(R.id.bt_text);
    // インテントフィルタの作成
    IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
    // ブロードキャストレシーバの登録
    registerReceiver(mReceiver, filter);

    // BluetoothAdapterのインスタンス取得
    mBtAdapter = BluetoothAdapter.getDefaultAdapter();
    // Bluetooth有効
    if (!mBtAdapter.isEnabled()) {
      mBtAdapter.enable();
    }
    // 周辺デバイスの検索開始
    mBtAdapter.startDiscovery();
  }

  @Override
  protected void onDestroy() {
    // TODO Auto-generated method stub
    super.onDestroy();
    // 検索中止
    if (mBtAdapter.isDiscovering()) {
      mBtAdapter.cancelDiscovery();
    }
    unregisterReceiver(mReceiver);
  }
}
  • AndroidManifest.xml
    • Bluetoot設定の操作を行うには, "android.permission.BLUETOOTH_ADMIN"パーミションを設定する.
    • "android.permission.BLUETOOTH_ADMIN"パーティションを使用する場合は, "android.permission.BLUETOOTH"パーミションも設定する.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.moonlight_aska.android.bluetooth01"
  android:versionCode="1"
  android:versionName="1.0" >
  <uses-sdk android:minSdkVersion="8" />
  <uses-permission android:name="android.permission.BLUETOOTH"/>
  <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

  <application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >
    <activity
      android:name=".Bluetooth01"
      android:label="@string/app_name" >
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
  </application>
</manifest>