Android Automotive
※Android Autoとは別物です。
公式:
https://developer.android.com/reference/android/car/classes
AutoとAutomotive
Android Autoは、一般的なAndroidアプリをAuto対応車載機で表示・操作出来るようにするものです。
いつも使っているアプリを車載機でも使えるようにしよう!といったものです。
Android Automotiveは、車載システムにHAL(Hardware Abstraction Layer)を持ち、
自動車関連のデータを収集し、Androidアプリケーションで使用することが出来るようになるものです。
環境構築
別記事予定。
車の作り方
Carクラスのstaticメソッド createCar(Context, ServiceConnection)で作ります。
This API works only for devices with PackageManager.FEATURE_AUTOMOTIVE .
PackageManager.FEATURE_AUTOMOTIVE を備えてるデバイスでしか呼び出せない。
(備えていない場合、"FEATURE_AUTOMOTIVE not declared while android.car is used"
エラーでnullが返ってくる。)
// MainActivity
...
private Car car;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
car = Car.createCar(this, new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
// ServiceとActivityの接続が確立された時の処理
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
// Serviceと切断された時の処理
}
});
}
Serviceの開始
car.connect();
で、サービスとバインドされる。
car.disconnect();
で、バインドが外れる。(Serviceも終了する。)
裏で実行されていること
// connect()でstartCarService()が呼ばれる。
private void startCarService(){
Intent intent = new Intent();
// 明示的Intent
intent.setPackage("com.android.car");
// Actionを設定
intent.setAction("android.car.ICar");
// bindService()と同様の動作。
// UserHandleはマルチユーザー環境でのユーザー判別用。
boolean bound = mContext.bindServiceAsUser(intent, mServiceConnectionListener, Context.BIND_AUTO_CREATE, UserHandle.CURRENT_OR_SELF);
// boundがtrueになるか、リトライ回数が20回に到達するまで、
// 500ms間隔でメインスレッド宛にbindServiceをリトライするRunnableをpostする。
// (コード省略)
// 接続されると...
private final ServiceConnection mServiceConnectionListener = new ServiceConnection() {
public void onServiceConnected(ConponentName name, IBinder service) {
synchronized (Car.this) {
// com.android.car.ICarImpl.java
mService = ICar.Stub.asIntergace(service);
}
// createCarする時にoverrideしたonServiceConnectedが呼ばれる。
mServiceConnectionListenerClient.onServiceConnected(name, service);
}
public void disconnect() {
// Car関連Managerの.onCarDisconnected()が呼ばれる。
tearDownCarManagers();
// アンバインド
mContext.unbindService(mServiceConnectionListener);
}
CarパッケージのService取得
Car.getCarManager(String serviceName)で、
Context.getSystemService(String serviceName)と同じように、
車固有のサービスを持ってくる。(Object型を返す為、キャストが必要)
// CarAudioManagerを取得したい場合
CarAudioManager carAudioManager = car.getCarManager(Car.AUDIO_SERVICE);
CarパッケージのService一覧
| class | Service名 | 概要 |
|---|---|---|
| CarAudioManager | AUDIO_SERVICE | 音声処理 |
| CarSensorManager | SENSOR_SERVICE | 車のセンサデータ監視(Speedなど) |
| CarInfoManager | INFO_SERVICE | 車に関する静的情報を取得(バッテリー容量、燃料容量、メーカーなど) |
| CarAppFocusManager | APP_FOCUS_SERVICE | |
| CarPackageManager | PACKAGE_SERVICE | |
| CarUxRestrictionsManager | CAR_UX_RESTRICTION_SERVICE | |
| CarConfigurationManager | CAR_CONFIGURATION_SERVICE | |
| CarNavigationStatusManager | NAVIGATION_STATUS_SERVICE |
hide指定
以下、@hide指定のService
| class | Service名 | 概要 |
|---|---|---|
| CarCabinManager | CABIN_SERVICE | |
| CarDiagnosticManager | DIAGNOSTIC_SERVICE | |
| CarHvacManager | HVAC_SERVICE | |
| CarPowerManager | POWER_SERVICE | |
| CarProjectionManager | PROJECTION_SERVICE | |
| CarPropertyManager | PROPERTY_SERVICE | |
| CarVendowExtensionManager | VENDOR_EXTENSION_SERVICE | |
| CarInstrumentClusterManager | CAR_INSTRUMENT_CLUSTER_SERVICE | |
| CarTestManager | TEST_SERVICE | |
| VmsSubscriberManager | VMS_SUBSCRIBER_SERVICE | |
| CarBluetoothManager | BLUETOOTH_SERVICE | |
| CarStorageMonitoringManager | STORAGE_MONITORING_SERVICE | |
| CarDrivingStateManager | CAR_DRIVING_STATE_SERVICE |