2016-07-27 45 views
0

我一直致力於發射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類的一個方法。 謝謝

+0

這可能與您設備上藍牙堆棧的內部結構有關。我懷疑這不是你記錄的行爲或編程錯誤。這是一個奇怪的說法,可能是一個Android錯誤。 – davidgyoung

回答

0

從您所描述的看起來,您的IntentService正在啓動啓動廣告所需的所有組件。這些對象存儲在內存中,屬於IntentService,一旦Advertisement方法完成,IntentService就會被銷燬(IntentService用於執行短任務並在完成時自毀)。

x分鐘後,報警喚醒並嘗試使用該IntentService開始......但現在你有問題的資源以停止廣告:

意圖服務不再存在,因爲它被摧毀連同它的所有資源,所以警報啓動的任務正試圖調用DeadObject,因此DeadObjectException。

+0

這個停止廣告和開始每X分鐘廣告的過程很長一段時間。如果X爲5分鐘,則停止廣告並啓動廣告,每5分鐘調用2小時,然後調用DeadObjectException。在例外之後,什麼也沒有停止,旋轉部分再次工作。 IntentService在首次啓動廣告呼叫後停止。 2小時遠遠超過IntentService運行時間。所以,死對象異常是藍牙相關的,而不是我覺得的IntentService。 –

+0

如果你提供一些代碼,它會有所幫助。 –