studio - ¿Funciona BluetoothLeAdvertiser en un Nexus 5 con Android 5.0?
eddystone (4)
Después de actualizar mi Nexus 5 a la versión preliminar de Android 5.0 hammerhead-lpx13d, el sistema operativo informa que ya no admite publicidad con Bluetooth LE. Si llamas:
((BluetoothManager) this.getSystemService(Context.BLUETOOTH_SERVICE))
.getAdapter().getBluetoothLeAdvertiser()
Siempre devuelve nulo. Además, el nuevo método:
((BluetoothManager) this.getSystemService(Context.BLUETOOTH_SERVICE))
.getAdapter().isMultipleAdvertisementSupported()
siempre devuelve falso
El primer método utilizado para devolver un objeto válido en la primera versión preliminar de Android L para el Nexus 5 en junio. Ya no lo hace, después de flashear la última actualización.
¿Alguien ve lo contrario?
EDITAR: Esto ha sido reproducido por al menos una persona, que abrió un problema con Google aquí: https://code.google.com/p/android-developer-preview/issues/detail?id=1570
Dicho esto, confirmé que la publicidad es compatible con la tableta Nexus 9. Consulte aquí para obtener más información: http://developer.radiusnetworks.com/2014/11/18/beacon-transmission-with-android-5.html
La aplicación QuickBeacon funciona bien en Nexus 9. En la aplicación hay una opción de formato Beacon. @ Davidgyoung ¿Podría dar String exacto para que BeaconParser haga que esta biblioteca se transmita en formato iBeacon?
ACTUALIZACIÓN: pregunta relacionada hasta android-beacon-library / BLE Android SDK. ¿Existe la posibilidad, sin llamar al método de inicio de publicidad, para verificar si hay un servicio de publicidad en segundo plano?
ACTUALIZAR:
Grabando a esto: https://code.google.com/p/android-developer-preview/issues/detail?id=1570#c52
Ahora solo Nexus 6 y Nexus 9 son compatibles con el Modo Periférico BLE en Android 5.0
ACTUALIZACIÓN: trabajo en Nexus 5 Android 5.0 número de compilación LPX13D
de acuerdo con este https://.com/a/26611779/1906420
Después de implementar su solución, bluetoothAdvertiser no es nulo. Llamando a startAdvertising desde bluetoothAdvertiser
bluetoothAdvertiser.startAdvertising(settingsBuilder.build(), dataBuilder.build(), advertiseCallback);
dónde
private AdvertiseCallback advertiseCallback = new AdvertiseCallback() {
@Override
public void onStartSuccess(AdvertiseSettings settingsInEffec) {
}
@Override
public void onStartFailure(int result) {
if (result == ADVERTISE_FAILED_DATA_TOO_LARGE) {
Log.d(TAG, "Failed to start advertising as the advertise data to be broadcasted is larger than 31 bytes.");
}
else if(result == ADVERTISE_FAILED_TOO_MANY_ADVERTISERS){
Log.d(TAG, "Failed to start advertising because no advertising instance is available.");
}
else if(result == ADVERTISE_FAILED_ALREADY_STARTED){
Log.d(TAG, "Failed to start advertising as the advertising is already started.");
}
else if(result == ADVERTISE_FAILED_INTERNAL_ERROR){
Log.d(TAG, "Operation failed due to an internal error.");
}
else if(result == ADVERTISE_FAILED_FEATURE_UNSUPPORTED){
Log.d(TAG, "This feature is not supported on this platform.");
}
else {
Log.d(TAG, "There was unknown error.");
}
}
};
siempre da callback onStartFailure con el código de error 5 (ADVERTISE_FAILED_FEATURE_UNSUPPORTED)
Desafortunadamente, la respuesta oficial de Google es no, el Nexus 5 ya no admite publicidad.
Hemos introducido el modo periférico BLE en Android 5.0 Lollipop. Nexus 6 y Nexus 9 son los dos primeros dispositivos Nexus de producción que admiten el modo periférico BLE. Debido a la dependencia del conjunto de chips del hardware, los dispositivos Nexus más antiguos (4/5/7) no tendrán acceso a la función en Lollipop.
Vea el Comentario # 52 en el número 1570 por danielho ... @ google.com: el modo de publicidad BLE no funciona https://code.google.com/p/android-developer-preview/issues/detail?id=1570
Dicho esto, confirmé que la publicidad es compatible con la tableta Nexus 9. Consulte aquí para obtener más información: http://developer.radiusnetworks.com/2014/11/18/beacon-transmission-with-android-5.html
Esto no es una solución completa, sino una solución alternativa propuesta https://code.google.com/p/android-developer-preview/issues/detail?id=1570 . Le permite obtener una instancia de BluetoothLeAdvertiser
llamando al constructor privado en lugar de usar la API pública. Desafortunadamente, los informes de pruebas en un Nexus 5 y un Nexus 7 2013 Edition dicen que, incluso después de obtener una instancia, no puede usar el objeto para hacer que aparezcan anuncios. Además, ten en cuenta que incluso si puedes hacer que funcione, podría fallar en cualquier versión de código menor de Android porque utiliza una API no pública.
Para el registro, aquí está el fragmento de código copiado de esa página:
private static BluetoothLeAdvertiser getAdvertiserHack(BluetoothAdapter adapter) {
try {
Class<? extends BluetoothAdapter> adapterClass = adapter.getClass();
Field advertiserField = adapterClass.getDeclaredField("sBluetoothLeAdvertiser");
advertiserField.setAccessible(true);
Object advertiser = advertiserField.get(adapter);
if (advertiser == null) {
Field bluetoothManagerServiceField = adapterClass.getDeclaredField("mManagerService");
bluetoothManagerServiceField.setAccessible(true);
Object bluetoothManagerService = bluetoothManagerServiceField.get(adapter);
Constructor<?> constructor = BluetoothLeAdvertiser.class.getDeclaredConstructor(
bluetoothManagerServiceField.getType());
constructor.setAccessible(true);
advertiser = constructor.newInstance(bluetoothManagerService);
advertiserField.set(adapter, advertiser);
}
return (BluetoothLeAdvertiser) advertiser;
} catch (Exception e) {
return null;
}
}