👌

flutter_blue_plusでEddystoneがスキャンできない場合の対策

2023/05/14に公開

はじめに

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