车设接入车机云同步能力

飞书源:车设接入车机云同步能力(docx HGO2dOKtWozI1qx1dgNcNCKDn1d)。本文原为纯文档(无图片)。

相关文档

车机云同步能力接入

添加SDK:

配置权限:

<uses-permission android:name="mi.car.account.permission.SYNC_SERVICE_ACCESS"/>

具体接入 & 使用:

初始化:

通过Provider自动初始化:

  • 配置permission:

必须配置(mi.car.account.permission.SYNC_CLIENT_ACCESS)

  • 配置action:

必须配置(com.mi.car.account.sync.client)

<provider
    android:name="com.android.car.settings.account.SyncProvider"
    android:authorities="com.android.car.settings.account.sync"
    android:enabled="true"
    android:exported="true"
    android:permission="mi.car.account.permission.SYNC_CLIENT_ACCESS">
    <intent-filter>
        <action android:name="com.mi.car.account.sync.client" />
    </intent-filter>
</provider>

SyncProvider:

public class SyncProvider extends BaseSyncContentProvider {
 
    public SyncProvider() {
        super(new RecordHandlerFactory());
    }
 
    private static class RecordHandlerFactory extends RecordHandlerAbstractFactory {
        // 返回账号数据的 Handler
        public INormalRecordHandler createNormalRecordHandler(@NonNull Context context) {
            return NormalRecordHandler.getInstance();
        }
 
        // 返回个性化数据的Handler
        public IProfileRecordHandler createProfileRecordHandler(@NonNull Context context) {
            return ProfileRecordHandler.getInstance();
        }
    }
}

BaseHandler & 数据的存储格式:

// 1、账号与个性化的Handler 都继承自 IRecordHandler
public interface INormalRecordHandler : IRecordHandler
public interface IProfileRecordHandler : IRecordHandler
 
// 2、IRecordHandler
public interface IRecordHandler {
    // 返回自定义的int类型的数据key集合
    public abstract fun getRecordKeys(): Set<Int>?
 
    // 账号App主动通过这个接口获取接入方对应key的最新数据
    // 参数是key的集合
    public abstract fun onDataQuery(queryKeys: List<Int>): Set<Record>?
 
    // 当云端数据比本地数据版本更高时,通过这个接口通知接入方有新的数据
    public abstract fun onDataUpdate(records: List<Record>)
}
 
// 3、Record: 数据的交换对象
// (其实很简单,是一个保存 key - value 的对象)
public final class Record public constructor(key: Int, value: String) {
    public final val key: Int
    public final val value: String
}

例子: 账号数据Handler

public class NormalRecordHandler implements INormalRecordHandler {
    。。。
    @Override
    public Set<Integer> getRecordKeys() {
        Set<Integer> keys = new ArraySet();
        keys.add(Constants.AccountSync.ID_MODE_SORT);
        keys.add(Constants.AccountSync.ID_MODE_ONE);
        keys.add(Constants.AccountSync.ID_MODE_TWO);
        keys.add(Constants.AccountSync.ID_MODE_THREE);
        keys.add(Constants.AccountSync.ID_MODE_FOUR);
        keys.add(Constants.AccountSync.ID_MODE_FIVE);
        keys.add(Constants.AccountSync.ID_MODE_SIX);
        keys.add(Constants.AccountSync.ID_MODE_SEVEN);
        keys.add(Constants.AccountSync.ID_MODE_EIGHT);
        keys.add(Constants.AccountSync.ID_MODE_NINE);
        keys.add(Constants.AccountSync.ID_MODE_TEN);
 
        //AVM switch
        keys.add(Constants.AccountSync.ID_AVM_DELAY_CLOSE);
        keys.add(Constants.AccountSync.ID_AVM_NARROW_ROAD);
        keys.add(Constants.AccountSync.ID_AVM_BLIND_SPOT);
 
        // 运动声浪总开关
        keys.add(Constants.AccountSync.ID_DRIVING_MOTION_WAVE_SWITCH);
 
        return keys;
    }
 
    @Deprecated
    public Set<Record> onDataQuery(@NonNull List<Integer> list) {
        return null;
    }
 
    @Override
    public void onDataUpdate(@NonNull List<Record> list) {
        。。。
    }
}

数据更新后通知上传:

SyncDataManager mSyncDataManager = new SyncDataManager(
    BaseApplication.getGlobalApp().getPackageName(), BaseApplication.getGlobalApp());
 
Record record = new Record(id, value);
Set<Record> recordSet = new ArraySet();
recordSet.add(record);
mSyncDataManager.notifyNormalDataChange(recordSet);

Other:

云端数据同步的时机:

  1. 切换账号后;
  2. 再次上电;

💡 PS:账号App会保存本地缓存数据的一个版本水位,然后与云端数据的版本水位进行比较,云端的数据更新时,才会通知具体的接入方进行更新(onDataUpdate()接口)