<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 手機(jī)與無線通信 > 設(shè)計(jì)應(yīng)用 > Beacon在可穿戴設(shè)備中的應(yīng)用:安卓藍(lán)牙第二篇

          Beacon在可穿戴設(shè)備中的應(yīng)用:安卓藍(lán)牙第二篇

          作者: 時(shí)間:2017-06-08 來源:網(wǎng)絡(luò) 收藏

          可穿戴技術(shù)正在騰飛,應(yīng)用形式日新月異,從智能手表到各式運(yùn)動手環(huán),甚至還有智能假發(fā)!而Bluetooth Smart就在這一切變革的中心。這是Android Wear操作系統(tǒng)系列文章的第二篇,將幫助開發(fā)者探索如何利用Android Wear為用戶打造最佳的“腕上體驗(yàn)”(當(dāng)然也包括耳部、頭上、脖子上佩戴的體驗(yàn))。第一篇中,小碼哥講述了打造Android Wear體驗(yàn)所涉及的標(biāo)準(zhǔn)和延展安卓通知等基礎(chǔ)問題。第二篇中小碼哥將繼續(xù)和大家討論如何創(chuàng)建在上獨(dú)立運(yùn)行的APP。

          本文引用地址:http://www.ex-cimer.com/article/201706/352592.htm

          AndroidWear APP

          你也許會想,既然拓展通知就能實(shí)現(xiàn)很多功能,為什么還要在上開發(fā)APP呢?我們不妨就從這個(gè)問題出發(fā)。通過開發(fā)AndroidWearAPP,我們可以更好地控制用戶界面,還能像智能手機(jī)一樣創(chuàng)建自定義的UI布局。此外,還能實(shí)現(xiàn)雙向設(shè)備通信,讓可穿戴設(shè)備和智能手機(jī)之間能夠相互發(fā)送信息。

          AndroidWear APP能夠脫離智能手機(jī)APP獨(dú)立運(yùn)行,但開發(fā)者需要注意第一篇中提到的智能手機(jī)和可穿戴設(shè)備的相對能力差異,利用更強(qiáng)大的智能手機(jī)處理需要多方資源支持的復(fù)雜操作。舉例來說,持續(xù)掃描就需要比較多的資源,因此小碼哥決定把這一工作交給智能手機(jī)處理。探測到后,手機(jī)會將相關(guān)的展品信息發(fā)送給智能手表上的Android Wear APP,用戶就可以在智能手表屏幕上瀏覽這些信息了。

          AndroidWear API

          GooglePlay Services 庫提供了以下主要的Android Wear API,在可穿戴博物館導(dǎo)覽APP中都有用到。

          DataApi
          這一API能夠?qū)⑺信cAndroid Wear連接的節(jié)點(diǎn)自動進(jìn)行數(shù)據(jù)同步,在博物館導(dǎo)覽APP中指的就是智能手機(jī)和智能手表之間。



          一般通過PutDataRequest類創(chuàng)建DataItem對象,制定特定路徑,以確認(rèn)通過同步過程接收的節(jié)點(diǎn)數(shù)據(jù)類型。然后只需要調(diào)用Wearable.DataApi.putDataItem,將數(shù)據(jù)交給API同步。



          節(jié)點(diǎn)使用DataListener接口,通過onDataChanged方法接收同步的數(shù)據(jù)。

          MessageApi
          MessageApi讓開發(fā)者能夠從一個(gè)節(jié)點(diǎn)向另一個(gè)節(jié)點(diǎn)發(fā)送字節(jié)數(shù)組。MessageApi的使用通常作為一種遠(yuǎn)程過程調(diào)用(Remote ProcedureCall,簡稱RPC)機(jī)制。Capability API可用來發(fā)現(xiàn)能夠理解并處理特定類型信息的節(jié)點(diǎn)。調(diào)用Wearable.MessageApi.sendMessage在藍(lán)牙連接中發(fā)送信息,實(shí)施了MessageListener 界面的接收節(jié)點(diǎn)即會通過onMessageReceived方法被調(diào)用。

          CapabilityApi
          APP中可以在名為wear.xml的源文件中注冊處理特定類型信息的功能。“功能”是由字符串值定義的,字符串值是開發(fā)者創(chuàng)建并通過Capability API引用。下圖是小編為博物館導(dǎo)覽智能手機(jī)APP創(chuàng)建的wear.xml文件。

          NodeApi
          這一API將會在可穿戴網(wǎng)絡(luò)中提供互聯(lián)節(jié)點(diǎn)訪問和相關(guān)信息。



          文章后面將提到這些API的例子。

          AndroidWear 博物館導(dǎo)覽用戶界面(User Interface, UI)

          小編需要一個(gè)和第一篇中一樣使用延展通知創(chuàng)建的多頁面、互動UI。GridViewPager類為此提供了最佳的基礎(chǔ)。當(dāng)靠近展品時(shí),一共需要展示三個(gè)頁面:應(yīng)用標(biāo)題頁、帶有“喜歡”反饋按鈕的展品名稱頁、展品信息頁。APP完成后的截屏如下圖:

          如果附近沒有,可穿戴APP就只顯示標(biāo)題頁,而無法進(jìn)入展品信息頁。如果智能手機(jī)APP探測到了附近的Beacon,則會立即向可穿戴APP發(fā)送展品照片和簡介,并展示展品信息頁。

          發(fā)送展品信息至可穿戴設(shè)備

          小編使用數(shù)據(jù)層API從智能手機(jī)向可穿戴設(shè)備傳輸展品圖像和信息。在發(fā)送端(智能手機(jī)APP),使用Asset對象形成圖像容器,再使用PutDataMapRequest項(xiàng)啟動智能手表同步。然后使用Google Play可穿戴DataApi啟動智能手表同步。這里需要注意,數(shù)據(jù)PutDataRequest中包含一個(gè)時(shí)間戳。因?yàn)镈ataApi會緩沖數(shù)據(jù),但如果較上次同步事件之后沒有變化則不需要進(jìn)行數(shù)據(jù)傳輸。

          在Android Wear APP中實(shí)施DataApi.DataListener界面,處理onDataChanged方法中的數(shù)據(jù)同步事件。

          搞定“喜歡”按鈕

          小碼哥想讓可穿戴APP在用戶按下“喜歡”按鈕之后立即通知智能手機(jī)APP,并使用Message API來完成這一步。此外,還使用Capability API來確保信息能夠選對智能手機(jī)節(jié)點(diǎn)。

          當(dāng)用戶按下“喜歡”的按鈕時(shí),會發(fā)送一個(gè)包含了路徑的信息,這個(gè)信息代表“將此事件作為“按下喜歡按鍵”處理”,同時(shí)還包含了這個(gè)展品的名稱等信息,這個(gè)信息由可穿戴APP發(fā)送到智能手機(jī)APP。

          智能手機(jī)APP中的MessageApi.MessageListener界面通過調(diào)用onMessageReceived 方法接收信息。

          總結(jié)

          今天就先跟大家分享到這里啦!可穿戴網(wǎng)絡(luò)中的Android Wear API加上Bluetooth Smart的節(jié)點(diǎn)間低功耗無線傳輸,Android Wear其樂無窮!



          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();