2015/11/07

[android]BluetoothManagerはnullがあるのか?

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になった。
そういうものだということだろう。

2 件のコメント:

  1. >BluetoothManagerは非nullで、BluetoothAdapterがnullになった。
    こんな感じですね。うんうん。

    返信削除
    返信
    1. やっぱりそうなんですね。うんうん。

      削除

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。