目錄
- 前言
- 開發環境
- 1. Android Automotive 和 Android Auto的區別
- Android Auto:
- 2. Android Automotive 的駕駛模式介紹
- 3. Android Automotive 實作駕駛模式的幾種實作方式和代碼示例
- 方式一 .在Manifest檔案中,使用在元資料meta-data對有可能造成分心駕駛的界面進行標記
- 方式二 .使用CarDrivingStateManager類獲取當前汽車的行駛狀態,應用獲取到行駛狀態以后自己定義分心界面的遮擋方案
- 方式三 .使用CarUxRestrictionsManager 并監聽OnUxRestrictionsChangedListener
- 結語
前言
最近在Android Automotive 上遇到的一些問題,有好幾個都跟Android 車載作業系統上應用的駕駛模式有關,國內這方面的資料很少,自己在這里總結一下相關的知識,主要包含下面幾個方面:
1. Android Automotive 和 Android Auto的區別
2. Android Automotive 的駕駛模式介紹
3. Android Automotive 實作駕駛模式的幾種實作方式和代碼示例,以及實作效果
主要是還是想總結一下Android 車載應用對Automotive 駕駛模式(Drive Mode)適配的幾種方式,
Enjoy !

開發環境
Android Studio 版本4.1.2
1. Android Automotive 和 Android Auto的區別
Android Auto:
- Android Auto是一個專門為駕駛環境而設計的Android端App
- 可以用來將Android設備上的部分功能,通過資料線映射到汽車的螢屏上,當時做Android Auto主打的是安全性,為了避免用戶在駕駛程序中拿起手機,谷歌為Android Auto增加了Google Assistant,也就是在駕駛環境中使用語音互動,使得用戶可以再不改變自身物理姿勢的情況下實作一些手機app的操作,
- 缺點是通過資料線將手機應用映射到車機上,應用到底還是在手機上運行的,以手機為中心,這樣汽車本身相關資料,比如車速,GPS,傳感器,行駛狀態這些資料無法同步到手機上,
- Android Automotive 是可以再車載硬體上運行的作業系統和開源平臺
我們最常見的Android平臺試運行在手機或者平板上的,和我們常見的Android 作業系統相比,Android Automotive具有相同的代碼庫,而且專門增加了對汽車特定的功能和技術支撐,主要包含下面幾個方面:
- Car App:包括OEM預裝的,和第三方開發并且通過車載應用商店下載到車機上的app
- Car API:OEM車廠提供給汽車App特有的介面,包括儀表盤相關的API,車輛硬體(座艙,通風等)的相關API,多媒體,導航,車載系統設定界面和車輛傳感器相關的API
- Car Service:Car Service是一個系統service,提供了和車相關的一系列的服務,
- Vehicle Network Service:OEM廠商的網路服務
- Vehicle HAL:汽車的硬體抽象層描述
Android Auto在車機上顯示的其實是手機端的資料,Android Automotive則要考慮和手機端app的資料和賬號同步的問題*
2. Android Automotive 的駕駛模式介紹
前面提到谷歌在2014年I/O 大會上推出Android Auto的初衷是更好地保障駕駛安全,Android Automotive 也增加了駕駛模式(Drive Mode),旨在幫助汽車OEM廠商從系統層面對有可能造成駕駛員分心的應用進行管理,
在駕駛模式下,Android Automotive會對Driving Distraction提出一系列的建議,OEM廠商也可以要求有可能造成駕駛員分心的 Activity 或者 Fragment 界面,在Manifest File中將自己注冊成Distraction Optimized,比如需要駕駛員操作的登陸界面,掃碼界面,切換歌曲,或者視頻播放界面,游戲界面,而Android Automotive 則會在駕駛模式的時候,主動對標記為Distraction Optimized的界面進行限制,
3. Android Automotive 實作駕駛模式的幾種實作方式和代碼示例
方式一 .在Manifest檔案中,使用在元資料meta-data對有可能造成分心駕駛的界面進行標記
Android Automotive 會把像下面這個使用元資料把distractionOptimized標記的活動或Fragment 標識為需要優化的界面,并且在駕駛模式時禁用這些界面,或者在當前Activity之上,增加UI 層級更高的提示框,從而避免在駕駛程序中這些界面造成用戶分心,
<activity android:name=".QRCodeScanPage">
<meta-data android:name="distractionOptimized" android:value="true"/>
</activity>
上面這段代碼,用于給用戶掃碼登陸的界面QRCodeScanPage,在駕駛狀態下會被AndroidAutomotive區別處理,OEM車廠也可以對Android Automotive進行客制化的修改,在限制界面之上增加遮蓋,
大家可以看到,這種對分心界面的處理方式簡單粗暴,直接在Manifest檔案里對組件的元素增加Meta-data標簽就可以了,缺點是不夠靈活,所有的分心界面被遮蓋以后效果都一樣,而系統提供的統一遮蓋方式,為了能夠適用于各個應用的分心界面,往往直接把整個UI界面都擋住,即使QR碼的UI很小,還是要蓋住整個螢屏,用戶體驗很不好,
方式二 .使用CarDrivingStateManager類獲取當前汽車的行駛狀態,應用獲取到行駛狀態以后自己定義分心界面的遮擋方案
Android Automotive的CarDrivingStateManager類可以根據車輛硬體抽象層(VHAL)提供的傳感器資料獲取當前汽車的行駛狀態(停車,空轉,行駛),這樣應用就可以通過下面的設定CarDrivingStateEventListener監聽器:
導包:
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定義了以下四個狀態:
/**
* 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();
這樣就可以獲取當前車輛的三種行駛狀態:停止,空轉,駕駛,也可能會回傳UNKNOWN,需要開發者處理,
另外,這里有個小竅門, 通過 CarUxRestrictions物件的isRequiresDistractionOptimization() 方法,可以直接獲取當前車輛是否處于駕駛狀態,1表示車輛處于駕駛狀態,0表示非駕駛狀態,
我們看到,上面的方法二可以主動查詢當前車輛的行駛狀態,然后可以根據DrivingStateEventListener回傳的結果決定是否展示分心界面,也可以自己寫遮蓋代碼,相比方式一,增加了很多靈活性,
方式三 .使用CarUxRestrictionsManager 并監聽OnUxRestrictionsChangedListener
導包:
import android.car.Car;
/* For CarUxRestrictions */
import android.car.drivingstate.CarUxRestrictions;
import android.car.drivingstate.CarUxRestrictionsManager;
從下面的CarUxRestrictionManager可以看到,OnUxRestrictionsChangedListener 提供了駕駛模式限制狀態變化的監聽:
@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);
}
};
這個方法三主要的應用場景是:不適于在啟動時監聽的分心事件或者持續時間比較長的分心界面,比如長時間的視頻播放應用等等
結語
以上介紹了Android Automotive的駕駛模式,以及實作的幾種方法,各個方式的優缺點和應用場景,明天膝蓋關節鏡手術,這里網不好,等回去了再把代碼在Android 車載系統的虛擬機上實作出來,使用下面的ADB指令是可以模擬出當前車輛速度的,可以驗證駕駛狀態的改變,最后一個引數是速度,單位是米/秒,
adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 40
我的GitHub地址:https://github.com/18601949127
CSDN博客:https://blog.csdn.net/weixin_37734988
Bye!

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/255264.html
標籤:其他
上一篇:貪心動規c++小入門
下一篇:基于Mac下使用c++11
