车设接入车机云同步能力
飞书源:车设接入车机云同步能力(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:
云端数据同步的时机:
- 切换账号后;
- 再次上电;
💡 PS:账号App会保存本地缓存数据的一个版本水位,然后与云端数据的版本水位进行比较,云端的数据更新时,才会通知具体的接入方进行更新(onDataUpdate()接口)