Android 4.4 设备可以充当 iBeacon 吗?
Can an Android 4.4 device act as an iBeacon?
在 answer to another question 中,我看到 "You can also transmit as a beacon on rooted Android 4.4.3 devices, but it requires an app installed with system privileges."
如何做到这一点?
是的,这在 4.4.3 上是可行的,但是关键的 API 方法 startAdvertising()
、stopAdvertising()
和 getAdvScanData()
(允许您读写广告中发送的原始信息)被阻止使用,除非应用有 android.permission.BLUETOOTH_PRIVILEGED
。这是系统级权限,因此对于您的自定义应用程序,获得此权限的唯一方法是将您的 phone 设为根目录,然后将您的应用程序安装在 /system/priv-app 目录中。
如果你能做到这一点,基本代码是:
byte[] advertisingBytes;
advertisingBytes = new byte[] {
(byte) 0x18, (byte) 0x01, // Radius Networks manufacturer ID
(byte) 0xbe, (byte) 0xac, // AltBeacon advertisement identifier
// 16-byte Proximity UUID follows
(byte) 0x2F, (byte) 0x23, (byte) 0x44, (byte) 0x54, (byte) 0xCF, (byte) 0x6D, (byte) 0x4a, (byte) 0x0F,
(byte) 0xAD, (byte) 0xF2, (byte) 0xF4, (byte) 0x91, (byte) 0x1B, (byte) 0xA9, (byte) 0xFF, (byte) 0xA6,
(byte) 0x00, (byte) 0x01, // major: 1
(byte) 0x00, (byte) 0x02 }; // minor: 2
BluetoothManagerbluetoothManager = (BluetoothManager) this.getApplicationContext().getSystemService(Context.BLUETOOTH_SERVICE);
BluetoothAdapter bluetoothAdapter = bluetoothManager.getAdapter();
BluetoothAdvScanData scanData = bluetoothAdapter.getAdvScanData();
scanData.removeManufacturerCodeAndData(0x01);
scanData.setManufacturerData((int) 0x01, advertisingBytes);
scanData.setServiceData(new byte[]{}); // clear out service data.
bluetoothAdapter.startAdvertising(advertiseCallback);
以上代码展示了如何传输一个开源的AltBeacon。但是您可以通过更改字节模式来传输其他信标类型。
Android 4.4 中的另一个重要限制是一个错误阻止您公布超过 24 字节的数据,而不是应该允许的 26 字节。这意味着如果信标广告需要超过 24 个字节,它们可能会被截断。例如,AltBeacon 使用最后两个字节中的第二个字节来存储校准后的发射机功率。因为无法发送,这意味着无法使用 Android 信标库的标准 APIs.
来估算距离
您可以看到关于如何完成的描述here
在 answer to another question 中,我看到 "You can also transmit as a beacon on rooted Android 4.4.3 devices, but it requires an app installed with system privileges."
如何做到这一点?
是的,这在 4.4.3 上是可行的,但是关键的 API 方法 startAdvertising()
、stopAdvertising()
和 getAdvScanData()
(允许您读写广告中发送的原始信息)被阻止使用,除非应用有 android.permission.BLUETOOTH_PRIVILEGED
。这是系统级权限,因此对于您的自定义应用程序,获得此权限的唯一方法是将您的 phone 设为根目录,然后将您的应用程序安装在 /system/priv-app 目录中。
如果你能做到这一点,基本代码是:
byte[] advertisingBytes;
advertisingBytes = new byte[] {
(byte) 0x18, (byte) 0x01, // Radius Networks manufacturer ID
(byte) 0xbe, (byte) 0xac, // AltBeacon advertisement identifier
// 16-byte Proximity UUID follows
(byte) 0x2F, (byte) 0x23, (byte) 0x44, (byte) 0x54, (byte) 0xCF, (byte) 0x6D, (byte) 0x4a, (byte) 0x0F,
(byte) 0xAD, (byte) 0xF2, (byte) 0xF4, (byte) 0x91, (byte) 0x1B, (byte) 0xA9, (byte) 0xFF, (byte) 0xA6,
(byte) 0x00, (byte) 0x01, // major: 1
(byte) 0x00, (byte) 0x02 }; // minor: 2
BluetoothManagerbluetoothManager = (BluetoothManager) this.getApplicationContext().getSystemService(Context.BLUETOOTH_SERVICE);
BluetoothAdapter bluetoothAdapter = bluetoothManager.getAdapter();
BluetoothAdvScanData scanData = bluetoothAdapter.getAdvScanData();
scanData.removeManufacturerCodeAndData(0x01);
scanData.setManufacturerData((int) 0x01, advertisingBytes);
scanData.setServiceData(new byte[]{}); // clear out service data.
bluetoothAdapter.startAdvertising(advertiseCallback);
以上代码展示了如何传输一个开源的AltBeacon。但是您可以通过更改字节模式来传输其他信标类型。
Android 4.4 中的另一个重要限制是一个错误阻止您公布超过 24 字节的数据,而不是应该允许的 26 字节。这意味着如果信标广告需要超过 24 个字节,它们可能会被截断。例如,AltBeacon 使用最后两个字节中的第二个字节来存储校准后的发射机功率。因为无法发送,这意味着无法使用 Android 信标库的标准 APIs.
来估算距离您可以看到关于如何完成的描述here