そしてGalaxyNexusにも4.3が降ってきました
ふと気がつくと、I/Oで配られたGalaxyNexusにも4.3が降ってきていました。
I/Oのおみやげってこーゆーところが早くて助かります。
さて、お次はBluetooth Low EnergyとかWiFiとか
I/Oのセッションでお姉ちゃんとちんたらしたおっちゃんがなんか喋ってたやつ。
NFCみたいに近づかないとダメってわけじゃないので、BLEはかなり使い勝手が良くて やっぱりこっちが本流なんでしょうね…(用途が違うのでどっちも使われるのでしょうけど…)
Wireless and Connectivity
Bluetooth Low Energy (Smart Ready)
Androidは Bluetooth LEを android.bluetooth の新しいAPIでサポートする。 心拍モニタや万歩計といったBLE peripheralと通信するアプリが構築できるようになる。
Bluetooth LE はハードウェアの機能であり、全てのAndroid機で使用できるわけではないため、manifestファイルに <uses-feature>で"android.hardware.bluetooth_le"を宣言する必要がある。
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true" />
すでにClassic Bluetooth APIに慣れているなら、Bluetooth LE APIとのいくつかの違いに注意すること。最も重要なのは、BluetoothManagerクラスが、BluetoothAdapterや接続済デバイスのリストを取得したり、機器の状態をチェックしたりという高レベルな操作につかわれるべきだということ。
final BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = bluetoothManager.getAdapter();
BLE peripherals(BLEタグみたいなやつ)を見つけるためには、BluetoothAdapterのstartLeScan()を、BluetoothAdapterのLeScanCallbackの実装を渡して呼ぶ。
peripheralが見つかったら、LeScanCallbackのonLeScan()メソッドが呼び出される。このメソッドは デバイスのRSSIやadvertisement recordを含むバイト列を保持する BluetoothDeviceオブジェクトを引数として持つ。
もし指定したタイプのperipheralのみをスキャンしたい場合は、アプリがサポートするGATTサービスで指定されているUUIDオブジェクトの配列を引数とするstartLeScan()を呼ぶ。
- Bluetooth LEデバイスとClassicBluetoothデバイスは、一度に両方をスキャンする事はできない。BLEデバイスのみか、以前のAPIでClassicデバイスをスキャンするかのどちらかとなる。
その後、Bluetooth LE peripheralに接続するには、BluetoothGattCallbackの実装を引数として BluetoothDeviceオブジェクトのconnectGatt()メソッドを呼ぶ。 BluetoothGattCallbackは、デバイス間の接続状況を受け取る。 新しい状態として STATE_CONNECTEDを受け取ったら、onConnectionStateChange()の間、デバイスとのやりとりを始める事ができる。
端末のBluetooth機能にアクセスするには、ユーザーによるBluetoothの利用許可も必要。詳細は Bluetooth Low Energy API guideを読むこと。
Nexus7は、BLEに対応していないので試せません。Nexus4とか欲しいなぁ
Wi-Fi scan-only mode
ユーザーの位置を測定する際に、Androidは近場のWiFiのアクセスポイントのスキャン結果から位置を決定している。 しかしながら、バッテリーの消費を抑えるために、ユーザーはしばしばWiFiをOffにするため、位置情報が不正確になりやすい。
そこで、今回からアクセスポイントのスキャンのみを行うモードを追加した。位置を得るために実際にアクセスポイントに接続することはないため、バッテリーの使用が大幅に軽減される。
ユーザーの位置を取得したいが、WiFiがOffになっている場合、ユーザーに対してACTION_REQUEST_SCAN_ALWAYS_AVAILABLEでstartActivity()を実行し、WiFi scan-onlyモードを有効にしてもらうように促す事も可能。
地味ですが、この機能はけっこう良いかもしれません。WiFi関連の設定も細かくなってるような気がしますし便利になりました。
Wi-Fi configuration
新しい WiFiEnterpriseConfig APIは、管理下の端末のWiFiの設定を自動的に行うサービスを提供する。
Quick response for incoming calls
Android 4.0からは、Quick response と呼ばれる、かかって来た電話に対し、端末をもちあげたり、ロックを解除することなく、すぐにテキストメッセージで応答できる機能が実装されている。
これまでは、これらのメッセージは常にデフォルトのメッセージアプリで行われていたが、これからは、ACTION_RESPOND_VIA_MESSAGE の intent filterを設定したサービスならどんなアプリでも可能となった。
ユーザーが着信にquick responseで応答するとき、通話アプリは発信者情報とユーザーの指定するテキストメッセージをEXTRA_TEXTで設定したIntentを発行する。
メッセージを送信したらすぐにサービスは動作を停止こと(activityを表示すべきではない)
ACTION_RESPOND_VIA_MESSAGEのIntentを受け取るためには、SEND_RESPOND_VIA_MESSAGEのパーミッションをmanifestに定義しておく必要がある。
ということで、4.3なGalaxyNexusで、自作アプリの動作テストもさっと終了。ドキュメントの続きはどうしようかなぁ…