AndroidでBLEを使うとき、まずBluetoothManagerを取得して、BluetoothAdapterを取得すると思う。
さて、それぞれnullになりうるのだろうか?
public final T getSystemService (Class<T> serviceClass)
システムサービスを提供していなかったら、nullを返す。
BLEの場合、serviceClassとして指定するのはBLUETOOTH_SERVICE。
なので、これがnullということは「端末がBluetoothに対応していない」と考えるとよいか。
public BluetoothAdapter getAdapter ()
nullについての記載が無い。
http://tools.oesf.biz/android-6.0.0_r1.0/xref/frameworks/base/core/java/android/bluetooth/BluetoothManager.java#73
mAdapterを返すだけ。
http://tools.oesf.biz/android-6.0.0_r1.0/xref/frameworks/base/core/java/android/bluetooth/BluetoothManager.java#65
コンストラクタで代入している。
ここから先は、よくわからんかった。。
http://developer.android.com/intl/ja/samples/BluetoothLeGatt/src/com.example.android.bluetoothlegatt/DeviceScanActivity.html
Developersのサンプルソースでは、BluetoothManagerのnullは見てないが、BluetoothAdapterのnullは見ている。
コメントを見ると、BluetoothAdapterがnullだった場合にはBluetoothを端末がサポートしていないと判断しているようだ。
となると、私の予想と違うな。
[第二回] 生活で使えるBLE~ペアリング編~ ~ BRILLIANTSERVICE TECHNICAL BLOG
こちらの記事でも、BluetoothAdapterのnullは見ているが、BluetoothManagerのnullは見ていない。
Android5.0〜でBLEを使う(Central編) - vaguely
こちらの方も、同じ。
Developersサンプルと上記2サイトの違いは、Developersサンプルはnullだったらアプリを終了させるが、2サイトはインテントを投げてBluetoothの使用許可を求めようとしているところだ。
そして、DevelopersサンプルはonResume()のタイミングで、BluetoothAdapter#isEnabled()がfalseだった場合に許可を求めようとしている。
私はDevelopersサンプルを動かして試していたので、Bluetoothを無効にしていた場合にはBluetoothAdapterは非nullで、isEnabled()がfalseになっていたはずだ(Nexus5+Android6.0)。
うーーむ・・・。
ただ、いま販売されているスマートフォンやタブレットで、Bluetoothが載っていないものはほとんど無いんじゃないかと思う。
試すなら、自分でAndroidをビルドすることになるだろうけど、そのときも実装の仕方次第でどっちにでも倒せるような気がする。
予想では、BluetoothManagerの方がnullになってほしいところではあるが。。。
そういえば、エミュレータはBluetoothに対応していなかったのを思い出したので、試した。
・・・うん、BluetoothManagerは非nullで、BluetoothAdapterがnullになった。
そういうものだということだろう。
>BluetoothManagerは非nullで、BluetoothAdapterがnullになった。
返信削除こんな感じですね。うんうん。
やっぱりそうなんですね。うんうん。
削除