Google發(fā)布了Android Things新的Developer Preview 8版本,按照官網(wǎng)的說法,DP8已經(jīng)是發(fā)布候選版(RC版)了,DP8的Android Things支持庫代表了即將發(fā)布的1.0 stable release的最終版的API接口。在DP8之后,API將不會再有更多突破性的更改。所以如果你已經(jīng)入手Android Things,DP8是你必須要升級和關(guān)注的版本;如果你剛剛接觸Android Things或是還沒入手Android Things,那么從DP8開始也是最好的選擇。

官網(wǎng)Release Note中提到,開發(fā)Android Things DP8的APP,需要Android Studio 3.2 Canary 11以上版本,Android Studio 3.2目前還沒有release,所以要從Preview通道下載,https://developer.android.google.cn/studio/preview/,目前最新版是Android Studio 3.2 Canary 12其實Android Studio 3.0以上,就可以開發(fā)Android Things的APP了,也不是一定要升級Android Studio。(至于為什么官網(wǎng)要求用Android Studio 3.2,后文會提到。)
DP8中你需要注意的
1. IOT_LAUNCHER intent filter 改為了 android.intent.category.HOME
在之前版本中,開啟自啟動需要添加標識,IOT_LAUNCHER這個為Things定制出來的標識,從DP8開始就退出歷史舞臺了,改成了和Android統(tǒng)一的android.intent.category.HOME。

有android.intent.category.HOME標識的Activity,在Things開機后會自動啟動,關(guān)閉后會自動重啟。也就是說,有HOME標識的Activity,你將沒辦法退出它,除非用adb uninstall命令將它卸載。所以建議你在開發(fā)時不要加上HOME標識,等程序調(diào)試OK正式發(fā)布了再加上。?
2. USE_PERIPHERAL_IO權(quán)限
在之前的版本中,控制PIO是不需要申明權(quán)限的,但從DP8開始,需要在AndroidManifest.xml中申明USE_PERIPHERAL_IO權(quán)限。即增加:
<uses-permission android:name="com.google.android.things.permission.USE_PERIPHERAL_IO" />
3. 授予危險權(quán)限(動態(tài)權(quán)限)
從Android 6.0開始,Android增加了動態(tài)權(quán)限的概念,即對于一些危險的操作,會彈出對話框讓用戶確認是否授權(quán),比如訪問手機攝像頭。
Android Things是基于Android 8.1的,所以也是要申請動態(tài)權(quán)限的,然而作為一個面向設(shè)備的系統(tǒng),有時候連屏幕都沒有,是沒辦法讓用戶去操作授權(quán)的。所以在之前的Android Things版本中,重啟系統(tǒng)時,自動賦予了動態(tài)權(quán)限,這也就是之前文章中提到過的,使用攝像頭之類的例子,需要先啟動APP,然后再重啟開發(fā)板,才能獲取到權(quán)限。
這種方式確實是個不靠譜的臨時解決方案。在Android Things DP8中,對動態(tài)權(quán)限的申請,被放在了Android Things的開發(fā)控制臺中,也就是從Google服務(wù)器創(chuàng)建和上傳新的APP版本時,你需要設(shè)置授予的危險權(quán)限,具體可參見:https://developer.android.google.cn/things/console/build

前面說的是指發(fā)布階段,那么在開發(fā)階段,如何設(shè)置授予危險權(quán)限呢?
我們需要在使用adb install時,增加-g參數(shù),授予APP所有的運行時(動態(tài))權(quán)限。
具體我們開發(fā)調(diào)試APP需要怎么做呢?
首先,在Android Studio中Build APK
然后,進入生成的apk的所在文件夾,在命令行中執(zhí)行?adb install -g app-debug.apk
之后,再在Android Studio中點擊Run按鈕,APP就可以獲取到動態(tài)權(quán)限了。
如果你先在Android Studio中點擊了Run,報了沒有權(quán)限的錯誤,那么你需要用adb uninstall命令,先將APP卸載干凈,再重做前面的步驟。
以《Android Things創(chuàng)客DIY第四課-Android Things入門配件包開發(fā)案例教程-氣象站》中的例子為例:
1. 如果已經(jīng)運行過,提示沒有權(quán)限,那么執(zhí)行:adb uninstall com.sysolve.androidthings.weatherstation
2. 然后在Android Studio中Build APK,再執(zhí)行adb install -g app-debug.apk
3. 提示Success之后,再在Android Studio中點擊Run運行。
你可能會覺得,運行APP需要增加這么多步驟,非常麻煩,這就是本文開頭說到的,官方推薦安裝Android Studio 3.2 Canary 11以上版本的原因了,安裝了此版本的Android Studio,就不用自己通過adb install -g來安裝了,點擊運行按鈕Android Studio就都幫你完成了。

如上圖所示,新版的Android Studio運行時,已經(jīng)將-g參數(shù)帶上了。所以用新版的Android Studio調(diào)試,就不用關(guān)心動態(tài)權(quán)限申請的問題了。
系統(tǒng)設(shè)置新增特性
DP8的系統(tǒng)設(shè)置界面,新增了一些新特性,可以幫助開發(fā)者設(shè)置和測試開發(fā)板
1. 新增了日期/時間設(shè)置界面可以設(shè)置日期、時區(qū)、時間,也可以設(shè)置從網(wǎng)絡(luò)自動同步時間,不過在國內(nèi)好像是同步不了時間的。

2. Camera測試如果連接了攝像頭,點擊Camera標簽,即可查看攝像頭預覽,也可以看到攝像頭支持的分辨率和格式。

3. Display屬性點擊Display標簽,可以看到當前的顯示分辨率。
DP8的API新增和改變
1. 藍牙BluetoothConfigManager
在BluetoothConfigManager中,增加了對藍牙I/O能力(Bluetooth I/O capabilities)的設(shè)置(聲明)。
如何理解呢?通常,Android Things作為一個智能設(shè)備,是被用戶通過手機去配對的,所以Android Things的藍牙連接,是接收到配對請求->處理配對請求的過程。在用手機掃描藍牙設(shè)備進行配對時,通常有幾種方式:
配對方和被配對方都顯示一個代碼,用戶看看是否一致,確定要不要配對;
被配對方顯示一個密碼,配對方需要輸入這個密碼進行配對;
配對方顯示一個密碼,然后在被配對方上輸入這個密碼進行配對。
這樣作為藍牙設(shè)備被配對Android Things端,就需要向?qū)Ψ缴昝?,自己有沒有鍵盤能輸入、有沒有顯示屏能顯示,來確定采用什么方式進行藍牙配對,這個聲明就是藍牙I/O能力(Bluetooth I/O capabilities)。有以下幾個可選值:
IO_CAPABILITY_NONE: 設(shè)備既沒有顯示屏,也沒有鍵盤。(默認值)
IO_CAPABILITY_OUT: 設(shè)備只有顯示屏。
IO_CAPABILITY_IN: 設(shè)備只有鍵盤可接受用戶輸入。
IO_CAPABILITY_IO: 設(shè)備有顯示屏,并能輸入YES/ON(可用于輸入同意配對或不同意)。
IO_CAPABILITY_KBDISP: 設(shè)備有顯示屏,也有鍵盤可接受用戶輸入。
具體如何建立藍牙連接,可參見Bluetooth guide:https://developer.android.google.cn/things/sdk/apis/bluetooth
2. 重構(gòu)了InputDriver
重構(gòu)了InputDriver,以支持更靈活的輸入事件類型,具體可參見input driver guide:https://developer.android.google.cn/things/sdk/drivers/input
3. 擴展了Location驅(qū)動框架
擴展了Location驅(qū)動框架以支持眾多的GNSS接收器。之前版本中,是使用“GPS”這個名稱的,由于“GPS”特指美國的全球衛(wèi)星定位系統(tǒng),所以新版中,命名改為了“GNSS”即全球?qū)Ш叫l(wèi)星系統(tǒng)(Global Navigation Satellite System),它是泛指所有的衛(wèi)星導航系統(tǒng),如中國北斗、歐洲Galileo等。
Android Things本身并沒有內(nèi)置GNSS定位接收器,如果要在Android Things中使用定位服務(wù),通常需要連接一個串口的“GNSS”接收器,目前市面上可以買到一些北斗或GPS的定位模塊,如果是串口通訊的,且串口電平為3.3V TTL,則可以直接連接在Android Things開發(fā)板上使用。
大致的原理是:
1. 在Android Things開發(fā)板上,通過串口接收“GNSS”接收器發(fā)來的數(shù)據(jù);
2. 將數(shù)據(jù)解析成Location對象(包含經(jīng)緯度、高度、速度、時間等信息);
3. 通過com.google.android.things.userdriver.location.GnssDriver對象的reportLocation方法,把Location報告給框架;
4. 這時候,就可以通過Android標準的獲取位置信息的方法,獲取到定位信息了。
如何使用Android Things進行定位,可以參見:https://developer.android.google.cn/things/sdk/drivers/location
4. 調(diào)整了所有callback注冊相關(guān)方法的參數(shù)的順序
調(diào)整了所有callback注冊相關(guān)方法的參數(shù)的順序,簡單說就是把callback參數(shù)放到最后去了,這樣可以更好的與Kotlin互操作。
比如這個注冊串口驅(qū)動的方法:mLoopbackDevice.registerUartDeviceCallback(mInputHandler, mCallback),在之前版本中,參數(shù)順序是mCallback, mInputHandler。
5. 增加了WifiP2pManager API
增加了WifiP2pManager API,以支持對Wifi peer-to-peer的支持,也就是對Wifi對等網(wǎng)絡(luò)的支持。
這是之前我和很多開發(fā)者一直期望的一個功能。試想一下,做了一個智能設(shè)備,如果沒有屏幕,沒有鼠標或觸摸屏,如何讓設(shè)備連上家里的Wifi上網(wǎng)呢?藍牙?太多此一舉了吧。有了Wifi對等網(wǎng)絡(luò),就可以和手機建立對等網(wǎng)絡(luò)直接連接了,連上之后把家里的Wifi賬號密碼發(fā)送過去,設(shè)備就可以切換到連接家里的Wifi路由器了。
可惜的是,這個功能目前僅僅支持NXP i.MX7D,樹莓派目前并不支持。
6. 刪除了ScreenManager API
之前的版本中的ScreenManager API已被刪除,設(shè)置屏幕亮度和方向,可以使用和Android一致的API。
設(shè)置屏幕亮度使用window的screenBrightness屬性:
WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.screenBrightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_FULL;
getWindow().setAttributes(lp);
屏幕方向通過activity的screenOrientation定義進行控制:
<activity android:name="..." android:screenOrientation="portrait">
? ? ...
</activity>
具體變更內(nèi)容可參見Release Notes
Release Notes | Android Things?developer.android.google.cn
如果開發(fā)板沒有升級到DP8,代碼通過com.google.android.things:androidthings:+引用到最新版DP8的API時,可能會出現(xiàn)運行時錯誤,此時可以在build.gradle中指定版本com.google.android.things:androidthings:0.7-devpreview。推薦的方法是將開發(fā)板升級到DP8版本。
可以從以下地址下載DP8系統(tǒng)固件:
NXP iMX7D 鏈接:https://pan.baidu.com/s/1ihd7-tTM7efRGj8veqhNig?密碼:bp75
樹莓派3B 鏈接:https://pan.baidu.com/s/1o_HvFmATEX-h6h_AvoeMeg?密碼:rk6h
如何刷系統(tǒng),可參見:
歡迎關(guān)注我的 知乎Android Things專欄 和 簡書上的Android Things文集,一起交流探討新一代物聯(lián)網(wǎng)技術(shù)。
了解Android Things入門知識,可以閱讀:《Android Things入門教程》
了解Android Things所需硬件,可以閱讀:《Android Things硬件》
李雷鳴