👌
flutter_blue_plusでEddystoneがスキャンできない場合の対策
はじめに
flutter_blue_plusを使ってEddystone TLMのデータを取得しようと思ったら サンプルコードのような感じで startScan() しても ScanResultとしてデータが受信できなかった。ほかのBLEデバイスのアドバタイジングパケットなんかは受信できているのに。
調べ回ってけっこう時間がかかったので備忘録を記載しておきます。
Bluetoothの権限を追加する
結論、こちらでした。Flutter云々ではなくAndroidのBluetoothパーミッション。Issueに記載のとおりAndroid 12で動作しました。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.xxxx_xxxx_xxxx_xxxx"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" tools:node="remove"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" tools:node="remove"/>
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" tools:node="remove"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" tools:node="remove"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" tools:node="remove"/>
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<application
…
<manifest>
にxmlns:tools="http://schemas.android.com/tools"
を追加するのをお忘れなく。
ScanResult中のペイロードの取得
ちなみにiBeacon等と違ってEddyStoneのペイロードは e.advertisementData.serviceData
に格納されています。e.advertisementData.manufacturerData
ではありません。
理由はこちらに詳しく解説されています。EddyStoneのADタイプは0x16
のためサービスデータ扱いとなります。
おわりに
AndroidのBlutoothパーミッション周り最近ややこしすぎなんだけどどうにかならんのかね。
Discussion