詳解Android Automotive車載應(yīng)用對駕駛模式Safe Drive Mode的適配
前言
最近在Android Automotive 上遇到的一些問題,有好幾個都跟Android 車載操作系統(tǒng)上應(yīng)用的駕駛模式有關(guān),國內(nèi)這方面的資料很少,自己在這里總結(jié)一下相關(guān)的知識,主要包含下面幾個方面:
- Android Automotive 和 Android Auto的區(qū)別
- Android Automotive 的駕駛模式介紹
- Android Automotive 實現(xiàn)駕駛模式的幾種實現(xiàn)方式和代碼示例,以及實現(xiàn)效果
主要是還是想總結(jié)一下Android 車載應(yīng)用對Automotive 駕駛模式(Drive Mode)適配的幾種方式。
開發(fā)環(huán)境
Android Studio 版本4.1.2
1. Android Automotive 和 Android Auto的區(qū)別
Android Auto:
Android Auto是一個專門為駕駛環(huán)境而設(shè)計的Android端App
- 可以用來將Android設(shè)備上的部分功能,通過數(shù)據(jù)線映射到汽車的屏幕上。當時做Android Auto主打的是安全性,為了避免用戶在駕駛過程中拿起手機,谷歌為Android Auto增加了Google Assistant,也就是在駕駛環(huán)境中使用語音交互,使得用戶可以再不改變自身物理姿勢的情況下實現(xiàn)一些手機app的操作。
- 缺點是通過數(shù)據(jù)線將手機應(yīng)用映射到車機上,應(yīng)用到底還是在手機上運行的,以手機為中心,這樣汽車本身相關(guān)數(shù)據(jù),比如車速,GPS,傳感器,行駛狀態(tài)這些數(shù)據(jù)無法同步到手機上。
Android Automotive 是可以再車載硬件上運行的操作系統(tǒng)和開源平臺
我們最常見的Android平臺試運行在手機或者平板上的,和我們常見的Android 操作系統(tǒng)相比,Android Automotive具有相同的代碼庫,而且專門增加了對汽車特定的功能和技術(shù)支撐,主要包含下面幾個方面:
- Car App:包括OEM預(yù)裝的,和第三方開發(fā)并且通過車載應(yīng)用商店下載到車機上的app
- Car API:OEM車廠提供給汽車App特有的接口,包括儀表盤相關(guān)的API,車輛硬件(座艙,通風等)的相關(guān)API,多媒體,導航,車載系統(tǒng)設(shè)置界面和車輛傳感器相關(guān)的API
- Car Service:Car Service是一個系統(tǒng)service,提供了和車相關(guān)的一系列的服務(wù)。
- Vehicle Network Service:OEM廠商的網(wǎng)絡(luò)服務(wù)
- Vehicle HAL:汽車的硬件抽象層描述
Android Auto在車機上顯示的其實是手機端的數(shù)據(jù),Android Automotive則要考慮和手機端app的數(shù)據(jù)和賬號同步的問題*
2. Android Automotive 的駕駛模式介紹
前面提到谷歌在2014年I/O 大會上推出Android Auto的初衷是更好地保障駕駛安全,Android Automotive 也增加了駕駛模式(Drive Mode),旨在幫助汽車OEM廠商從系統(tǒng)層面對有可能造成駕駛員分心的應(yīng)用進行管理。
在駕駛模式下,Android Automotive會對Driving Distraction提出一系列的建議。OEM廠商也可以要求有可能造成駕駛員分心的 Activity 或者 Fragment 界面,在Manifest File中將自己注冊成Distraction Optimized,比如需要駕駛員操作的登陸界面,掃碼界面,切換歌曲,或者視頻播放界面,游戲界面。而Android Automotive 則會在駕駛模式的時候,主動對標記為Distraction Optimized的界面進行限制。
3. Android Automotive 實現(xiàn)駕駛模式的幾種實現(xiàn)方式和代碼示例
方式一 .在Manifest文件中,使用在元數(shù)據(jù)meta-data對有可能造成分心駕駛的界面進行標記
Android Automotive 會把像下面這個使用元數(shù)據(jù)把distractionOptimized標記的活動或Fragment 標識為需要優(yōu)化的界面,并且在駕駛模式時禁用這些界面,或者在當前Activity之上,增加UI 層級更高的提示框,從而避免在駕駛過程中這些界面造成用戶分心。
<activity android:name=".QRCodeScanPage"> <meta-data android:name="distractionOptimized" android:value="true"/> </activity>
上面這段代碼,用于給用戶掃碼登陸的界面QRCodeScanPage,在駕駛狀態(tài)下會被AndroidAutomotive區(qū)別處理,OEM車廠也可以對Android Automotive進行客制化的修改,在限制界面之上增加遮蓋。
大家可以看到,這種對分心界面的處理方式簡單粗暴,直接在Manifest文件里對組件的元素增加Meta-data標簽就可以了,缺點是不夠靈活,所有的分心界面被遮蓋以后效果都一樣,而系統(tǒng)提供的統(tǒng)一遮蓋方式,為了能夠適用于各個應(yīng)用的分心界面,往往直接把整個UI界面都擋住,即使QR碼的UI很小,還是要蓋住整個屏幕,用戶體驗很不好。
方式二 .使用CarDrivingStateManager類獲取當前汽車的行駛狀態(tài),應(yīng)用獲取到行駛狀態(tài)以后自己定義分心界面的遮擋方案
Android Automotive的CarDrivingStateManager類可以根據(jù)車輛硬件抽象層(VHAL)提供的傳感器數(shù)據(jù)獲取當前汽車的行駛狀態(tài)(停車,空轉(zhuǎn),行駛),這樣應(yīng)用就可以通過下面的設(shè)置CarDrivingStateEventListener監(jiān)聽器:
導包:
import android.car.Car; /* For CarDrivingState */ import android.car.drivingstate.CarDrivingStateEvent; import android.car.drivingstate.CarDrivingStateManager;
private final CarDrivingStateManager.CarDrivingStateEventListener mDrivingStateEventListener = new CarDrivingStateManager.CarDrivingStateEventListener() { @Override public void onDrivingStateChanged(CarDrivingStateEvent event) { mDrivingStateEvent = event; handleDrivingStateChange(); } };
Android Automotive為 DrivingState定義了以下四個狀態(tài):
/** * This is when we don't have enough information to infer the car's driving state. */ public static final int DRIVING_STATE_UNKNOWN = -1; /** * Car is parked - Gear is in Parked mode. */ public static final int DRIVING_STATE_PARKED = 0; /** * Car is idling. Gear is not in Parked mode and Speed of the vehicle is zero. */ public static final int DRIVING_STATE_IDLING = 1; /** * Car is moving. Gear is not in parked mode and speed of the vehicle is non zero. */ public static final int DRIVING_STATE_MOVING = 2;
DrivingStateManager的代碼:
mDrivingStateManager = (CarDrivingStateManager) mCar.getCarManager( Car.CAR_DRIVING_STATE_SERVICE); /* Register the listener (implemented below) */ mDrivingStateManager.registerListener(mDrivingStateEventListener); /* While we wait for a change to be notified, query the current state */ mDrivingStateEvent = mDrivingStateManager.getCurrentCarDrivingState();
這樣就可以獲取當前車輛的三種行駛狀態(tài):停止,空轉(zhuǎn),駕駛,也可能會返回UNKNOWN,需要開發(fā)者處理。
另外,這里有個小竅門, 通過 CarUxRestrictions對象的isRequiresDistractionOptimization()
方法,可以直接獲取當前車輛是否處于駕駛狀態(tài),1表示車輛處于駕駛狀態(tài),0表示非駕駛狀態(tài)。
我們看到,上面的方法二可以主動查詢當前車輛的行駛狀態(tài),然后可以根據(jù)DrivingStateEventListener返回的結(jié)果決定是否展示分心界面,也可以自己寫遮蓋代碼。相比方式一,增加了很多靈活性。
方式三 .使用CarUxRestrictionsManager 并監(jiān)聽OnUxRestrictionsChangedListener
導包:
import android.car.Car; /* For CarUxRestrictions */ import android.car.drivingstate.CarUxRestrictions; import android.car.drivingstate.CarUxRestrictionsManager;
從下面的CarUxRestrictionManager可以看到,OnUxRestrictionsChangedListener 提供了駕駛模式限制狀態(tài)變化的監(jiān)聽:
@Nullable private CarUxRestrictionsManager mCarUxRestrictionsManager; private CarUxRestrictions mCurrentUxRestrictions; /* Implement the onUxRestrictionsChangedListener interface */ private CarUxRestrictionsManager.OnUxRestrictionsChangedListener mUxrChangeListener = new CarUxRestrictionsManager.OnUxRestrictionsChangedListener() { @Override public void onUxRestrictionsChanged(CarUxRestrictions carUxRestrictions) { mCurrentUxRestrictions = carUxRestrictions; /* Handle the new restrictions */ handleUxRestrictionsChanged(carUxRestrictions); } };
這個方法三主要的應(yīng)用場景是:不適于在啟動時監(jiān)聽的分心事件或者持續(xù)時間比較長的分心界面。比如長時間的視頻播放應(yīng)用等等
結(jié)語
以上介紹了Android Automotive的駕駛模式,以及實現(xiàn)的幾種方法,各個方式的優(yōu)缺點和應(yīng)用場景。明天膝蓋關(guān)節(jié)鏡手術(shù),這里網(wǎng)不好,等回去了再把代碼在Android 車載系統(tǒng)的虛擬機上實現(xiàn)出來,使用下面的ADB指令是可以模擬出當前車輛速度的,可以驗證駕駛狀態(tài)的改變,最后一個參數(shù)是速度,單位是米/秒。
adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 40
以上就是詳解Android Automotive車載應(yīng)用對駕駛模式(Safe Drive Mode)的適配的詳細內(nèi)容,更多關(guān)于Android Automotive適配駕駛模式(Safe Drive Mode)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android從系統(tǒng)Gallery獲取圖片具體實現(xiàn)
這篇文章主要介紹了Android從系統(tǒng)Gallery獲取圖片具體實現(xiàn),有需要的朋友可以參考一下2013-12-12android使用OkHttp實現(xiàn)下載的進度監(jiān)聽和斷點續(xù)傳
本篇文章主要介紹了android使用OkHttp實現(xiàn)下載的進度監(jiān)聽和斷點續(xù)傳,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-02-02Android實現(xiàn)TCP斷點上傳 后臺C#服務(wù)接收
這篇文章主要為大家詳細介紹了Android實現(xiàn)TCP斷點上傳,后臺C#服務(wù)實現(xiàn)接收,感興趣的小伙伴們可以參考一下2016-08-08超簡單Android集成華為HMS Scankit 掃碼SDK實現(xiàn)掃一掃二維碼
這篇文章主要介紹了超簡單Android集成華為HMS Scankit 掃碼SDK實現(xiàn)掃一掃二維碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-03-03詳解Android如何自定義view實現(xiàn)圓形進度條
Android中實現(xiàn)進度條有很多種方式,自定義進度條一般是繼承progressBar或繼承view來實現(xiàn)。本文將介紹通過自定義View實現(xiàn)的圓形進度條,感興趣的可以動手試一試2022-01-01Android編程使WebView支持HTML5 Video全屏播放的解決方法
這篇文章主要介紹了Android編程使WebView支持HTML5 Video全屏播放的解決方法,較為詳細的分析了全屏播放所涉及的相關(guān)技巧,并給出了完整代碼下載地址供讀者參考,需要的朋友可以參考下2015-10-10android判斷點擊位置是否在扇形區(qū)域內(nèi)
這篇文章主要為大家詳細介紹了android判斷點擊位置是否在扇形區(qū)域內(nèi),具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-05-05