2016-02-26 231 views
0

我給自己買了一臺運行Android KitKat的smartwatch。 我已將它連接到使用藍牙的HTC m9智能手機。 我已經創建了一個在smartwatch(客戶端模式)和智能手機(服務器模式)上運行的應用程序。 應用程序通過藍牙套接字連接互相通話。Android藍牙喚醒設備

當我在手機上接聽電話時,我正在通過藍牙插孔向手錶發送藍牙通知並使其振動。

只要手錶的CPU處於運行狀態,所有的功能都很好。 當手表進入休眠狀態,並且我在智能手機上接到電話時,手錶不處理通知,因爲手錶的CPU處於休眠狀態。

在手錶上使用部分鎖定可以做到這一點,但它會消耗電池以加快速度。 我不需要部分鎖定電話,因爲當電話接到電話時,電話會「神奇地」喚醒,所以我的應用程序的服務能夠發送通知。

我也不能在手錶上使用AlarmManager,因爲我需要手錶在喚醒時收到藍牙套接字通知,而不是定期進行。

一個WakefullRecevier也沒有解決問題,因爲我的手錶需要先喚醒,以便WakefullReceiver將電源鎖(或者我弄錯了這個?)並運行它的代碼。

所以問題是:電話如何在來電時醒來?或收到短信?這是一個硬件的事情..中斷? 當收到藍牙訊息時有沒有什麼辦法喚醒手錶?

謝謝

回答

0

在過去的幾天,我一直在玩弄腕錶製作不同的測試。 我沒有回答原來的問題,但由於沒有人回答這個問題,我只會寫下我自己的結論,這對我的申請來說已經足夠了,也許可以幫助其他類似問題的人。

1.當配對手錶在手機的藍牙範圍內時,手錶上不需要電源鎖。 手錶發送的任何信息均由手錶接收。 如果手錶保持閒置一段時間,手機發送的第一條藍牙消息將以約1秒的延遲時間收到。可能Android手錶會進入某種低功耗模式,但可以在收到藍牙消息時運行我的代碼。當手表閒置時,藍牙信息幾乎立即由手錶接收。

2.找出藍牙套接字是否仍然連接的最佳方法是寫入它。 套接字讀取是阻止呼叫,但當手表離開藍牙範圍時,它不會丟棄IOException。我無法找到可以更改的讀取超時屬性。 因此,我只是每60秒向套接字中寫入一個字節以檢測套接字是否不再連接。插座下降檢測時間可以接受時,電池影響最小。

3.當配對手錶不在藍牙範圍內時,藍牙插座重新連接策略是必需的。 在這種情況下使用部分鎖似乎不是一個好辦法,因爲它可以讓CPU保持清醒狀態。還試圖重新連接到手機通常會導致電池死亡。

重新連接策略基於應用程序需求。 我結束了使用WakefulBroadcastReceiverAlarmManager進行套接字連接嘗試與給定的時間。

4.當手表退出藍牙範圍後,再回到範圍內,然後藍牙插座似乎會以某種'殭屍'狀態進入。有時socket.connect調用沒有成功或拋出錯誤只是阻止,其他時間socket.connect調用不會拋出錯誤,給出的連接已建立的印象,但隨後的寫入總是拋出IOException。 每當我遇到這種情況時,我只是停止/啓動似乎解決問題的藍牙適配器。

5.請注意停止/啓動藍牙適配器。在藍牙重新啓動嘗試期間,Android可以讓CPU進入睡眠狀態。我並不期待這種行爲,但確實發生了。因此,如果您希望儘可能快地完成此操作,請確保應用程序在重新嘗試期間獲取PARTIAL_WAKE_LOCK。當然,不要忘記儘快釋放鎖。