BluetoothLeAdvertiser - DeadObjectException

时间:2016-07-27 19:15:20

标签: android bluetooth ibeacon-android gatt

我一直在开发一个Android应用程序来发出Eddystone信标。 我正在使用IntentService开始广告信标。调用startAdvertising函数后Intent Service停止,但我设置了一个每X分钟触发一次的警报。因此,在X分钟后,我再次呼叫stopAdvertising然后再启动广告。我将AdvertiseCallback设置为静态,因此每次都有相同的clientIf = 5。这可以正常工作,但就像大约每隔X * 23分钟一样,我得到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类的一种方法。 感谢

1 个答案:

答案 0 :(得分:0)

根据您的描述,您的IntentService似乎正在启动startAdvertising所需的所有组件。这些对象存储在内存中,属于一旦广告方法完成就被销毁的IntentService(IntentService用于执行短任务,并在完成时自毁)。

在x分钟后,警报会唤醒,并尝试使用IntentService启动的资源停止广告...但现在您遇到了问题:

Intent服务不再存在,因为它与所有资源一起被销毁,因此警报启动任务正在尝试调用DeadObject,从而导致DeadObjectException。