Can an Android 4.4 device act as an iBeacon? [clos

2020-03-26 09:37发布

In an answer to another question, I saw that "You can also transmit as a beacon on rooted Android 4.4.3 devices, but it requires an app installed with system privileges."

How can this be done?

1条回答
等我变得足够好
2楼-- · 2020-03-26 10:09

Yes, this is possible on 4.4.3, but the critical API methods startAdvertising(), stopAdvertising() and getAdvScanData() (which allows you to read and write the raw information sent out in the advertisement) are blocked from use unless an app has android.permission.BLUETOOTH_PRIVILEGED. This is a system-level permission, so the only way to get this is for your custom app is to root your phone, and install your app in the /system/priv-app directory.

If you can accomplish that, the basic code to do this is:

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);   

The above code shows you how to transmit an open source AltBeacon. But you can transmit other beacon types by changing the byte pattern.

Another important restriction in Android 4.4 is that a bug prevents you from advertising more than 24 bytes of data, instead of the 26 that should be allowed. This means that beacon advertisements may be truncated if they require more than 24 bytes. AltBeacon, for example, uses the second of those last two bytes to store the calibrated transmitter power. Because this cannot be sent, that means distance estimates are not possible using the Android Beacon Library's standard APIs.

You can see a description of how this is done here

查看更多
登录 后发表回答