Google發(fā)布了Android Things新的Developer Preview 8版本晰搀,按照官網(wǎng)的說(shuō)法缸托,DP8已經(jīng)是發(fā)布候選版(RC版)了拨黔,DP8的Android Things支持庫(kù)代表了即將發(fā)布的1.0 stable release的最終版的API接口始苇。在DP8之后,API將不會(huì)再有更多突破性的更改筷转。所以如果你已經(jīng)入手Android Things姑原,DP8是你必須要升級(jí)和關(guān)注的版本;如果你剛剛接觸Android Things或是還沒(méi)入手Android Things呜舒,那么從DP8開(kāi)始也是最好的選擇锭汛。
官網(wǎng)Release Note中提到,開(kāi)發(fā)Android Things DP8的APP袭蝗,需要Android Studio 3.2 Canary 11以上版本唤殴,Android Studio 3.2目前還沒(méi)有release,所以要從Preview通道下載到腥,https://developer.android.google.cn/studio/preview/朵逝,目前最新版是Android Studio 3.2 Canary 12其實(shí)Android Studio 3.0以上,就可以開(kāi)發(fā)Android Things的APP了乡范,也不是一定要升級(jí)Android Studio廉侧。(至于為什么官網(wǎng)要求用Android Studio 3.2,后文會(huì)提到篓足。)
DP8中你需要注意的
1. IOT_LAUNCHER intent filter 改為了 android.intent.category.HOME
在之前版本中段誊,開(kāi)啟自啟動(dòng)需要添加標(biāo)識(shí),IOT_LAUNCHER這個(gè)為Things定制出來(lái)的標(biāo)識(shí)栈拖,從DP8開(kāi)始就退出歷史舞臺(tái)了连舍,改成了和Android統(tǒng)一的android.intent.category.HOME。
有android.intent.category.HOME標(biāo)識(shí)的Activity涩哟,在Things開(kāi)機(jī)后會(huì)自動(dòng)啟動(dòng)索赏,關(guān)閉后會(huì)自動(dòng)重啟。也就是說(shuō)贴彼,有HOME標(biāo)識(shí)的Activity潜腻,你將沒(méi)辦法退出它,除非用adb uninstall命令將它卸載器仗。所以建議你在開(kāi)發(fā)時(shí)不要加上HOME標(biāo)識(shí)融涣,等程序調(diào)試OK正式發(fā)布了再加上童番。?
2. USE_PERIPHERAL_IO權(quán)限
在之前的版本中,控制PIO是不需要申明權(quán)限的威鹿,但從DP8開(kāi)始剃斧,需要在AndroidManifest.xml中申明USE_PERIPHERAL_IO權(quán)限。即增加:
<uses-permission android:name="com.google.android.things.permission.USE_PERIPHERAL_IO" />
3. 授予危險(xiǎn)權(quán)限(動(dòng)態(tài)權(quán)限)
從Android 6.0開(kāi)始忽你,Android增加了動(dòng)態(tài)權(quán)限的概念幼东,即對(duì)于一些危險(xiǎn)的操作,會(huì)彈出對(duì)話框讓用戶確認(rèn)是否授權(quán)科雳,比如訪問(wèn)手機(jī)攝像頭根蟹。
Android Things是基于Android 8.1的,所以也是要申請(qǐng)動(dòng)態(tài)權(quán)限的糟秘,然而作為一個(gè)面向設(shè)備的系統(tǒng)娜亿,有時(shí)候連屏幕都沒(méi)有,是沒(méi)辦法讓用戶去操作授權(quán)的蚌堵。所以在之前的Android Things版本中,重啟系統(tǒng)時(shí)沛婴,自動(dòng)賦予了動(dòng)態(tài)權(quán)限吼畏,這也就是之前文章中提到過(guò)的,使用攝像頭之類的例子嘁灯,需要先啟動(dòng)APP泻蚊,然后再重啟開(kāi)發(fā)板,才能獲取到權(quán)限丑婿。
這種方式確實(shí)是個(gè)不靠譜的臨時(shí)解決方案性雄。在Android Things DP8中,對(duì)動(dòng)態(tài)權(quán)限的申請(qǐng)羹奉,被放在了Android Things的開(kāi)發(fā)控制臺(tái)中秒旋,也就是從Google服務(wù)器創(chuàng)建和上傳新的APP版本時(shí),你需要設(shè)置授予的危險(xiǎn)權(quán)限诀拭,具體可參見(jiàn):https://developer.android.google.cn/things/console/build
前面說(shuō)的是指發(fā)布階段迁筛,那么在開(kāi)發(fā)階段,如何設(shè)置授予危險(xiǎn)權(quán)限呢耕挨?
我們需要在使用adb install時(shí)细卧,增加-g參數(shù),授予APP所有的運(yùn)行時(shí)(動(dòng)態(tài))權(quán)限筒占。
具體我們開(kāi)發(fā)調(diào)試APP需要怎么做呢贪庙?
首先,在Android Studio中Build APK
然后翰苫,進(jìn)入生成的apk的所在文件夾止邮,在命令行中執(zhí)行?adb install -g app-debug.apk
之后,再在Android Studio中點(diǎn)擊Run按鈕,APP就可以獲取到動(dòng)態(tài)權(quán)限了农尖。
如果你先在Android Studio中點(diǎn)擊了Run析恋,報(bào)了沒(méi)有權(quán)限的錯(cuò)誤,那么你需要用adb uninstall命令盛卡,先將APP卸載干凈助隧,再重做前面的步驟。
以《Android Things創(chuàng)客DIY第四課-Android Things入門配件包開(kāi)發(fā)案例教程-氣象站》中的例子為例:
1. 如果已經(jīng)運(yùn)行過(guò)滑沧,提示沒(méi)有權(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中點(diǎn)擊Run運(yùn)行哩牍。
你可能會(huì)覺(jué)得,運(yùn)行APP需要增加這么多步驟令漂,非常麻煩膝昆,這就是本文開(kāi)頭說(shuō)到的,官方推薦安裝Android Studio 3.2 Canary 11以上版本的原因了叠必,安裝了此版本的Android Studio荚孵,就不用自己通過(guò)adb install -g來(lái)安裝了,點(diǎn)擊運(yùn)行按鈕Android Studio就都幫你完成了纬朝。
如上圖所示收叶,新版的Android Studio運(yùn)行時(shí),已經(jīng)將-g參數(shù)帶上了共苛。所以用新版的Android Studio調(diào)試判没,就不用關(guān)心動(dòng)態(tài)權(quán)限申請(qǐng)的問(wèn)題了。
系統(tǒng)設(shè)置新增特性
DP8的系統(tǒng)設(shè)置界面隅茎,新增了一些新特性澄峰,可以幫助開(kāi)發(fā)者設(shè)置和測(cè)試開(kāi)發(fā)板
1. 新增了日期/時(shí)間設(shè)置界面可以設(shè)置日期、時(shí)區(qū)辟犀、時(shí)間摊阀,也可以設(shè)置從網(wǎng)絡(luò)自動(dòng)同步時(shí)間,不過(guò)在國(guó)內(nèi)好像是同步不了時(shí)間的踪蹬。
2. Camera測(cè)試如果連接了攝像頭跃捣,點(diǎn)擊Camera標(biāo)簽漱牵,即可查看攝像頭預(yù)覽,也可以看到攝像頭支持的分辨率和格式疚漆。
3. Display屬性點(diǎn)擊Display標(biāo)簽酣胀,可以看到當(dāng)前的顯示分辨率刁赦。
DP8的API新增和改變
1. 藍(lán)牙BluetoothConfigManager
在BluetoothConfigManager中,增加了對(duì)藍(lán)牙I/O能力(Bluetooth I/O capabilities)的設(shè)置(聲明)闻镶。
如何理解呢甚脉?通常,Android Things作為一個(gè)智能設(shè)備铆农,是被用戶通過(guò)手機(jī)去配對(duì)的牺氨,所以Android Things的藍(lán)牙連接,是接收到配對(duì)請(qǐng)求->處理配對(duì)請(qǐng)求的過(guò)程墩剖。在用手機(jī)掃描藍(lán)牙設(shè)備進(jìn)行配對(duì)時(shí)猴凹,通常有幾種方式:
配對(duì)方和被配對(duì)方都顯示一個(gè)代碼,用戶看看是否一致岭皂,確定要不要配對(duì)郊霎;
被配對(duì)方顯示一個(gè)密碼,配對(duì)方需要輸入這個(gè)密碼進(jìn)行配對(duì)爷绘;
配對(duì)方顯示一個(gè)密碼书劝,然后在被配對(duì)方上輸入這個(gè)密碼進(jìn)行配對(duì)。
這樣作為藍(lán)牙設(shè)備被配對(duì)Android Things端土至,就需要向?qū)Ψ缴昝鞴憾裕约河袥](méi)有鍵盤能輸入、有沒(méi)有顯示屏能顯示毙籽,來(lái)確定采用什么方式進(jìn)行藍(lán)牙配對(duì),這個(gè)聲明就是藍(lán)牙I/O能力(Bluetooth I/O capabilities)毡庆。有以下幾個(gè)可選值:
IO_CAPABILITY_NONE: 設(shè)備既沒(méi)有顯示屏坑赡,也沒(méi)有鍵盤。(默認(rèn)值)
IO_CAPABILITY_OUT: 設(shè)備只有顯示屏么抗。
IO_CAPABILITY_IN: 設(shè)備只有鍵盤可接受用戶輸入毅否。
IO_CAPABILITY_IO: 設(shè)備有顯示屏,并能輸入YES/ON(可用于輸入同意配對(duì)或不同意)蝇刀。
IO_CAPABILITY_KBDISP: 設(shè)備有顯示屏螟加,也有鍵盤可接受用戶輸入。
具體如何建立藍(lán)牙連接吞琐,可參見(jiàn)Bluetooth guide:https://developer.android.google.cn/things/sdk/apis/bluetooth
2. 重構(gòu)了InputDriver
重構(gòu)了InputDriver捆探,以支持更靈活的輸入事件類型,具體可參見(jiàn)input driver guide:https://developer.android.google.cn/things/sdk/drivers/input
3. 擴(kuò)展了Location驅(qū)動(dòng)框架
擴(kuò)展了Location驅(qū)動(dòng)框架以支持眾多的GNSS接收器站粟。之前版本中黍图,是使用“GPS”這個(gè)名稱的,由于“GPS”特指美國(guó)的全球衛(wèi)星定位系統(tǒng)奴烙,所以新版中助被,命名改為了“GNSS”即全球?qū)Ш叫l(wèi)星系統(tǒng)(Global Navigation Satellite System)剖张,它是泛指所有的衛(wèi)星導(dǎo)航系統(tǒng),如中國(guó)北斗揩环、歐洲Galileo等搔弄。
Android Things本身并沒(méi)有內(nèi)置GNSS定位接收器,如果要在Android Things中使用定位服務(wù)丰滑,通常需要連接一個(gè)串口的“GNSS”接收器顾犹,目前市面上可以買到一些北斗或GPS的定位模塊,如果是串口通訊的吨枉,且串口電平為3.3V TTL蹦渣,則可以直接連接在Android Things開(kāi)發(fā)板上使用。
大致的原理是:
1. 在Android Things開(kāi)發(fā)板上貌亭,通過(guò)串口接收“GNSS”接收器發(fā)來(lái)的數(shù)據(jù)柬唯;
2. 將數(shù)據(jù)解析成Location對(duì)象(包含經(jīng)緯度、高度圃庭、速度锄奢、時(shí)間等信息);
3. 通過(guò)com.google.android.things.userdriver.location.GnssDriver對(duì)象的reportLocation方法剧腻,把Location報(bào)告給框架拘央;
4. 這時(shí)候,就可以通過(guò)Android標(biāo)準(zhǔn)的獲取位置信息的方法书在,獲取到定位信息了灰伟。
如何使用Android Things進(jìn)行定位,可以參見(jiàn):https://developer.android.google.cn/things/sdk/drivers/location
4. 調(diào)整了所有callback注冊(cè)相關(guān)方法的參數(shù)的順序
調(diào)整了所有callback注冊(cè)相關(guān)方法的參數(shù)的順序儒旬,簡(jiǎn)單說(shuō)就是把callback參數(shù)放到最后去了栏账,這樣可以更好的與Kotlin互操作。
比如這個(gè)注冊(cè)串口驅(qū)動(dòng)的方法:mLoopbackDevice.registerUartDeviceCallback(mInputHandler, mCallback)栈源,在之前版本中挡爵,參數(shù)順序是mCallback, mInputHandler。
5. 增加了WifiP2pManager API
增加了WifiP2pManager API甚垦,以支持對(duì)Wifi peer-to-peer的支持茶鹃,也就是對(duì)Wifi對(duì)等網(wǎng)絡(luò)的支持。
這是之前我和很多開(kāi)發(fā)者一直期望的一個(gè)功能艰亮。試想一下闭翩,做了一個(gè)智能設(shè)備,如果沒(méi)有屏幕迄埃,沒(méi)有鼠標(biāo)或觸摸屏男杈,如何讓設(shè)備連上家里的Wifi上網(wǎng)呢?藍(lán)牙调俘?太多此一舉了吧伶棒。有了Wifi對(duì)等網(wǎng)絡(luò)旺垒,就可以和手機(jī)建立對(duì)等網(wǎng)絡(luò)直接連接了,連上之后把家里的Wifi賬號(hào)密碼發(fā)送過(guò)去肤无,設(shè)備就可以切換到連接家里的Wifi路由器了先蒋。
可惜的是,這個(gè)功能目前僅僅支持NXP i.MX7D宛渐,樹(shù)莓派目前并不支持竞漾。
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);
屏幕方向通過(guò)activity的screenOrientation定義進(jìn)行控制:
<activity android:name="..." android:screenOrientation="portrait">
? ? ...
</activity>
具體變更內(nèi)容可參見(jiàn)Release Notes
Release Notes | Android Things?developer.android.google.cn
如果開(kāi)發(fā)板沒(méi)有升級(jí)到DP8,代碼通過(guò)com.google.android.things:androidthings:+引用到最新版DP8的API時(shí)寇蚊,可能會(huì)出現(xiàn)運(yùn)行時(shí)錯(cuò)誤笔时,此時(shí)可以在build.gradle中指定版本com.google.android.things:androidthings:0.7-devpreview。推薦的方法是將開(kāi)發(fā)板升級(jí)到DP8版本仗岸。
可以從以下地址下載DP8系統(tǒng)固件:
NXP iMX7D 鏈接:https://pan.baidu.com/s/1ihd7-tTM7efRGj8veqhNig?密碼:bp75
樹(shù)莓派3B 鏈接:https://pan.baidu.com/s/1o_HvFmATEX-h6h_AvoeMeg?密碼:rk6h
如何刷系統(tǒng)允耿,可參見(jiàn):
歡迎關(guān)注我的 知乎Android Things專欄 和 簡(jiǎn)書上的Android Things文集,一起交流探討新一代物聯(lián)網(wǎng)技術(shù)扒怖。
了解Android Things入門知識(shí)较锡,可以閱讀:《Android Things入門教程》
了解Android Things所需硬件,可以閱讀:《Android Things硬件》
李雷鳴