AndroidX Wear OS表盘无法设置自定义默认Complication数据源
自定义Wear OS表盘无法设置同应用默认Complication的问题
问题概述
我无法在同应用同包的自定义Wear OS表盘上设置自己的默认Complication。目前已通过DefaultComplicationDataSourcePolicy在ComplicationSlotManager中完成配置,备用数据源(步数计数)可正常工作,打印的ComponentName日志也无误。根据文档提示的三类可能原因,前两类已排除:
- 可手动添加Complication,排除「Complication未安装」问题
- Complication支持请求的类型,排除「Complication不支持请求类型」问题
已在Manifest中配置安全表盘相关权限,怀疑是否还有其他遗漏配置?当前使用的是新的AndroidX Wear OS库,相关文档较少,旧的android.support.wearable库方案已废弃。
1. ComplicationSlotManager配置代码(Kotlin)
sealed class ComplicationConfig(val id: Int, val supportedTypes: List<ComplicationType>) { object Left : ComplicationConfig( LEFT_COMPLICATION_ID, listOf( ComplicationType.SMALL_IMAGE, ComplicationType.SHORT_TEXT ) ) ... } // Utility function that initializes default complication slots (left and right). fun createComplicationSlotManager( context: Context, currentUserStyleRepository: CurrentUserStyleRepository, drawableId: Int = DEFAULT_COMPLICATION_STYLE_DRAWABLE_ID ): ComplicationSlotsManager { val defaultCanvasComplicationFactory = CanvasComplicationFactory { watchState, listener -> CanvasComplicationDrawable( ComplicationDrawable.getDrawable(context, drawableId)!!, watchState, listener ) } val protectionComplicationComponentName = ComponentName( context, ProtectionStatusComplicationService::class.java ) Log.d("ComplicationUtils",protectionComplicationComponentName.flattenToString()) ... val leftComplication = ComplicationSlot.createRoundRectComplicationSlotBuilder( id = ComplicationConfig.Left.id, canvasComplicationFactory = defaultCanvasComplicationFactory, supportedTypes = ComplicationConfig.Left.supportedTypes, defaultDataSourcePolicy = DefaultComplicationDataSourcePolicy( protectionComplicationComponentName, ComplicationType.SMALL_IMAGE, SystemDataSources.DATA_SOURCE_STEP_COUNT, ComplicationType.SHORT_TEXT ), bounds = ComplicationSlotBounds( RectF( LEFT_COMPLICATION_LEFT_BOUND, LEFT_AND_RIGHT_COMPLICATIONS_TOP_BOUND, LEFT_COMPLICATION_RIGHT_BOUND, LEFT_AND_RIGHT_COMPLICATIONS_BOTTOM_BOUND ) ) ).build() ... return ComplicationSlotsManager( listOf(leftComplication, rightComplication,topComplication,bottomComplication), currentUserStyleRepository ) }
2. Manifest配置代码(XML)
<!-- Required to act as a custom watch face. --> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="com.google.android.permission.PROVIDE_BACKGROUND" /> <!-- Required for complications to receive complication data and open the provider chooser. --> <uses-permission android:name="com.google.android.wearable.permission.RECEIVE_COMPLICATION_DATA" /> <uses-permission android:name="com.google.android.wearable.permission.RECEIVE_COMPLICATION_DATA_PRIVILEGED" /> ... <application ... <service android:name=".complications.ProtectionStatusComplicationService" android:exported="true" android:icon="@drawable/shield_black_24dp" android:label="Protection complication" android:permission="com.google.android.wearable.permission.BIND_COMPLICATION_PROVIDER"> <intent-filter> <action android:name="android.support.wearable.complications.ACTION_COMPLICATION_UPDATE_REQUEST" /> </intent-filter> <meta-data android:name="android.support.wearable.complications.UPDATE_PERIOD_SECONDS" android:value="300" /> <meta-data android:name="android.support.wearable.complications.SAFE_WATCH_FACES" android:value="com.waryme.wearos/com.waryme.wearos.watchface.WaryMeWatchFaceService"/> <meta-data android:name="android.support.wearable.complications.SUPPORTED_TYPES" android:value="SMALL_IMAGE" /> </service> ... </application>
已确认信息
- 步数计数作为备用数据源可正常工作
protectionComplicationComponentName.flattenToString()输出结果正确- 已通过
SAFE_WATCH_FACES元数据将表盘标记为安全表盘
内容的提问来源于stack exchange,提问作者AntoineJonard
相关产品推荐
相关产品推荐

