Android13 使用WindowManager ActivityEmbedding平行视窗

简介

系统是由公司内部定制开发,在Android13上使用ActivityEmbedding平行视窗出现无作用,本文主要与系统沟通处理恢复使用平行视窗功能

原因分析

这里就不介绍平行视窗的功能使用了,可以参考官网的文档与demo
文档入口
官方Demo

1、定位无法使用原因

运行后查看控制台打印
在这里插入图片描述

2023-07-24 19:50:53.059 8568-8568/com.example.activityembedding D/EmbeddingBackend: No supported embedding extension found
2023-07-24 19:50:53.114 8568-8568/com.example.activityembedding D/WindowInitializer: create: splitSupportStatus = SplitSupportStatus: UNAVAILABLE

主要是这两句,可以看到提示说没有找到embedding extension扩展的库,导致无法使用
其实到这基本就定位到原因了,让系统把需要jar编译到系统内即可

2、接着定位出现这个打印的原因

SplitController

//省略..
		/**
         * Obtains an instance of [SplitController].
         *
         * @param context the [Context] to initialize the controller with
         */
        @JvmStatic
        fun getInstance(context: Context): SplitController {
            val backend = EmbeddingBackend.getInstance(context)
            return SplitController(backend)
        }
//省略..

EmbeddingBackend

//省略..
		@JvmStatic
        @RestrictTo(RestrictTo.Scope.LIBRARY)
        fun getInstance(context: Context): EmbeddingBackend {
            return decorator(ExtensionEmbeddingBackend.getInstance(context))
        }
//省略..

ExtensionEmbeddingBackend

//省略...
		fun getInstance(context: Context): EmbeddingBackend {
            if (globalInstance == null) {
                globalLock.withLock {
                    if (globalInstance == null) {
                        val applicationContext = context.applicationContext
                        val embeddingExtension = initAndVerifyEmbeddingExtension(applicationContext)
                        globalInstance = ExtensionEmbeddingBackend(
                            applicationContext,
                            embeddingExtension
                        )
                    }
                }
            }
            return globalInstance!!
        }
        
		/**
         * Loads an instance of [androidx.window.extensions.embedding.ActivityEmbeddingComponent]
         * implemented by OEM if available on this device. This also verifies if the loaded
         * implementation conforms to the declared API version.
         */
        private fun initAndVerifyEmbeddingExtension(
            applicationContext: Context
        ): EmbeddingInterfaceCompat? {
            var impl: EmbeddingInterfaceCompat? = null
            try {
                if (isExtensionVersionSupported(ExtensionsUtil.safeVendorApiLevel) &&
                    EmbeddingCompat.isEmbeddingAvailable()
                ) {
                    impl = EmbeddingBackend::class.java.classLoader?.let { loader ->
                        EmbeddingCompat(
                            EmbeddingCompat.embeddingComponent(),
                            EmbeddingAdapter(PredicateAdapter(loader)),
                            ConsumerAdapter(loader),
                            applicationContext
                        )
                    }
                    // TODO(b/190433400): Check API conformance
                }
            } catch (t: Throwable) {
                if (EmbeddingCompat.DEBUG) {
                    Log.d(TAG, "Failed to load embedding extension: $t")
                }
                impl = null
            }
            if (impl == null) {
                if (EmbeddingCompat.DEBUG) {
                    Log.d(TAG, "No supported embedding extension found")
                }
            }
            return impl
        }

//省略..

EmbeddingCompat

//省略...
		fun isEmbeddingAvailable(): Boolean {
            return try {
                EmbeddingCompat::class.java.classLoader?.let { loader ->
                    SafeActivityEmbeddingComponentProvider(
                        loader,
                        ConsumerAdapter(loader),
                        WindowExtensionsProvider.getWindowExtensions(),
                    ).activityEmbeddingComponent != null
                } ?: false
            } catch (e: NoClassDefFoundError) {
                if (DEBUG) {
                    Log.d(TAG, "Embedding extension version not found")
                }
                false
            } catch (e: UnsupportedOperationException) {
                if (DEBUG) {
                    Log.d(TAG, "Stub Extension")
                }
                false
            }
        }

//省略..

SplitController在初始化时会需loader扩展的库存不存在,不存在最后会返回No supported embedding extension found
ExtensionEmbeddingBackend EmbeddingCompat.isEmbeddingAvailable() 有做类检查,目前定位出来就是加载不到对应的jar导致返回false后无法使用平行视窗功能;

3、解决办法

系统需要编译集成的jar,可以参考下方文档
官方文档

设备上启用androidx.window.extensionsandroidx.window.sidecar包并设置persist.wm.extensions.enabled属性
系统编译是会直接编译出来androidx.window.extensionsandroidx.window.sidecar这两个jar的,让系统根据文档处理即可

系统编译集成后进入原生设置就可以看到已经是平行视窗的方式显示了

结尾

• 感谢Android Developer
• 感谢系统编译集成

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值