我一直致力於發射Eddystone信標的Android應用程序。 我正在使用IntentService來啓動廣告信標。意圖服務在調用startAdvertising函數後停止,但我設置了一個觸發每X分鐘的警報。所以在X分鐘後,我打電話給stopAdvertising,然後再次啓動廣告。我將AdvertiseCallback設置爲靜態,因此每次都有相同的clientIf = 5。這個工作正常,但是就像在每個X * 23分鐘後,我得到DeadObjectException。BluetoothLeAdvertiser - DeadObjectException
1950-1950/com.ppp.beaconbroadcasterservice.beaconemitterbackground D/AlarmReceiver: Alarm triggered
07-27 18:02:12.017 1950-1950/com.ppp.beaconbroadcasterservice.beaconemitterbackground D/BeaconEmitter: Data prepared to be advertised : Prefix - 007B Device token - 79b83b18f551c2aa Time token - 95feed22db47
07-27 18:02:12.110 1950-1966/com.ppp.beaconbroadcasterservice.beaconemitterbackground D/BluetoothLeAdvertiser: onClientRegistered() - status=0 clientIf=5
07-27 18:10:48.195 1950-1950/com.ppp.beaconbroadcasterservice.beaconemitterbackground D/AlarmReceiver: Alarm triggered
07-27 18:10:48.207 1950-1950/com.ppp.beaconbroadcasterservice.beaconemitterbackground D/BeaconEmitter: Data prepared to be advertised : Prefix - 007B Device token - 79b83b18f551c2aa Time token - b8b23f4ef347
07-27 18:10:48.276 1950-21988/com.ppp.beaconbroadcasterservice.beaconemitterbackground D/BluetoothLeAdvertiser: onClientRegistered() - status=0 clientIf=5
07-27 18:10:50.287 1950-1950/com.ppp.beaconbroadcasterservice.beaconemitterbackground E/BluetoothLeAdvertiser: remote exception when unregistering
android.os.DeadObjectException
at android.os.BinderProxy.transactNative(Native Method)
at android.os.BinderProxy.transact(Binder.java:496)
at android.bluetooth.IBluetoothGatt$Stub$Proxy.unregisterClient(IBluetoothGatt.java:866)
at android.bluetooth.le.BluetoothLeAdvertiser$AdvertiseCallbackWrapper.startRegisteration(BluetoothLeAdvertiser.java:278)
at android.bluetooth.le.BluetoothLeAdvertiser.startAdvertising(BluetoothLeAdvertiser.java:141)
at android.bluetooth.le.BluetoothLeAdvertiser.startAdvertising(BluetoothLeAdvertiser.java:90)
at com.ppp.beaconbroadcasterservice.beaconemitterbackground.BeaconEmitter.rotateBeaconID(BeaconEmitter.java:309)
at com.ppp.beaconbroadcasterservice.beaconemitterbackground.AlarmReceiver.onReceive(AlarmReceiver.java:32)
at android.app.ActivityThread.handleReceiver(ActivityThread.java:2662)
at android.app.ActivityThread.access$1700(ActivityThread.java:160)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1397)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5466)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:984)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)
07-27 18:10:50.542 1950-1950/com.ppp.beaconbroadcasterservice.beaconemitterbackground W/BluetoothReceiver: Bluetooth is OFF. Stop emitting beacon service. Also stopping the scheduled alarm
07-27 18:10:54.114 1950-1950/com.ppp.beaconbroadcasterservice.beaconemitterbackground W/BluetoothReceiver: Bluetooth is OFF. Stop emitting beacon service. Also stopping the scheduled alarm
07-27 18:10:58.712 1950-1950/com.ppp.beaconbroadcasterservice.beaconemitterbackground D/BluetoothReceiver: Bluetooth ON. Checking for compatibility
07-27 18:10:58.717 1950-1950/com.ppp.beaconbroadcasterservice.beaconemitterbackground D/BluetoothReceiver: Bluetooth ON and compatible. Start emitting beacon service. Also scheduling alarm
07-27 18:10:58.763 1950-4939/com.ppp.beaconbroadcasterservice.beaconemitterbackground D/BeaconEmitter: Data prepared to be advertised : Prefix - 007B Device token - 79b83b18f551c2aa Time token - b8b23f4ef347
07-27 18:10:58.775 1950-21988/com.ppp.beaconbroadcasterservice.beaconemitterbackground D/BluetoothLeAdvertiser: onClientRegistered() - status=0 clientIf=5
07-27 18:17:35.334 1950-1950/com.ppp.beaconbroadcasterservice.beaconemitterbackground D/AlarmReceiver: Alarm triggered
07-27 18:17:35.343 1950-1950/com.ppp.beaconbroadcasterservice.beaconemitterbackground D/BeaconEmitter: Data prepared to be advertised : Prefix - 007B Device token - 79b83b18f551c2aa Time token - e2697456de83
07-27 18:17:35.391 1950-11251/com.ppp.beaconbroadcasterservice.beaconemitterbackground D/BluetoothLeAdvertiser: onClientRegistered() - status=0 clientIf=5
所以這個例外不影響廣告,但它似乎關閉了藍牙,然後再次打開。 這幾乎每隔X * 23分鐘就會發生一次。我用X = 1分鐘和5分鐘的值進行交叉檢查。
有什麼理由呢?如何避免這種異常?
部分代碼在警報管理器的幫助下每5分鐘重複一次。
/**
* The rotation part which will be executed every 5 minutes
*/
public void rotateBeaconID()
{
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
mBluetoothLeAdvertiser = mBluetoothAdapter.getBluetoothLeAdvertiser();
//Change the advertise data to reflect the new timetoken in the beacon packet
mAdvertiseData = setAdvertiseData();
//Change the advertising settings
mAdvertiseSettings = setAdvertiseSettings();
//Stop the current advertisement
mBluetoothLeAdvertiser.stopAdvertising(mAdvertiseCallback);
//Start advertising again with the new beacon packet
mBluetoothLeAdvertiser.startAdvertising(mAdvertiseSettings, mAdvertiseData, mAdvertiseCallback);
//Write the logs to a file in the device
LogRotate.writeLogToFile();
}
此函數是IntentService類的一個方法。 謝謝
這可能與您設備上藍牙堆棧的內部結構有關。我懷疑這不是你記錄的行爲或編程錯誤。這是一個奇怪的說法,可能是一個Android錯誤。 – davidgyoung